From e8cffbed9031f90aee0aaeee17407ea600b68c35 Mon Sep 17 00:00:00 2001 From: lecorre-m Date: Mon, 6 May 2024 12:27:18 +0200 Subject: [PATCH 1/3] rework directory and expand zips Signed-off-by: lecorre-m --- build_pcb/backside.zip | Bin 615171 -> 0 bytes build_pcb/front_integrated.zip | Bin 286794 -> 0 bytes build_pcb/front_thin_lfo.zip | Bin 476070 -> 0 bytes build_pcb/longan_adapters.zip | Bin 67068 -> 0 bytes build_pcb/middle.zip | Bin 1790352 -> 0 bytes code/script_icon.zip | Bin 1954 -> 0 bytes code/script_lut.zip | Bin 894 -> 0 bytes code/script_menu.zip | Bin 1790 -> 0 bytes code/src_generic.zip | Bin 91926 -> 0 bytes code/src_midi2cv.zip | Bin 1346262 -> 0 bytes {code => firmware}/README.md | 0 firmware/generic/src/data/font.cpp | 119 + firmware/generic/src/data/frequency.cpp | 9 + firmware/generic/src/data/images.cpp | 7 + firmware/generic/src/drivers/SysTick.cpp | 67 + firmware/generic/src/drivers/SysTick.h | 16 + firmware/generic/src/drivers/adc.cpp | 28 + firmware/generic/src/drivers/adc.h | 22 + firmware/generic/src/drivers/display.cpp | 581 + firmware/generic/src/drivers/display.h | 58 + firmware/generic/src/drivers/encoder.cpp | 51 + firmware/generic/src/drivers/encoder.h | 19 + firmware/generic/src/drivers/led.h | 73 + firmware/generic/src/drivers/scope.cpp | 46 + firmware/generic/src/drivers/scope.h | 41 + firmware/generic/src/drivers/spi.cpp | 38 + firmware/generic/src/drivers/spi.h | 11 + firmware/generic/src/drivers/timer.cpp | 97 + firmware/generic/src/drivers/timer.h | 16 + .../generic/src/drivers/usbfs/drv_usb_core.c | 319 + .../generic/src/drivers/usbfs/drv_usb_core.h | 117 + .../generic/src/drivers/usbfs/drv_usb_dev.c | 749 + .../generic/src/drivers/usbfs/drv_usb_dev.h | 217 + .../generic/src/drivers/usbfs/drv_usb_hw.h | 62 + .../generic/src/drivers/usbfs/gd32vf103_hw.c | 206 + firmware/generic/src/drivers/usbfs/midi.c | 319 + firmware/generic/src/drivers/usbfs/midi.h | 93 + .../generic/src/drivers/usbfs/midi_cdc_core.c | 430 + .../generic/src/drivers/usbfs/midi_cdc_core.h | 46 + .../generic/src/drivers/usbfs/midi_cdc_desc.c | 386 + .../generic/src/drivers/usbfs/midi_cdc_desc.h | 199 + firmware/generic/src/drivers/usbfs/midiconf.h | 37 + firmware/generic/src/drivers/usbfs/usb_conf.h | 75 + .../generic/src/drivers/usbfs/usb_midi_app.c | 98 + .../generic/src/drivers/usbfs/usb_midi_app.h | 43 + .../generic/src/drivers/usbfs/usbd_conf.h | 23 + .../generic/src/drivers/usbfs/usbd_core.c | 329 + .../generic/src/drivers/usbfs/usbd_core.h | 95 + firmware/generic/src/main.cpp | 918 + firmware/generic/src/module_adsr.cpp | 191 + firmware/generic/src/module_adsr.h | 24 + firmware/generic/src/module_delay.cpp | 31 + firmware/generic/src/module_delay.h | 20 + firmware/generic/src/module_noise.cpp | 37 + firmware/generic/src/module_noise.h | 18 + firmware/generic/src/module_vcf.cpp | 234 + firmware/generic/src/module_vcf.h | 26 + firmware/generic/src/module_vco.cpp | 206 + firmware/generic/src/module_vco.h | 31 + firmware/generic/src/workspace.code-workspace | 8 + .../gd32vf103_libopt.h | 61 + .../ADC/ADC0_ADC1_regular_parallel/main.c | 222 + .../ADC/ADC0_ADC1_regular_parallel/readme.txt | 42 + .../ADC/ADC0_ADC1_regular_parallel/systick.c | 57 + .../ADC/ADC0_ADC1_regular_parallel/systick.h | 42 + .../gd32vf103_it.c | 58 + .../gd32vf103_it.h | 45 + .../gd32vf103_libopt.h | 61 + .../main.c | 246 + .../readme.txt | 48 + .../systick.c | 57 + .../systick.h | 42 + .../gd32vf103_it.c | 55 + .../gd32vf103_it.h | 45 + .../gd32vf103_libopt.h | 61 + .../main.c | 202 + .../readme.txt | 43 + .../systick.c | 57 + .../systick.h | 42 + .../gd32vf103_libopt.h | 61 + .../main.c | 194 + .../readme.txt | 40 + .../systick.c | 57 + .../systick.h | 42 + .../gd32vf103_libopt.h | 61 + .../ADC/ADC0_regular_channel_with_DMA/main.c | 171 + .../ADC0_regular_channel_with_DMA/readme.txt | 44 + .../ADC0_regular_channel_with_DMA/systick.c | 57 + .../ADC0_regular_channel_with_DMA/systick.h | 42 + .../ADC0_temperature_Vref/gd32vf103_libopt.h | 61 + .../Examples/ADC/ADC0_temperature_Vref/main.c | 137 + .../ADC/ADC0_temperature_Vref/readme.txt | 45 + .../ADC/ADC0_temperature_Vref/systick.c | 57 + .../ADC/ADC0_temperature_Vref/systick.h | 42 + .../ADC/ADC1_analog_watchdog/gd32vf103_it.c | 54 + .../ADC/ADC1_analog_watchdog/gd32vf103_it.h | 45 + .../ADC1_analog_watchdog/gd32vf103_libopt.h | 61 + .../Examples/ADC/ADC1_analog_watchdog/main.c | 165 + .../ADC/ADC1_analog_watchdog/readme.txt | 45 + .../ADC/ADC1_analog_watchdog/systick.c | 57 + .../ADC/ADC1_analog_watchdog/systick.h | 42 + .../ADC/Oversample_shift/gd32vf103_libopt.h | 61 + .../Examples/ADC/Oversample_shift/main.c | 143 + .../Examples/ADC/Oversample_shift/readme.txt | 42 + .../Examples/ADC/Oversample_shift/systick.c | 57 + .../Examples/ADC/Oversample_shift/systick.h | 42 + .../ADC/Resolution/gd32vf103_libopt.h | 61 + .../Examples/ADC/Resolution/main.c | 140 + .../Examples/ADC/Resolution/readme.txt | 41 + .../Examples/ADC/Resolution/systick.c | 57 + .../Examples/ADC/Resolution/systick.h | 42 + .../BKP/Backup_Data/gd32vf103_libopt.h | 61 + .../Examples/BKP/Backup_Data/main.c | 148 + .../Examples/BKP/Backup_Data/readme.txt | 62 + .../Examples/BKP/Tamper/gd32vf103_it.c | 69 + .../Examples/BKP/Tamper/gd32vf103_it.h | 44 + .../Examples/BKP/Tamper/gd32vf103_libopt.h | 61 + .../Examples/BKP/Tamper/main.c | 177 + .../Examples/BKP/Tamper/readme.txt | 46 + .../CAN/communication_Loopback/gd32vf103_it.c | 96 + .../CAN/communication_Loopback/gd32vf103_it.h | 47 + .../communication_Loopback/gd32vf103_libopt.h | 61 + .../CAN/communication_Loopback/main.c | 289 + .../CAN/communication_Loopback/readme.txt | 48 + .../communication_among_CANs/gd32vf103_it.c | 76 + .../communication_among_CANs/gd32vf103_it.h | 47 + .../gd32vf103_libopt.h | 61 + .../CAN/communication_among_CANs/main.c | 301 + .../CAN/communication_among_CANs/readme.txt | 54 + .../gd32vf103_it.c | 69 + .../gd32vf103_it.h | 47 + .../gd32vf103_libopt.h | 61 + .../CAN/communication_among_Devices/main.c | 263 + .../communication_among_Devices/readme.txt | 49 + .../CRC/CRC_calculate/gd32vf103_libopt.h | 61 + .../Examples/CRC/CRC_calculate/main.c | 71 + .../Examples/CRC/CRC_calculate/readme.txt | 41 + .../DAC/DAC0_ADC_convert/gd32vf103_it.c | 54 + .../DAC/DAC0_ADC_convert/gd32vf103_it.h | 45 + .../DAC/DAC0_ADC_convert/gd32vf103_libopt.h | 61 + .../Examples/DAC/DAC0_ADC_convert/main.c | 155 + .../Examples/DAC/DAC0_ADC_convert/readme.txt | 37 + .../DAC/DAC0_DMA_convert/gd32vf103_libopt.h | 61 + .../Examples/DAC/DAC0_DMA_convert/main.c | 158 + .../Examples/DAC/DAC0_DMA_convert/readme.txt | 38 + .../DAC/DAC0_EXTI_trigger/gd32vf103_libopt.h | 61 + .../Examples/DAC/DAC0_EXTI_trigger/main.c | 126 + .../Examples/DAC/DAC0_EXTI_trigger/readme.txt | 38 + .../DAC0_LFSR_noise_mode/gd32vf103_libopt.h | 61 + .../Examples/DAC/DAC0_LFSR_noise_mode/main.c | 119 + .../DAC/DAC0_LFSR_noise_mode/readme.txt | 37 + .../gd32vf103_libopt.h | 61 + .../DAC/DAC1_triangle_noise_mode/main.c | 119 + .../DAC/DAC1_triangle_noise_mode/readme.txt | 37 + .../gd32vf103_libopt.h | 61 + .../main.c | 145 + .../readme.txt | 39 + .../DACC_output_voltage/gd32vf103_libopt.h | 61 + .../Examples/DAC/DACC_output_voltage/main.c | 106 + .../DAC/DACC_output_voltage/readme.txt | 38 + .../gd32vf103_libopt.h | 61 + .../main.c | 126 + .../readme.txt | 38 + .../gd32vf103_libopt.h | 61 + .../DACC_software_trigger_LFSR_noise/main.c | 108 + .../readme.txt | 38 + .../Examples/DBG/Timer1_stop/main.c | 137 + .../Examples/DBG/Timer1_stop/readme.txt | 51 + .../Examples/DBG/Timer1_stop/systick.c | 57 + .../Examples/DBG/Timer1_stop/systick.h | 42 + .../Examples/DMA/Flash_to_ram/gd32vf103_it.c | 51 + .../Examples/DMA/Flash_to_ram/gd32vf103_it.h | 44 + .../DMA/Flash_to_ram/gd32vf103_libopt.h | 61 + .../Examples/DMA/Flash_to_ram/main.c | 241 + .../Examples/DMA/Flash_to_ram/readme.txt | 48 + .../DMA/Ram_to_ram/gd32vf103_libopt.h | 61 + .../Examples/DMA/Ram_to_ram/main.c | 200 + .../Examples/DMA/Ram_to_ram/readme.txt | 43 + .../Examples/DMA/Ram_to_usart/gd32vf103_it.c | 51 + .../Examples/DMA/Ram_to_usart/gd32vf103_it.h | 44 + .../DMA/Ram_to_usart/gd32vf103_libopt.h | 61 + .../Examples/DMA/Ram_to_usart/main.c | 130 + .../Examples/DMA/Ram_to_usart/readme.txt | 41 + .../Examples/EXMC/LCD/exmc_lcd.c | 94 + .../Examples/EXMC/LCD/exmc_lcd.h | 41 + .../Examples/EXMC/LCD/gd32vf103_libopt.h | 61 + .../Examples/EXMC/LCD/ili9320.c | 544 + .../Examples/EXMC/LCD/ili9320.h | 233 + .../Examples/EXMC/LCD/ili9320_font.h | 711 + .../Examples/EXMC/LCD/main.c | 82 + .../Examples/EXMC/LCD/picture.c | 1466 + .../Examples/EXMC/LCD/picture.h | 44 + .../Examples/EXMC/LCD/readme.txt | 40 + .../Examples/EXMC/NOR/exmc_norflash.c | 340 + .../Examples/EXMC/NOR/exmc_norflash.h | 145 + .../Examples/EXMC/NOR/gd32vf103_libopt.h | 61 + .../Examples/EXMC/NOR/main.c | 132 + .../Examples/EXMC/NOR/readme.txt | 40 + .../Examples/EXMC/SRAM/exmc_sram.c | 239 + .../Examples/EXMC/SRAM/exmc_sram.h | 58 + .../Examples/EXMC/SRAM/gd32vf103_libopt.h | 61 + .../Examples/EXMC/SRAM/main.c | 88 + .../Examples/EXMC/SRAM/readme.txt | 41 + .../gd32vf103_it.c | 55 + .../gd32vf103_it.h | 47 + .../gd32vf103_libopt.h | 61 + .../EXTI/Key_external_interrupt_mode/main.c | 97 + .../Key_external_interrupt_mode/readme.txt | 43 + .../FMC/Erase_Program/gd32vf103_libopt.h | 61 + .../Examples/FMC/Erase_Program/main.c | 183 + .../Examples/FMC/Erase_Program/main.h | 47 + .../Examples/FMC/Erase_Program/readme.txt | 46 + .../FMC/Write_Protection/gd32vf103_libopt.h | 61 + .../Examples/FMC/Write_Protection/main.c | 158 + .../Examples/FMC/Write_Protection/readme.txt | 46 + .../Examples/FWDGT/FWDGT_key/gd32vf103_it.c | 55 + .../Examples/FWDGT/FWDGT_key/gd32vf103_it.h | 44 + .../FWDGT/FWDGT_key/gd32vf103_libopt.h | 61 + .../Examples/FWDGT/FWDGT_key/main.c | 110 + .../Examples/FWDGT/FWDGT_key/readme.txt | 48 + .../Examples/FWDGT/FWDGT_key/systick.c | 57 + .../Examples/FWDGT/FWDGT_key/systick.h | 42 + .../Keyboard_polling_mode/gd32vf103_libopt.h | 61 + .../GPIO/Keyboard_polling_mode/main.c | 75 + .../GPIO/Keyboard_polling_mode/readme.txt | 44 + .../GPIO/Keyboard_polling_mode/systick.c | 57 + .../GPIO/Keyboard_polling_mode/systick.h | 42 + .../GPIO/Running_led/gd32vf103_libopt.h | 61 + .../Examples/GPIO/Running_led/main.c | 79 + .../Examples/GPIO/Running_led/readme.txt | 40 + .../Examples/GPIO/Running_led/systick.c | 57 + .../Examples/GPIO/Running_led/systick.h | 42 + .../gd32vf103_libopt.h | 61 + .../I2C/Fast_mode_ plus_communication/main.c | 206 + .../Fast_mode_ plus_communication/readme.txt | 44 + .../I2C/Master_receiver/gd32vf103_libopt.h | 61 + .../Examples/I2C/Master_receiver/main.c | 187 + .../Examples/I2C/Master_receiver/readme.txt | 50 + .../gd32vf103_libopt.h | 61 + .../I2C/Master_receiver_one_byte/main.c | 138 + .../I2C/Master_receiver_one_byte/readme.txt | 48 + .../gd32vf103_libopt.h | 61 + .../Master_receiver_slave_transmitter/main.c | 207 + .../readme.txt | 47 + .../I2C0_IE.c | 134 + .../I2C1_IE.c | 105 + .../I2C_IE.h | 59 + .../gd32vf103_it.c | 81 + .../gd32vf103_it.h | 51 + .../gd32vf103_libopt.h | 61 + .../main.c | 205 + .../readme.txt | 49 + .../gd32vf103_libopt.h | 61 + .../I2C/Master_receiver_two_bytes/main.c | 147 + .../I2C/Master_receiver_two_bytes/readme.txt | 49 + .../I2C/Master_transmitter/gd32vf103_libopt.h | 61 + .../Examples/I2C/Master_transmitter/main.c | 143 + .../I2C/Master_transmitter/readme.txt | 48 + .../gd32vf103_libopt.h | 61 + .../Master_transmitter_slave_receiver/main.c | 191 + .../readme.txt | 48 + .../gd32vf103_libopt.h | 61 + .../main.c | 221 + .../readme.txt | 47 + .../I2C0_IE.c | 119 + .../I2C1_IE.c | 114 + .../I2C_IE.h | 60 + .../gd32vf103_it.c | 83 + .../gd32vf103_it.h | 50 + .../gd32vf103_libopt.h | 61 + .../main.c | 208 + .../readme.txt | 52 + .../I2C/Slave_receiver/gd32vf103_libopt.h | 61 + .../Examples/I2C/Slave_receiver/main.c | 145 + .../Examples/I2C/Slave_receiver/readme.txt | 49 + .../I2C/Slave_transmitter/gd32vf103_libopt.h | 61 + .../Examples/I2C/Slave_transmitter/main.c | 151 + .../Examples/I2C/Slave_transmitter/readme.txt | 52 + .../PMU/Deepsleep_wakeup_exti/gd32vf103_it.c | 62 + .../PMU/Deepsleep_wakeup_exti/gd32vf103_it.h | 46 + .../Deepsleep_wakeup_exti/gd32vf103_libopt.h | 61 + .../Examples/PMU/Deepsleep_wakeup_exti/main.c | 138 + .../Examples/PMU/Deepsleep_wakeup_exti/main.h | 41 + .../PMU/Deepsleep_wakeup_exti/readme.txt | 39 + .../PMU/Deepsleep_wakeup_exti/systick.c | 80 + .../PMU/Deepsleep_wakeup_exti/systick.h | 47 + .../PMU/Low_voltage_detector/gd32vf103_it.c | 50 + .../PMU/Low_voltage_detector/gd32vf103_it.h | 44 + .../Low_voltage_detector/gd32vf103_libopt.h | 61 + .../Examples/PMU/Low_voltage_detector/main.c | 92 + .../PMU/Low_voltage_detector/readme.txt | 40 + .../PMU/Standby_wakeup_pin/gd32vf103_libopt.h | 61 + .../Examples/PMU/Standby_wakeup_pin/main.c | 81 + .../PMU/Standby_wakeup_pin/readme.txt | 40 + .../Examples/RTC/Calendar_demo/gd32vf103_it.c | 64 + .../Examples/RTC/Calendar_demo/gd32vf103_it.h | 44 + .../RTC/Calendar_demo/gd32vf103_libopt.h | 61 + .../Examples/RTC/Calendar_demo/main.c | 156 + .../Examples/RTC/Calendar_demo/readme.txt | 44 + .../Examples/RTC/Calendar_demo/rtc.c | 205 + .../Examples/RTC/Calendar_demo/rtc.h | 49 + .../gd32vf103_libopt.h | 61 + .../main.c | 208 + .../readme.txt | 41 + .../gd32vf103_libopt.h | 61 + .../SPI_master_slave_fullduplex_dma/main.c | 255 + .../readme.txt | 43 + .../gd32vf103_libopt.h | 61 + .../main.c | 255 + .../readme.txt | 42 + .../gd32vf103_libopt.h | 61 + .../main.c | 179 + .../readme.txt | 41 + .../gd32vf103_libopt.h | 61 + .../main.c | 257 + .../readme.txt | 42 + .../gd32vf103_it.c | 78 + .../gd32vf103_it.h | 46 + .../gd32vf103_libopt.h | 61 + .../main.c | 171 + .../readme.txt | 41 + .../TIMER/TIMER0_6-steps/gd32vf103_it.c | 167 + .../TIMER/TIMER0_6-steps/gd32vf103_it.h | 45 + .../Examples/TIMER/TIMER0_6-steps/main.c | 175 + .../Examples/TIMER/TIMER0_6-steps/readme.txt | 57 + .../Examples/TIMER/TIMER0_6-steps/systick.c | 58 + .../Examples/TIMER/TIMER0_6-steps/systick.h | 45 + .../TIMER/TIMER0_complementarysignals/main.c | 147 + .../TIMER0_complementarysignals/readme.txt | 51 + .../TIMER/TIMER0_deadtime_break/main.c | 157 + .../TIMER/TIMER0_deadtime_break/readme.txt | 58 + .../Examples/TIMER/TIMER0_dma/main.c | 177 + .../Examples/TIMER/TIMER0_dma/readme.txt | 48 + .../Examples/TIMER/TIMER0_dma_burst/main.c | 210 + .../TIMER/TIMER0_dma_burst/readme.txt | 48 + .../Examples/TIMER/TIMER1_exttrigger/main.c | 142 + .../TIMER/TIMER1_exttrigger/readme.txt | 46 + .../Examples/TIMER/TIMER1_ocactive/main.c | 135 + .../Examples/TIMER/TIMER1_ocactive/readme.txt | 52 + .../TIMER/TIMER1_ocinactive/gd32vf103_it.c | 60 + .../Examples/TIMER/TIMER1_ocinactive/main.c | 152 + .../TIMER/TIMER1_ocinactive/readme.txt | 52 + .../Examples/TIMER/TIMER1_octoggle/main.c | 122 + .../Examples/TIMER/TIMER1_octoggle/readme.txt | 45 + .../Examples/TIMER/TIMER1_pwmout/main.c | 139 + .../Examples/TIMER/TIMER1_pwmout/readme.txt | 48 + .../Examples/TIMER/TIMER1_singlepulse/main.c | 147 + .../TIMER/TIMER1_singlepulse/readme.txt | 50 + .../TIMER/TIMER1_timebase/gd32vf103_it.c | 49 + .../Examples/TIMER/TIMER1_timebase/main.c | 124 + .../Examples/TIMER/TIMER1_timebase/readme.txt | 47 + .../TIMER/TIMER2_inputcapture/gd32vf103_it.c | 74 + .../Examples/TIMER/TIMER2_inputcapture/main.c | 126 + .../TIMER/TIMER2_inputcapture/readme.txt | 56 + .../TIMER2_pwminputcapture/gd32vf103_it.c | 82 + .../TIMER2_pwminputcapture/gd32vf103_it.h | 43 + .../TIMER/TIMER2_pwminputcapture/main.c | 143 + .../TIMER/TIMER2_pwminputcapture/readme.txt | 56 + .../TIMER/TIMERs_cascadesynchro/main.c | 222 + .../TIMER/TIMERs_cascadesynchro/readme.txt | 74 + .../TIMER/TIMERs_parallelsynchro/main.c | 221 + .../TIMER/TIMERs_parallelsynchro/readme.txt | 69 + .../gd32vf103_libopt.h | 61 + .../USART/DMA_transmitter&receiver/main.c | 103 + .../USART/DMA_transmitter&receiver/readme.txt | 43 + .../gd32vf103_it.c | 66 + .../gd32vf103_it.h | 46 + .../gd32vf103_libopt.h | 61 + .../DMA_transmitter&receiver_interrupt/main.c | 125 + .../readme.txt | 44 + .../gd32vf103_libopt.h | 61 + .../Half_duplex_transmitter&receiver/main.c | 179 + .../readme.txt | 43 + .../Examples/USART/Printf/gd32vf103_libopt.h | 61 + .../Examples/USART/Printf/main.c | 82 + .../Examples/USART/Printf/readme.txt | 46 + .../USART/Synchronous/gd32vf103_libopt.h | 61 + .../Examples/USART/Synchronous/main.c | 250 + .../Examples/USART/Synchronous/readme.txt | 47 + .../gd32vf103_it.c | 67 + .../gd32vf103_it.h | 44 + .../gd32vf103_libopt.h | 61 + .../Transmitter&receiver_interrupt/main.c | 79 + .../Transmitter&receiver_interrupt/readme.txt | 43 + .../Audio/Eclipse/usbd_audio/.cproject | 210 + .../Audio/Eclipse/usbd_audio/.project | 608 + .../.settings/language.settings.xml | 25 + .../USB_Device/Audio/Include/audio_core.h | 262 + .../Audio/Include/gd32vf103_audio_codec.h | 215 + .../USB_Device/Audio/Include/gd32vf103_it.h | 54 + .../Audio/Include/gd32vf103_libopt.h | 61 + .../USBFS/USB_Device/Audio/Include/usb_conf.h | 121 + .../Audio/Include/usbd_audio_out_if.h | 93 + .../USB_Device/Audio/Include/usbd_conf.h | 74 + .../USBFS/USB_Device/Audio/Source/app.c | 82 + .../USB_Device/Audio/Source/audio_core.c | 621 + .../Audio/Source/gd32vf103_audio_codec.c | 935 + .../USB_Device/Audio/Source/gd32vf103_hw.c | 206 + .../USB_Device/Audio/Source/gd32vf103_it.c | 96 + .../Audio/Source/system_gd32vf103.c | 998 + .../Audio/Source/usbd_audio_out_if.c | 288 + .../USBFS/USB_Device/Audio/readme.txt | 65 + .../CDC_ACM/Eclipse/cdc_acm/.cproject | 202 + .../CDC_ACM/Eclipse/cdc_acm/.project | 618 + .../cdc_acm/.settings/language.settings.xml | 25 + .../USB_Device/CDC_ACM/Include/cdc_acm_core.h | 133 + .../USB_Device/CDC_ACM/Include/gd32vf103_it.h | 54 + .../CDC_ACM/Include/gd32vf103_libopt.h | 61 + .../USB_Device/CDC_ACM/Include/usb_conf.h | 121 + .../USB_Device/CDC_ACM/Include/usbd_conf.h | 55 + .../USBFS/USB_Device/CDC_ACM/Source/app.c | 98 + .../USB_Device/CDC_ACM/Source/cdc_acm_core.c | 441 + .../USB_Device/CDC_ACM/Source/gd32vf103_hw.c | 206 + .../USB_Device/CDC_ACM/Source/gd32vf103_it.c | 96 + .../CDC_ACM/Source/system_gd32vf103.c | 998 + .../USBFS/USB_Device/CDC_ACM/readme.txt | 56 + .../USB_Device/DFU/Eclipse/usbd_dfu/.cproject | 202 + .../USB_Device/DFU/Eclipse/usbd_dfu/.project | 608 + .../usbd_dfu/.settings/language.settings.xml | 25 + .../USBFS/USB_Device/DFU/Include/dfu_core.h | 162 + .../USBFS/USB_Device/DFU/Include/dfu_mal.h | 78 + .../USBFS/USB_Device/DFU/Include/flash_if.h | 53 + .../USB_Device/DFU/Include/gd32vf103_it.h | 54 + .../USB_Device/DFU/Include/gd32vf103_libopt.h | 61 + .../USBFS/USB_Device/DFU/Include/usb_conf.h | 121 + .../USBFS/USB_Device/DFU/Include/usbd_conf.h | 73 + .../USBFS/USB_Device/DFU/Source/app.c | 117 + .../USBFS/USB_Device/DFU/Source/dfu_core.c | 720 + .../USBFS/USB_Device/DFU/Source/dfu_mal.c | 242 + .../USBFS/USB_Device/DFU/Source/flash_if.c | 209 + .../USB_Device/DFU/Source/gd32vf103_hw.c | 206 + .../USB_Device/DFU/Source/gd32vf103_it.c | 96 + .../USB_Device/DFU/Source/system_gd32vf103.c | 998 + .../Examples/USBFS/USB_Device/DFU/readme.txt | 58 + .../Eclipse/in_application_program/.cproject | 259 + .../Eclipse/in_application_program/.project | 588 + .../.settings/language.settings.xml | 25 + .../USB_Device/HID_IAP/Include/gd32vf103_it.h | 54 + .../HID_IAP/Include/gd32vf103_libopt.h | 61 + .../USB_Device/HID_IAP/Include/iap_core.h | 115 + .../USB_Device/HID_IAP/Include/usb_conf.h | 121 + .../USB_Device/HID_IAP/Include/usbd_conf.h | 68 + .../USBFS/USB_Device/HID_IAP/Source/app.c | 119 + .../USB_Device/HID_IAP/Source/gd32vf103_hw.c | 205 + .../USB_Device/HID_IAP/Source/gd32vf103_it.c | 96 + .../USB_Device/HID_IAP/Source/iap_core.c | 594 + .../HID_IAP/Source/system_gd32vf103.c | 998 + .../USBFS/USB_Device/HID_IAP/readme.txt | 52 + .../HID_Mouse/Eclipse/usbd_mouse/.cproject | 209 + .../HID_Mouse/Eclipse/usbd_mouse/.project | 603 + .../.settings/language.settings.xml | 25 + .../HID_Mouse/Include/gd32vf103_it.h | 63 + .../HID_Mouse/Include/gd32vf103_libopt.h | 61 + .../HID_Mouse/Include/standard_hid_core.h | 56 + .../USB_Device/HID_Mouse/Include/systick.h | 44 + .../USB_Device/HID_Mouse/Include/usb_conf.h | 121 + .../USB_Device/HID_Mouse/Include/usb_hid.h | 83 + .../USB_Device/HID_Mouse/Include/usbd_conf.h | 54 + .../USBFS/USB_Device/HID_Mouse/Source/app.c | 102 + .../HID_Mouse/Source/gd32vf103_hw.c | 207 + .../HID_Mouse/Source/gd32vf103_it.c | 205 + .../HID_Mouse/Source/standard_hid_core.c | 326 + .../HID_Mouse/Source/system_gd32vf103.c | 998 + .../USB_Device/HID_Mouse/Source/systick.c | 47 + .../USBFS/USB_Device/HID_Mouse/readme.txt | 64 + .../Eclipse/usbd_msc/.cproject | 210 + .../Eclipse/usbd_msc/.project | 653 + .../usbd_msc/.settings/language.settings.xml | 25 + .../MSC_Internal_flash/Include/flash_msd.h | 52 + .../MSC_Internal_flash/Include/gd32vf103_it.h | 54 + .../Include/gd32vf103_libopt.h | 61 + .../MSC_Internal_flash/Include/msc_bbb.h | 69 + .../MSC_Internal_flash/Include/msc_scsi.h | 117 + .../MSC_Internal_flash/Include/usb_conf.h | 121 + .../MSC_Internal_flash/Include/usb_msc.h | 66 + .../MSC_Internal_flash/Include/usbd_conf.h | 64 + .../MSC_Internal_flash/Include/usbd_msc_bbb.h | 86 + .../Include/usbd_msc_core.h | 63 + .../Include/usbd_msc_data.h | 49 + .../MSC_Internal_flash/Include/usbd_msc_mem.h | 59 + .../Include/usbd_msc_scsi.h | 53 + .../MSC_Internal_flash/Source/app.c | 73 + .../MSC_Internal_flash/Source/flash_msd.c | 112 + .../MSC_Internal_flash/Source/gd32vf103_hw.c | 204 + .../MSC_Internal_flash/Source/gd32vf103_it.c | 96 + .../Source/system_gd32vf103.c | 998 + .../MSC_Internal_flash/Source/usbd_msc_bbb.c | 275 + .../MSC_Internal_flash/Source/usbd_msc_core.c | 277 + .../MSC_Internal_flash/Source/usbd_msc_data.c | 73 + .../MSC_Internal_flash/Source/usbd_msc_scsi.c | 650 + .../Source/usbd_storage_msd.c | 224 + .../USB_Device/MSC_Internal_flash/readme.txt | 62 + .../HID_Host/Eclipse/usbh_hid/.cproject | 210 + .../HID_Host/Eclipse/usbh_hid/.project | 678 + .../usbh_hid/.settings/language.settings.xml | 25 + .../USB_Host/HID_Host/Include/gd32vf103_it.h | 46 + .../HID_Host/Include/gd32vf103_libopt.h | 61 + .../USB_Host/HID_Host/Include/lcd_font.h | 44 + .../USBFS/USB_Host/HID_Host/Include/lcd_log.h | 52 + .../USB_Host/HID_Host/Include/usb_conf.h | 93 + .../USBFS/USB_Host/HID_Host/Include/usb_hid.h | 83 + .../USB_Host/HID_Host/Include/usbh_conf.h | 42 + .../USB_Host/HID_Host/Include/usbh_hid_core.h | 126 + .../HID_Host/Include/usbh_hid_keybd.h | 63 + .../HID_Host/Include/usbh_hid_mouse.h | 79 + .../USB_Host/HID_Host/Include/usbh_usr.h | 83 + .../USBFS/USB_Host/HID_Host/Source/app.c | 79 + .../USB_Host/HID_Host/Source/gd32vf103_it.c | 63 + .../HID_Host/Source/gd32vf103_usb_hw.c | 259 + .../USBFS/USB_Host/HID_Host/Source/lcd_font.c | 711 + .../USBFS/USB_Host/HID_Host/Source/lcd_log.c | 168 + .../HID_Host/Source/system_gd32vf103.c | 998 + .../USB_Host/HID_Host/Source/usbh_hid_core.c | 492 + .../USB_Host/HID_Host/Source/usbh_hid_keybd.c | 250 + .../USB_Host/HID_Host/Source/usbh_hid_mouse.c | 181 + .../USBFS/USB_Host/HID_Host/Source/usbh_usr.c | 527 + .../USBFS/USB_Host/HID_Host/readme.txt | 53 + .../MSC_Host/Eclipse/usbh_msc/.cproject | 209 + .../MSC_Host/Eclipse/usbh_msc/.project | 728 + .../usbh_msc/.settings/language.settings.xml | 25 + .../USBFS/USB_Host/MSC_Host/Include/diskio.h | 68 + .../USBFS/USB_Host/MSC_Host/Include/fattime.h | 7 + .../USBFS/USB_Host/MSC_Host/Include/ff.h | 596 + .../USBFS/USB_Host/MSC_Host/Include/ffconf.h | 166 + .../USB_Host/MSC_Host/Include/gd32vf103_it.h | 46 + .../MSC_Host/Include/gd32vf103_libopt.h | 61 + .../USBFS/USB_Host/MSC_Host/Include/integer.h | 46 + .../USB_Host/MSC_Host/Include/lcd_font.h | 45 + .../USBFS/USB_Host/MSC_Host/Include/lcd_log.h | 52 + .../USBFS/USB_Host/MSC_Host/Include/msc_bbb.h | 69 + .../USB_Host/MSC_Host/Include/msc_scsi.h | 117 + .../USB_Host/MSC_Host/Include/usb_conf.h | 92 + .../USBFS/USB_Host/MSC_Host/Include/usb_msc.h | 66 + .../USB_Host/MSC_Host/Include/usbh_conf.h | 42 + .../USB_Host/MSC_Host/Include/usbh_msc_bbb.h | 127 + .../USB_Host/MSC_Host/Include/usbh_msc_core.h | 58 + .../USB_Host/MSC_Host/Include/usbh_msc_scsi.h | 91 + .../USB_Host/MSC_Host/Include/usbh_usr.h | 94 + .../USBFS/USB_Host/MSC_Host/Source/app.c | 78 + .../USBFS/USB_Host/MSC_Host/Source/fattime.c | 11 + .../USBFS/USB_Host/MSC_Host/Source/ff.c | 3152 ++ .../USB_Host/MSC_Host/Source/gd32vf103_it.c | 63 + .../MSC_Host/Source/gd32vf103_usb_hw.c | 256 + .../USBFS/USB_Host/MSC_Host/Source/lcd_font.c | 709 + .../USBFS/USB_Host/MSC_Host/Source/lcd_log.c | 168 + .../MSC_Host/Source/system_gd32vf103.c | 998 + .../USB_Host/MSC_Host/Source/usbh_msc_bbb.c | 454 + .../USB_Host/MSC_Host/Source/usbh_msc_core.c | 367 + .../USB_Host/MSC_Host/Source/usbh_msc_fatfs.c | 222 + .../USB_Host/MSC_Host/Source/usbh_msc_scsi.c | 488 + .../USBFS/USB_Host/MSC_Host/Source/usbh_usr.c | 595 + .../USBFS/USB_Host/MSC_Host/readme.txt | 43 + .../WWDGT/WWDGT_delay_feed/gd32vf103_libopt.h | 61 + .../Examples/WWDGT/WWDGT_delay_feed/main.c | 90 + .../WWDGT/WWDGT_delay_feed/readme.txt | 47 + .../Examples/WWDGT/WWDGT_delay_feed/systick.c | 57 + .../Examples/WWDGT/WWDGT_delay_feed/systick.h | 42 + .../Include/gd32vf103_adc.h | 396 + .../Include/gd32vf103_bkp.h | 227 + .../Include/gd32vf103_can.h | 717 + .../Include/gd32vf103_crc.h | 78 + .../Include/gd32vf103_dac.h | 242 + .../Include/gd32vf103_dbg.h | 109 + .../Include/gd32vf103_dma.h | 282 + .../Include/gd32vf103_eclic.h | 66 + .../Include/gd32vf103_exmc.h | 126 + .../Include/gd32vf103_exti.h | 245 + .../Include/gd32vf103_fmc.h | 312 + .../Include/gd32vf103_fwdgt.h | 104 + .../Include/gd32vf103_gpio.h | 421 + .../Include/gd32vf103_i2c.h | 343 + .../Include/gd32vf103_pmu.h | 125 + .../Include/gd32vf103_rcu.h | 720 + .../Include/gd32vf103_rtc.h | 148 + .../Include/gd32vf103_spi.h | 341 + .../Include/gd32vf103_timer.h | 722 + .../Include/gd32vf103_usart.h | 375 + .../Include/gd32vf103_wwdgt.h | 86 + .../Source/gd32vf103_adc.c | 992 + .../Source/gd32vf103_bkp.c | 292 + .../Source/gd32vf103_can.c | 989 + .../Source/gd32vf103_crc.c | 127 + .../Source/gd32vf103_dac.c | 537 + .../Source/gd32vf103_dbg.c | 110 + .../Source/gd32vf103_dma.c | 731 + .../Source/gd32vf103_eclic.c | 128 + .../Source/gd32vf103_exmc.c | 164 + .../Source/gd32vf103_exti.c | 254 + .../Source/gd32vf103_fmc.c | 651 + .../Source/gd32vf103_fwdgt.c | 151 + .../Source/gd32vf103_gpio.c | 502 + .../Source/gd32vf103_i2c.c | 730 + .../Source/gd32vf103_pmu.c | 270 + .../Source/gd32vf103_rcu.c | 1111 + .../Source/gd32vf103_rtc.c | 273 + .../Source/gd32vf103_spi.c | 766 + .../Source/gd32vf103_timer.c | 1966 ++ .../Source/gd32vf103_usart.c | 765 + .../Source/gd32vf103_wwdgt.c | 146 + .../GD32VF103_standard_peripheral/gd32vf103.h | 241 + .../system_gd32vf103.c | 999 + .../system_gd32vf103.h | 60 + .../Include/drv_usb_core.h | 117 + .../Include/drv_usb_dev.h | 217 + .../Include/drv_usb_host.h | 175 + .../Include/drv_usb_hw.h | 62 + .../Include/drv_usb_regs.h | 666 + .../Include/drv_usbd_int.h | 52 + .../Include/drv_usbh_int.h | 49 + .../Include/usb_ch9_std.h | 237 + .../Include/usbd_core.h | 95 + .../Include/usbd_enum.h | 114 + .../Include/usbd_transc.h | 64 + .../Include/usbh_core.h | 219 + .../Include/usbh_enum.h | 78 + .../Include/usbh_pipe.h | 70 + .../Include/usbh_transc.h | 54 + .../Source/drv_usb_core.c | 319 + .../Source/drv_usb_dev.c | 749 + .../Source/drv_usb_host.c | 514 + .../Source/drv_usbd_int.c | 595 + .../Source/drv_usbh_int.c | 536 + .../GD32VF103_usbfs_driver/Source/usbd_core.c | 329 + .../GD32VF103_usbfs_driver/Source/usbd_enum.c | 696 + .../Source/usbd_transc.c | 254 + .../GD32VF103_usbfs_driver/Source/usbh_core.c | 441 + .../GD32VF103_usbfs_driver/Source/usbh_enum.c | 549 + .../GD32VF103_usbfs_driver/Source/usbh_pipe.c | 174 + .../Source/usbh_transc.c | 391 + .../Firmware/RISCV/drivers/n200_eclic.h | 48 + .../Firmware/RISCV/drivers/n200_func.c | 398 + .../Firmware/RISCV/drivers/n200_func.h | 109 + .../Firmware/RISCV/drivers/n200_timer.h | 18 + .../Firmware/RISCV/drivers/riscv_bits.h | 36 + .../Firmware/RISCV/drivers/riscv_const.h | 18 + .../Firmware/RISCV/drivers/riscv_encoding.h | 1368 + .../RISCV/env_Eclipse/GD32VF103x4.lds | 175 + .../RISCV/env_Eclipse/GD32VF103x6.lds | 175 + .../RISCV/env_Eclipse/GD32VF103x8.lds | 175 + .../RISCV/env_Eclipse/GD32VF103xB.lds | 175 + .../Firmware/RISCV/env_Eclipse/entry.S | 286 + .../Firmware/RISCV/env_Eclipse/handlers.c | 32 + .../Firmware/RISCV/env_Eclipse/init.c | 34 + .../Firmware/RISCV/env_Eclipse/start.S | 258 + .../Firmware/RISCV/env_Eclipse/your_printf.c | 5 + .../Firmware/RISCV/stubs/_exit.c | 17 + .../Firmware/RISCV/stubs/close.c | 9 + .../Firmware/RISCV/stubs/fstat.c | 16 + .../Firmware/RISCV/stubs/isatty.c | 11 + .../Firmware/RISCV/stubs/lseek.c | 14 + .../Firmware/RISCV/stubs/read.c | 13 + .../Firmware/RISCV/stubs/sbrk.c | 16 + .../Firmware/RISCV/stubs/stub.h | 16 + .../Firmware/RISCV/stubs/write.c | 47 + .../Firmware/RISCV/stubs/write_hex.c | 18 + .../Template/eclipse/.cproject | 700 + .../Template/eclipse/.project | 333 + .../eclipse/.settings/language.settings.xml | 47 + .../org.eclipse.cdt.codan.core.prefs | 73 + .../.settings/org.eclipse.cdt.core.prefs | 9 + .../Template/gd32vf103_libopt.h | 61 + .../Template/main.c | 71 + .../Template/main.h | 41 + .../Template/readme.txt | 40 + .../Template/systick.c | 57 + .../Template/systick.h | 42 + .../Utilities/LCD_common/lcd_font.c | 711 + .../Utilities/LCD_common/lcd_font.h | 45 + .../Utilities/gd32vf103v_eval.c | 247 + .../Utilities/gd32vf103v_eval.h | 168 + .../Utilities/gd32vf103v_lcd_eval.c | 607 + .../Utilities/gd32vf103v_lcd_eval.h | 237 + firmware/midi2cv/src/drivers/usbfs/midi.c | 319 + firmware/midi2cv/src/drivers/usbfs/midi.h | 93 + .../midi2cv/src/drivers/usbfs/midi_cdc_core.c | 430 + .../midi2cv/src/drivers/usbfs/midi_cdc_core.h | 46 + .../midi2cv/src/drivers/usbfs/midi_cdc_desc.c | 386 + .../midi2cv/src/drivers/usbfs/midi_cdc_desc.h | 199 + firmware/midi2cv/src/drivers/usbfs/midiconf.h | 37 + firmware/midi2cv/src/drivers/usbfs/usb_conf.h | 75 + .../midi2cv/src/drivers/usbfs/usb_midi_app.c | 98 + .../midi2cv/src/drivers/usbfs/usb_midi_app.h | 43 + .../midi2cv/src/drivers/usbfs/usbd_conf.h | 23 + .../midi2cv/src/drivers/usbfs/usbd_core.c | 329 + .../midi2cv/src/drivers/usbfs/usbd_core.h | 95 + firmware/midi2cv/src/gd32vf103.h | 241 + firmware/midi2cv/src/main.c | 159 + firmware/midi2cv/src/system_gd32vf103.h | 60 + firmware/tools/generateLUT.py | 70 + firmware/tools/generateMenu.py | 106 + firmware/tools/img.py | 102 + firmware/tools/in.png | Bin 0 -> 741 bytes firmware/tools/menu.txt | 63 + .../3Dpcb}/3dpcb_bottom.stl | Bin .../3Dpcb}/3dpcb_bottom.stp | 0 {build_3dpcb => hardware/3Dpcb}/3dpcb_mid.stl | Bin {build_3dpcb => hardware/3Dpcb}/3dpcb_mid.stp | 0 {build_3dpcb => hardware/3Dpcb}/3dpcb_top.stl | Bin {build_3dpcb => hardware/3Dpcb}/3dpcb_top.stp | 0 {build_3dpcb => hardware/3Dpcb}/README.md | 0 hardware/pcb/3D-print/backside.stl | Bin 0 -> 2835784 bytes hardware/pcb/3D-print/front-integrated1.stl | Bin 0 -> 423784 bytes hardware/pcb/3D-print/front-integrated2.stl | Bin 0 -> 974684 bytes hardware/pcb/3D-print/front-lfo1.stl | Bin 0 -> 632284 bytes hardware/pcb/3D-print/front-lfo2.stl | Bin 0 -> 1317584 bytes hardware/pcb/3D-print/longanAdapter10.stl | Bin 0 -> 25384 bytes hardware/pcb/3D-print/longanAdapter11.stl | Bin 0 -> 37184 bytes hardware/pcb/3D-print/middle.stl | Bin 0 -> 6577484 bytes .../pcb/3D-print}/pcb_tft_support.stl | Bin hardware/pcb/3D-src/backside.stp | 16032 ++++++++++ hardware/pcb/3D-src/front-integrated.stp | 8511 ++++++ hardware/pcb/3D-src/front-lfo.stp | 18503 ++++++++++++ hardware/pcb/3D-src/longanAdapter10.stp | 2517 ++ hardware/pcb/3D-src/longanAdapter11.stp | 2516 ++ hardware/pcb/3D-src/middle.stp | 24705 ++++++++++++++++ .../pcb/3D-src}/pcb_tft_support.stp | 0 {build_pcb => hardware/pcb}/README.md | 0 .../faceplate_gerber_leet_single_panel.zip | Bin .../pcb}/longan_adapters.jpg | Bin .../pcb/pcb_front_gerber_top.zip | Bin .../pcb/pcb_mcu_gerber_bottom.zip | Bin 721 files changed, 186237 insertions(+) delete mode 100644 build_pcb/backside.zip delete mode 100644 build_pcb/front_integrated.zip delete mode 100644 build_pcb/front_thin_lfo.zip delete mode 100644 build_pcb/longan_adapters.zip delete mode 100644 build_pcb/middle.zip delete mode 100644 code/script_icon.zip delete mode 100644 code/script_lut.zip delete mode 100644 code/script_menu.zip delete mode 100644 code/src_generic.zip delete mode 100644 code/src_midi2cv.zip rename {code => firmware}/README.md (100%) create mode 100644 firmware/generic/src/data/font.cpp create mode 100644 firmware/generic/src/data/frequency.cpp create mode 100644 firmware/generic/src/data/images.cpp create mode 100644 firmware/generic/src/drivers/SysTick.cpp create mode 100644 firmware/generic/src/drivers/SysTick.h create mode 100644 firmware/generic/src/drivers/adc.cpp create mode 100644 firmware/generic/src/drivers/adc.h create mode 100644 firmware/generic/src/drivers/display.cpp create mode 100644 firmware/generic/src/drivers/display.h create mode 100644 firmware/generic/src/drivers/encoder.cpp create mode 100644 firmware/generic/src/drivers/encoder.h create mode 100644 firmware/generic/src/drivers/led.h create mode 100644 firmware/generic/src/drivers/scope.cpp create mode 100644 firmware/generic/src/drivers/scope.h create mode 100644 firmware/generic/src/drivers/spi.cpp create mode 100644 firmware/generic/src/drivers/spi.h create mode 100644 firmware/generic/src/drivers/timer.cpp create mode 100644 firmware/generic/src/drivers/timer.h create mode 100644 firmware/generic/src/drivers/usbfs/drv_usb_core.c create mode 100644 firmware/generic/src/drivers/usbfs/drv_usb_core.h create mode 100644 firmware/generic/src/drivers/usbfs/drv_usb_dev.c create mode 100644 firmware/generic/src/drivers/usbfs/drv_usb_dev.h create mode 100644 firmware/generic/src/drivers/usbfs/drv_usb_hw.h create mode 100644 firmware/generic/src/drivers/usbfs/gd32vf103_hw.c create mode 100644 firmware/generic/src/drivers/usbfs/midi.c create mode 100644 firmware/generic/src/drivers/usbfs/midi.h create mode 100644 firmware/generic/src/drivers/usbfs/midi_cdc_core.c create mode 100644 firmware/generic/src/drivers/usbfs/midi_cdc_core.h create mode 100644 firmware/generic/src/drivers/usbfs/midi_cdc_desc.c create mode 100644 firmware/generic/src/drivers/usbfs/midi_cdc_desc.h create mode 100644 firmware/generic/src/drivers/usbfs/midiconf.h create mode 100644 firmware/generic/src/drivers/usbfs/usb_conf.h create mode 100644 firmware/generic/src/drivers/usbfs/usb_midi_app.c create mode 100644 firmware/generic/src/drivers/usbfs/usb_midi_app.h create mode 100644 firmware/generic/src/drivers/usbfs/usbd_conf.h create mode 100644 firmware/generic/src/drivers/usbfs/usbd_core.c create mode 100644 firmware/generic/src/drivers/usbfs/usbd_core.h create mode 100644 firmware/generic/src/main.cpp create mode 100644 firmware/generic/src/module_adsr.cpp create mode 100644 firmware/generic/src/module_adsr.h create mode 100644 firmware/generic/src/module_delay.cpp create mode 100644 firmware/generic/src/module_delay.h create mode 100644 firmware/generic/src/module_noise.cpp create mode 100644 firmware/generic/src/module_noise.h create mode 100644 firmware/generic/src/module_vcf.cpp create mode 100644 firmware/generic/src/module_vcf.h create mode 100644 firmware/generic/src/module_vco.cpp create mode 100644 firmware/generic/src/module_vco.h create mode 100644 firmware/generic/src/workspace.code-workspace create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Backup_Data/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Backup_Data/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Backup_Data/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CRC/CRC_calculate/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CRC/CRC_calculate/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CRC/CRC_calculate/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_DMA_convert/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_DMA_convert/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_DMA_convert/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_EXTI_trigger/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_EXTI_trigger/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_EXTI_trigger/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_LFSR_noise_mode/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_LFSR_noise_mode/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_LFSR_noise_mode/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC1_triangle_noise_mode/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC1_triangle_noise_mode/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC1_triangle_noise_mode/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_independent_trigger_LFSR_noise/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_independent_trigger_LFSR_noise/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_independent_trigger_LFSR_noise/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_output_voltage/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_output_voltage/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_output_voltage/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_simultaneous_trigger_triangle_noise/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_simultaneous_trigger_triangle_noise/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_simultaneous_trigger_triangle_noise/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_software_trigger_LFSR_noise/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_software_trigger_LFSR_noise/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_software_trigger_LFSR_noise/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_ram/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_ram/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_ram/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/exmc_lcd.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/exmc_lcd.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/ili9320.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/ili9320.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/ili9320_font.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/picture.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/picture.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/exmc_norflash.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/exmc_norflash.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/exmc_sram.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/exmc_sram.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/main.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Write_Protection/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Write_Protection/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Write_Protection/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Fast_mode_ plus_communication/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Fast_mode_ plus_communication/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Fast_mode_ plus_communication/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_one_byte/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_one_byte/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_one_byte/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/I2C0_IE.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/I2C1_IE.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/I2C_IE.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_two_bytes/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_two_bytes/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_two_bytes/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_dma/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_dma/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_dma/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/I2C0_IE.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/I2C1_IE.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/I2C_IE.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_receiver/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_receiver/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_receiver/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_transmitter/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_transmitter/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_transmitter/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/main.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Standby_wakeup_pin/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Standby_wakeup_pin/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Standby_wakeup_pin/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/rtc.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/rtc.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/I2S_master_transmit_slave_receive_dma/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/I2S_master_transmit_slave_receive_dma/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/I2S_master_transmit_slave_receive_dma/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_dma/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_dma/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_dma/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_nssp_mode/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_nssp_mode/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_nssp_mode/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_polling/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_polling/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_polling/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_ti_mode/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_ti_mode/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_ti_mode/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_complementarysignals/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_complementarysignals/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_deadtime_break/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_deadtime_break/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma_burst/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma_burst/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_exttrigger/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_exttrigger/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocactive/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocactive/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocinactive/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocinactive/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocinactive/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_octoggle/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_octoggle/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_pwmout/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_pwmout/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_singlepulse/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_singlepulse/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_timebase/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_timebase/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_timebase/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_inputcapture/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_inputcapture/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_inputcapture/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_cascadesynchro/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_cascadesynchro/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_parallelsynchro/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_parallelsynchro/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Half_duplex_transmitter&receiver/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Half_duplex_transmitter&receiver/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Half_duplex_transmitter&receiver/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Printf/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Printf/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Printf/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Synchronous/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Synchronous/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Synchronous/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Eclipse/usbd_audio/.cproject create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Eclipse/usbd_audio/.project create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Eclipse/usbd_audio/.settings/language.settings.xml create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/audio_core.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/gd32vf103_audio_codec.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/usb_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/usbd_audio_out_if.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/usbd_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/app.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/audio_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/gd32vf103_audio_codec.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/gd32vf103_hw.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/system_gd32vf103.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/usbd_audio_out_if.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Eclipse/cdc_acm/.cproject create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Eclipse/cdc_acm/.project create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Eclipse/cdc_acm/.settings/language.settings.xml create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/cdc_acm_core.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/usb_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/usbd_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/app.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/cdc_acm_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/gd32vf103_hw.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/system_gd32vf103.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Eclipse/usbd_dfu/.cproject create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Eclipse/usbd_dfu/.project create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Eclipse/usbd_dfu/.settings/language.settings.xml create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/dfu_core.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/dfu_mal.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/flash_if.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/usb_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/usbd_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/app.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/dfu_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/dfu_mal.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/flash_if.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/gd32vf103_hw.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/system_gd32vf103.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Eclipse/in_application_program/.cproject create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Eclipse/in_application_program/.project create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Eclipse/in_application_program/.settings/language.settings.xml create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/iap_core.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/usb_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/usbd_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/app.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/gd32vf103_hw.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/iap_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/system_gd32vf103.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Eclipse/usbd_mouse/.cproject create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Eclipse/usbd_mouse/.project create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Eclipse/usbd_mouse/.settings/language.settings.xml create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/standard_hid_core.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/usb_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/usb_hid.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/usbd_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/app.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/gd32vf103_hw.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/standard_hid_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/system_gd32vf103.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Eclipse/usbd_msc/.cproject create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Eclipse/usbd_msc/.project create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Eclipse/usbd_msc/.settings/language.settings.xml create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/flash_msd.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/msc_bbb.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/msc_scsi.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usb_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usb_msc.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_bbb.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_core.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_data.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_mem.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_scsi.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/app.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/flash_msd.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/gd32vf103_hw.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/system_gd32vf103.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_bbb.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_data.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_scsi.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_storage_msd.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Eclipse/usbh_hid/.cproject create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Eclipse/usbh_hid/.project create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Eclipse/usbh_hid/.settings/language.settings.xml create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/lcd_font.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/lcd_log.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usb_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usb_hid.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_core.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_keybd.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_mouse.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_usr.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/app.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/gd32vf103_usb_hw.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/lcd_font.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/lcd_log.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/system_gd32vf103.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_keybd.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_mouse.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_usr.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Eclipse/usbh_msc/.cproject create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Eclipse/usbh_msc/.project create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Eclipse/usbh_msc/.settings/language.settings.xml create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/diskio.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/fattime.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/ff.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/ffconf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/gd32vf103_it.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/integer.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/lcd_font.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/lcd_log.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/msc_bbb.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/msc_scsi.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usb_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usb_msc.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_bbb.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_core.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_scsi.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_usr.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/app.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/fattime.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/ff.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/gd32vf103_it.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/gd32vf103_usb_hw.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/lcd_font.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/lcd_log.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/system_gd32vf103.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_bbb.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_fatfs.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_scsi.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_usr.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/gd32vf103.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_host.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usbh_int.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_core.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_enum.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_pipe.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_transc.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_host.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usbh_int.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_enum.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_pipe.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_transc.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_eclic.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_func.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_func.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_timer.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/riscv_bits.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/riscv_const.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/riscv_encoding.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103x4.lds create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103x6.lds create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103x8.lds create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/entry.S create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/handlers.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/init.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/start.S create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/your_printf.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/_exit.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/close.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/fstat.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/isatty.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/lseek.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/read.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/sbrk.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/stub.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/write.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/write_hex.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.cproject create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.project create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.settings/language.settings.xml create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.settings/org.eclipse.cdt.codan.core.prefs create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.settings/org.eclipse.cdt.core.prefs create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/gd32vf103_libopt.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/main.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/main.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/readme.txt create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/systick.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/systick.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/LCD_common/lcd_font.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/LCD_common/lcd_font.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_eval.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_eval.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_lcd_eval.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_lcd_eval.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/midi.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/midi.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/midi_cdc_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/midi_cdc_core.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/midi_cdc_desc.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/midi_cdc_desc.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/midiconf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/usb_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/usb_midi_app.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/usb_midi_app.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/usbd_conf.h create mode 100644 firmware/midi2cv/src/drivers/usbfs/usbd_core.c create mode 100644 firmware/midi2cv/src/drivers/usbfs/usbd_core.h create mode 100644 firmware/midi2cv/src/gd32vf103.h create mode 100644 firmware/midi2cv/src/main.c create mode 100644 firmware/midi2cv/src/system_gd32vf103.h create mode 100644 firmware/tools/generateLUT.py create mode 100644 firmware/tools/generateMenu.py create mode 100644 firmware/tools/img.py create mode 100644 firmware/tools/in.png create mode 100644 firmware/tools/menu.txt rename {build_3dpcb => hardware/3Dpcb}/3dpcb_bottom.stl (100%) rename {build_3dpcb => hardware/3Dpcb}/3dpcb_bottom.stp (100%) rename {build_3dpcb => hardware/3Dpcb}/3dpcb_mid.stl (100%) rename {build_3dpcb => hardware/3Dpcb}/3dpcb_mid.stp (100%) rename {build_3dpcb => hardware/3Dpcb}/3dpcb_top.stl (100%) rename {build_3dpcb => hardware/3Dpcb}/3dpcb_top.stp (100%) rename {build_3dpcb => hardware/3Dpcb}/README.md (100%) create mode 100644 hardware/pcb/3D-print/backside.stl create mode 100644 hardware/pcb/3D-print/front-integrated1.stl create mode 100644 hardware/pcb/3D-print/front-integrated2.stl create mode 100644 hardware/pcb/3D-print/front-lfo1.stl create mode 100644 hardware/pcb/3D-print/front-lfo2.stl create mode 100644 hardware/pcb/3D-print/longanAdapter10.stl create mode 100644 hardware/pcb/3D-print/longanAdapter11.stl create mode 100644 hardware/pcb/3D-print/middle.stl rename {build_pcb => hardware/pcb/3D-print}/pcb_tft_support.stl (100%) create mode 100644 hardware/pcb/3D-src/backside.stp create mode 100644 hardware/pcb/3D-src/front-integrated.stp create mode 100644 hardware/pcb/3D-src/front-lfo.stp create mode 100644 hardware/pcb/3D-src/longanAdapter10.stp create mode 100644 hardware/pcb/3D-src/longanAdapter11.stp create mode 100644 hardware/pcb/3D-src/middle.stp rename {build_pcb => hardware/pcb/3D-src}/pcb_tft_support.stp (100%) rename {build_pcb => hardware/pcb}/README.md (100%) rename build_pcb/Gerber_leet_single_panel.zip => hardware/pcb/faceplate_gerber_leet_single_panel.zip (100%) rename {build_pcb => hardware/pcb}/longan_adapters.jpg (100%) rename build_pcb/gerber_top.zip => hardware/pcb/pcb_front_gerber_top.zip (100%) rename build_pcb/gerber_bottom.zip => hardware/pcb/pcb_mcu_gerber_bottom.zip (100%) diff --git a/build_pcb/backside.zip b/build_pcb/backside.zip deleted file mode 100644 index 1ce44f46dc9aa6c215f447a8a3344006c9bd54f1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 615171 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

EM?nx^x!ie4Sn3uX@!L9P@l~4fpw8 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�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%0DLQD0WVqoTH|+ioY+<(Z>dR8L{|f%D3W~YF*#;g z>JPT;72IsW??@U~Rqdp)yD$z7*gPLQJYk74`xuW>L zzp+KKROhF#vlzaRispqZY|JoBcx3w=GJi zv#cu7f&ERmP~wAjx|ywUCxHRB2$I0qjeK4e+@^ER3mW&Wu7~Hl=opMj(K4%GW4b4+ zIsLqpG=ObuCDs9$R&VTTN!nO2iY#JP5xZ>r^*GMEvtN~tYmZ1PX0YIe!fcJUL8W}@ zRrs4DEkQ)?(%H>bMDFN5E5AFX-m+KbfDs&-YBWB5p+qKucq*yG*y&hFcC>(K|&1)+0gJy>#drQ6k`*r1sw>dON62cjcy zr45xymxn4v3>JlE*jpL6Xjy&bts4|hr{hTG%JOSvF8eF*ZVkTI>wKT~h^bskA}=pw zCwnZRod(y!;mNMoQJw5h{MXi7JsFkItJi{x7{#Ip@to?vqVHtj<9dFBZ>QWg^Nw^t zPTE~8TlK0X%412Xu|4JbauqU*^KRJL3QTBlT`C#;ILa;QaOEeGx=(2 zD%9AxfGt|Ozl|;z+~TRFXQyWoIKG3%pguq4^-0g-C-@!AaM#<0_3gK^7OMHWXMgL? zKL1s86Qs+C+spIzaCVPWQP?1SM;rgJH#R9f%x35bI_I!7bX8$k{&?^1)Z_u^2t$^k>%e{%t&WkMhZKh#z6B}qLMRiGAx2ahb4olO)X+-WfP;wdQ-*?pLvOYD>$n^0(V#VdJb-0 zT8!QWYwjjs#|Kew%JUQY{i#3gbcz8{h`)8vp2gwts*otbWvIIz<22SPNwX|22Q|3! zd400(y;2TpXl~Y6?-00HS-mhg3E!&mM=S-a1y6jE4&)^vAG&Gh(7jB@HyK&NErEI2 zlEws+qFT!{mZH!68SQ5S^IkHH<=xt;|E6_Js@1?8kB^Lvo{${(eg>W~SdAmf>rUTR zdoMy#@f6=<_VvFPGD{OzfV=G^%cqST%-nobjC%hSSRvV`yO{ei1wT^!!&Kf6g1kN7 zZI2=c^elSn+mIGnfx~Ha64AYF)-lGjxBmtC1e-Jaw1@vU&N~CIXx88P_+6-~RPFc8 zb!+qKpO4--{u-6+p)2%E-7S;wxAG z?{vry4T2PNRG}T~cBu7ocZaU!gcKul)moy3-~{nIsNe0~h%Tn-K^}0WZ^k>UeO@4_ zmgj@EH4hs7o6u<07rm%=vopMuMLMN4eyB~&vE12Tdl#aLyZ`?%_SOMWt?L`8n+|DF zK}u3VKqaJMXz5Xg5s(lNkPcyJq$E@j6p=2`VdxTRK?J0`LqHmaW`H5?H@NpX`<%0X z_uhXTTrAdlzxR9Nd7gL83~f60nNDnNmF*^XeuX1k9=5Ng-tD3rR!yL(MEXufnD<4u z&*ew(+@F1dWQ6^VpzS~PeLe0GL%=zs{@ZcPa; z{9VMZF-XVVau4&VPIe8CI-DQ~1|?4zA-yNX%cB!rHH`jt?}h!W4A>gt&kOmH`spsL zDe$){A~RgUDdm96>tx&W^K#`<%vY>rcNpf;AzLO!Lw%+{etyNz5J1K{e9%G=T;?eV zk(N({vuZ8Uyds;@0$r*-bRdS5c)70Y+NY%5h3G=ru_LL8dY-E~knuZRO496@0J51K z8Uen&s6aWwq6uR79*N@ubu)##grcD4g7$WU(UF76vAgjV@QnXZA@SJ3#eC>@=5xFx zo$9P_UPb2(TkWQwZWW!j^6fELgz#KF{Dn9~F&>Z4VeLF;=%~NfPNNv@f6N`8msv5{ z`;b$hvl^X)DiF~B*mcfP%9wgzXTYNT#=ye1f|p{EN8)TdkL& z+wncu%8Y!GHlb@OF9r#rr4X3CY$vkRG^{ZcMKtyF*CLk}_GCU&EMwVFNI4>fMBa<_ z6&bxuzUMWLQf);giHp+1m|@J*;E3wVnTbz#J&WjMd0S@>D^j8Cn*kBG{TKIHXe8%( zuB#~3j24)l(w;pD0-D1#vXqz1?5)iTC+3%Cz={ceFU0R`3Aj}$y#;3<{ zm70=Z0wTOq7rDN?`JpnPn}yKYorsydk}p0sJiMBcLXDE}Y#aIZ(U?9Ml_G)2x)_X{ zk?A2RfFs$69?nHxR7A2xnk+{fgD2=VG6FsJGbUT?oxjt-sC}bqTlO7NkC;E8@?{*W zWUB13RL*yg9D-4ki-;;24xbIG=sKf&1AnmE^;rdpn9#Csr=$LOH&)r@seP*O%W+0m zWP06j$J0MNjvS8_mEhFgaVX`n&{i}4>W(2=0frqfgQoU1`DU?gq@z5E9@KROj6DvX zk40HBTCB-njInA3?;5>DqSRn+#!o^Y^@@R zW+-aV7fC1TYc{O_E1wW`8!kn%7wDFaj0A;t>{cVgQ4&weu$7Ot-zLzZmN6d^=j->F zAF}C|eZ9|tC_HfQAcbjet-gG8$7h-wb&bky@+D81A`EU^thNx;<@MOOx&SsHV3j|> zur|*v5947fc39}=_?7HrFpu(bilva?$nV{`s1F<4DR*9o>q#Ji85Q?^Or}YR#q2)G zfem~DrZ2sqfvp|R??ARKprA~|sCTFaQ{VN^LSeO& z!XK)FtyoSkvEu%8@SHtd4c3(_PM$>?y-y9Bs!rgt(fC%*fb?pthl{kEDGhK~R%lI` za(RZJRD7JwudwS<^GuDdjBVH0>gl)jG}U;Bh|>WnYkxz5VsRW-#irzI{`t#eLacj;)CVSXql^AL64pr`>^H zKZuc3?5DLG`(AYEDDkL-%I&2KQSuj{**0H$KCViYC;Q1JfC{!ewzKA(55>jo-LCjA zB@^B?MzJr}ZDAt6UeP_RW%+oxd`TX*y~~i}Iwb!)+MtJn?S_hj2i8Xu6D13Q_={VzP#YW55~$7 zUL8VKZShg^hJ9&({IXq24_x%7&*GkpE%1C!#-86VH8gLVk{%dV^+%Y`%k%V#Q<9OQ ziYD}m;{&g^eD-jE<{H>Cbp77IP}eK3Awx;gwGX){(y1$G0W^cHJWO(3w#A6gXKS4q znXEJLI`p`E&S3=c`8nu93bi94`IrX1fj2Ltdb#A?SKL9xaPE_={Dmi(=q;f*aEJL0 z=G9G(eqvq{wUWtO%=82z&nIY;QWVVB3C?m#Zu3(Bg%911jl69lS(RG>K&uq{7NL-BJ0YrEflh|7Boif z3!`=+*2#SoK^ACBD#>+W>1X9mTkZBunQ!^D#s#{&C!N?XI&(Sd12-L5DvRGwsfS8n z%L-okwMe~uTy!T?B@2b`CuPUd)Mg_Ob8U1TdqEFDqm~n^w8$zSE!==5yU%BXIciXw zFLHU~dKVjL>bKzoMad;CPu!Q)GVTq8Ad)nn$a8vfp=x)RlaRM4B%h@Rrs)+cgwP?` zkO#TND}WXoT*|?Cp)&&02o=8I) zWXk_S+(xn;?v2`q=|DC(+eep`kr9~aUk-ljnXaQ&lNP%v9YZvrh#aRbI6{!i?>Ro6 zPxSs0s56jk9u?fN%tM-vx-^J&ODX)3lcY0HN-P`MVK4v=eiM-8v-858$gz;i0cAF% zMvbmyo-9OH^OC@%4;Qbws_VKg1fvF7Ejt86y(=ZtQ52S}n*y6Xphp^Q4}6wyN5DZj zDxVXiOay$80oN}4XM&_42ZK(N8#eH+7eu7w*l$^17ig6&Dg$0bWirVa$9ogdpW zV|E$dr#4lW9aXV&6~^D!Q~d53t}{P12fg0Ij=F}gABtb~ewGlz+1-A()9QnhK(hVE zlJ2B#eY;17#ti8TA@3@j<*hw8Chyj6N3Z+$6Ibw=U=)N3gnsaKzM!(Mz0<0$GiX7Q z5kjT=2pk>)jyB~kYG=O4s>n4}ra%XahL`GE+ec}sazfP&6hp}HSldh7S&_);;r2Q3 z%C?yK{t;S6k-o-&oc&(svFY%5$Ss7JAY}3jSj<)5v)Zdxf<<=xt+Npqf zYulkyDL_@rHLZT3EK{$ND%tIduxQECz5!})UhCwxM1Lg}PM@lbsZtN)> za&g!ZhyA&t)XJ2&&LLf(NMA7)D5n%}zMcF@B_!fq0^JdmrTEhy?pv?eWp?;9Tp)F8 zPg%W;tq(p66>#l970pbbUO6E;l_#iZM>CyA+mEBL-L+H(-eTIJ?LVWeLT3x9AkU2tZ@<{DucqmP)J0*R0OsmT%d6q^Lj&J!w48kC1x^4eXC5!iH=^-5^ zefv?vyg<-_P)ZeeudumY=S!?yh-`eExy%jbTjW`{=C*fryCv|Od<$m+a^p-_u89Ru zS-)t#Cy)c)=hOC)O-xX@#CXe-L8?N*bo;}4uuKJC$D7(u58-Lg2Hp6Rx|u@Wx$$qk zMJ#2$7reGj;>v2|bintuJzdBhx_0XB144=QuLVTyo6mG4{mnCkMAO{n zRkf%|OFQwM<;_Fi=`)WU#Sqt~2xW8M9#(sJ@_D5-FZfj;t&5fe?iFf;^7ZZ_o4oRQz@e)Y3-7>?14FWrS zWO;O;^TX}(Px0u>m=oh8J+V3&j;)5&$SIfhgis`kKlW^W{K

  • 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 USeq8y;p3@ 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

    qq* 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

    =u$w`Sv~e0e;nw#F4K8J=KJb-o@yX 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%0Df_pydT``iiFp*Xv242*!$lWfEpbidz` z;)K1vXdh+8YnCX5d!$_fq0oTtfL+tF8;Z{gw9DT7jI0R4gv4<$%|=yzJ|-hE*W%R$ zuYYIkrB^8eRL=taXI2Pf-L}Qxdr3f<4JCGQK_Vo4qVIS2m7`5G%l62<4x`;_5N7nU3R zAaG}Gvsw-~sbIKT5s02D$G>m*{z1D<8vpp(^=ZnDZ-oL;Rk1*luqUg6hmJJu#dQyX zo7tCNUtjQ^R5}Tdjd`8I#bXjF1?H((vJ-UenVi+3Si?9ABIu8d9G|9OI|{dK$Z)X# zBQ}GOx%Joops*DuHP8|z_$=aRKYq2YzBgJQg=vQiB87k0%?EEM_Knvo5D)7G;$Slw}4IrsQj(%s*|0# zeDgtN#=x4WqA!m1s=Dy(GQ(OL-4; z64Nvm%1mpX>L3LX0_0bn^H1k#d>r;G*)iKaIpUb9awJR?-P&qN5f22;=xJ-lmI6GJ z{3Rm!{_~3K@M9!HVoz3jvD$03c`u79fqPeMf}1}3oR({Mti7!a9y+fn>S^_NUaWrq z0H-V5oUiGHfxU6-=jrI1A{h;Kk%5pf~l ziJ3jQ-MO6$<~6@x45iba+|y+%1Vs*df&YY?S9gUJ^ef#-=b6eqyh$$humD!1^mR-M zetTi5LiAVL__7h61 zm{e1tF^us$#cGpo;RK?SrybibE}?xM{~SG$@o{rmK9HFAlj{`Ryt3;Ac%LZlb;KFQ z68LCYG>~W!n5$oAt&`(rf($#8fmm?Y&=U1jPn8;1Iz~!?c`HP~_H5z+P_j$_1H>AG z&`Q4UgNSs^k&US zMILVdXUO16A0Jk;#ZyrIa~qFRjrKT98|-22Y){q&itm&Rh!hk{^jwLSShaz?BCX)DnPB2I zxxvSZMh-_LAL>5}?eJpCcX>uBr>i6Y)TaGDR+*I!AjnzOL(!#=U;fFBkjxW`r~o7# zstQhb?)KPI9P&K00YE_M``K&^)CZGQQC)V_tS~H$9&xhWuyxRvW4T=~scb=Uj z?`aD{yq**u{ZQgRRlT^i(Zi=sFo`GfdT0+zXHs)8Eteqs`J4s%=M$Y)@;Zny{_G_| z5={|im4I7fhgB7z4LAvU*^(z)#V3bB$87Reu?Z~GmnF#O6*Jg@M`TJl_F&$BGmIPI zR`!3?dTnGa@|qUnap*5%dl$A(U+2|U`2G|Z%_V@x3D(>>_5nK{ZDZMf6NWDs7hL=3 z!dE!>P31ABQ4zLp2sBXAwGVtDsLDB{ZB#p!MD(Glyl{vpx0gzx6Dr*`^FH+J>HK#Km`~ zysa9I7!3V;&2u^8p5RZGd=1kRTuE=&`mJgvXzn`mG{8%WwdM~SjxHO-3vZb6x;RWG9!z=u zJi6%l1vbQ(32)*`a>_bxyM5>Fq|(0;y9cn40+BqSc~sx*bPfNpd>n>;CF2=0DQp9qy7%zti&|2vj6^p^G+M}0*Nvfr}@xlx@U}>pq#k0?So6QCuQ#tnavo2JX@8h{` zQuX1M41gb)YbZg>jMSpiyz^Bu{>OLrWMjPGBmy;Q(Eu1`UKg>{c@cTU4AOptWnEvM z#=(HZFBi+b(;9)`yDoy$RHzz|)MC;uFTsM*%?W!G>MmO#ajA$a$hT1TA9I2%?RL_yKQmTP^L7!x@7INRlNp5I$Q;;Lu!Be$@cXQn=m|zD%Sn(nfoBhd>}KW zJdmb&!+a=Clh>w-dYdFOa@RzvFz=!OGsd0{MJ^;K^$SH%9YlolCJX2sfy86zdW@rX z(NCE_zv|8h5?$u_Le}1+&{g^?K+TC&2IP#I2|g@qMy`jp4*XC4AeH4e|58ysu;s$4dX8Mv>cwzdo6C`LUN}^KQ8Z`Tc8Ft8Y9%KlR+M%WXEtkTib!eLN zzGXzwK#8W(yw4&c;27_`_AkM*m}7Bg2T)YUj?jzA4M~x-Tnrm`5AD%EOxO}zC5SSs z`s)I7+~lKX+yv;5{ns{5>Wz~5suVy&9}V!Kf2#RCHR=1$vm1H~s2$D1q)s`>r<|v%#EPZ;Z*E~)vvYD~Qju$?pWtx;opWFjl2*Lu6X0RY zbI(IBhqRfLJsn@*hXPQqWGR!J^W|{$33EyTd4O)RyB&B&@MsH0t2=W3@`b1Q%wNg3bD3k$XVwWVQR&gHffDy4 zZ&?}M2{Ex+k00RdmY_5vZt{of%vS?l-6u#X>69UAo{ayqha83R4NO}LohNp3I1KP1 zX!>T7&v9{KC&=S`fy%GE^@sj{WCpeALZ|=;OHJcwUmOvHqf~>LNjbBLO8~}@pfJB# zZV8~5QspZUM}JGiAktp5qfrh9yUa{yl9pBNHQu!gByW?2=Pj! z{>7)m^ySdiQXjXYpl3DV1gvSI6MUO3(4^)e?-K>h{Q`*c)&?$PRg@FpXflVFxyuN) z^-WynCoont6t#)UXv|B==V5A2ck2gWDhmozef9Ou1b>n<%jnq1;=;e;(;}6rN1pQWIz@Jc1oYV?O_c*m|TJKyYATH z0jyf7B`aTiYjienPvtE_ms#kl1X=f5byeM7F&%NG=p}nku@X0WJ+&PdnX7L<&s_M4 zdhxTQqBKTCx>G(QZsuA!Fg-vi=dFDfQMi&xh}hD1p1rwnjaCda_6}?ZC%eIqq)5FM z4L!J$Q$HR`EXmsxT&%%8bSPV>N|D+e`9Mdo(D zqX-s+Uk>-eKkMw7^^O2BL9(!?)k%h@la2_h(`f4gavZpQ$H;i__qR^k0FNRRQ`9~^ zk<5euEXZUv6P8w=Bm}m15PZUBRdIuLFLW_7cf?wtx28yDBAM2+SWn3u*F#yC-AFRi zU{;9on1DAFVjtdVEeB+7S1E(B-!;_;PBw0%$aGc+7t2}sD_z#Ypv1M%z#W7X5nD?r z_PkMHAp!Crgf!w6(#232ee976{s(0?_rR6R52&Q4@IX~0G=&wsXiC7&UWWB-Lrw{Rryh0~|cOsokyS+UC%g+wr4@0`&g~u~T6q4eye42DmK~$jnnL z>-+c>uX z%F%T5vK!#gdC?IFC#%ufie6wXgIS|@@O#Qh62OA9L@%)Dt$x=V>z-Ss{i6s_rAmA6 z8~y~8y<5>{TUpXo+gNf-;iOD*j8)$T)h5&L6fBJ;2Iok?|{1w$0+M~Pi$UkqA` z^amS_;rk04PK?-g3n5DSFFFdF>uNzEI-E&j{UXR%8^?eH|E>uMSj62VOyCLM^PVqV z6FOxKu|JbmL#ui|a|J{yrKS1pGqwXIILm!!k#NW5htJnOdY)8*6%Ks#)-CqmRuOis zC+&W6YaGQD@cS10R*~YCGV$E!3fYSjXqA>2_b8m0fD5tWyBeE^)OzfZ$FFB zEYLoE|9bU{BBeIE$V*bU*yi^#z3o@;pJ;#%VzcY4{R&1?_n*g2q^c^Ya4OvC@RM{!w*JP%{B6HU3D#AH^AqMAEpCSy_^E0nN zLljmEclkD_?C@&xCJ--=fHooRAZ+e#E&EF@Daz9sS~YViH?g;c4d*z6Q@y7rkD zdz3oyr!yY`>F&;$!W^Lvo95tH40ah=bBXa>%W=O%-m_$Mm`VUQ0gg^IZ%3!RSMC93 zqHQc7cjA87WiDZ@ByXL`%r>{+_*aX#4Hfxvz*g5bS|8PwEU2H-!bP(OEfvQ22$m@= z%^4U1edzB3Xh>gALobC8kju!!{mGUeEPGFDH!p&;L)n8=NC^ci$YV;aM@DGk$@;!OD773>1Y@fEcG*y%_tg4i@&rV;*pZ z@pZv;pPlg>Ev7Rl^l=Z@;M)6yQR#u{Tu(Bc*jK)(Oe8`?fMW~~u)iZFKIvfJTNhJd#%tlTtPr_ObS-7^My=^wun_H7=2_In7> zlK*;tJGSoYt16I|JBxzaLjOw9?nZZA2ByJ`6__{KnabwfU6r|W!1yG>m;VvWsB8;1 zFg(T03f=sKQ2opO!=6ki(}NYkm&=v*_!5v(o(dhS$v0ltw_U7@oUFdA1(;jV?CHvc zVDPqmN&)S==X_5jTC4B0;k;7caq^u;g>7TrR zrCj?(GR+s}9!&PXlpgpas_$o%=&2~sglo!#YXnumqwmR()P#OtO6h$ZE5?99y%kiJEz7lZEco?ds4PXl46)9G{?dng2?hd zd@Fs5dy>&DIYmAed(9qXG@62V5((UpVzixt=z)7G7!&_9JD_+ECoY!B3o|XMp|Tnv z1$3>B{C`FtX+;}5?+3i~j!;=WAFj!gF`jE!g9ff9#JjfIqy02DYmIA)_rQ6e)&A?- zlo~@-9}!?ie2V+l(wT=2T#2}H+eIM5s?)G0nQ1rGk5*Oj5x}I37}k_0`SfTy>wfNw zE@tlQwN|!Vpa%Tfsiv>9f+@hSVRObk4}g~_ac_?V;e>3P zu2S6TQ`60x_0qr}d^sm6@&xP7g`sr)^gw5PJNNWAY}-{rHn1IYb~;-x=Q^RNo8h{tVPaogwnb(J@7Ij^z}$mmEY-rcTHG8`kJorZ;=qQ0`k4;2lZ| z0R>u$Yc!8(Q6|-1+*ek__UOcgYiLaAqYjZ|r0xP8v9^ zb;fV}GFy+rwr)N>c=+fGj*H|XWWFlYLIzvigBUd5ehlq_Sd1NFkqX?X{G3-eeL@eC zF0%^AIo1D#d+-|NePyfYamBI){!hF3V9l9^zd1|j>bw_N1?UlCEyVR`Gl=uPUNj{0 ziTWdC`qZcsWM*vpVVtr+eR%ejl%Pi(5lJ{gm4;=lQ1`uC;LUl{;Pb2kOFxC9Z|;Um z0R0tSMUbyu&n=PZ8SEEqV|n>xKnnejZ&_;e46_Bc?Tmh%EPblfJe0PX99i6EGUsDh z^VCPX0jOXG=U}g^3@b-Ee13s0QNO~0!b6BBDNPCh098K)#-B~5+<-xVihsOpQjXPOu95@$4JhhwZrU=S)jonds$9VFRK9cBR_+O=9nr5`*dLNp$LK$Aqdi|^xjJXA@CNS@819Y_r3API3D&+*3MpQ_Bq#F zb0)uD8IikDl>HZt8(RkViO%@EGhharSlRpwQ`MCju5>_kwT@qK{gb2qod(GJNB1dW zxO3pwk!@Ri9FIcLvwb9XlQTmON4N(-2`^^3cNb4koioS2jocd>5AI?H&*WdWl6YhR zwSbc(n2CwC=af;?U{@ZgrH|!cBuP_s9pb2555%?-WjQQJJG4WKGZ)QRQ5qHp46NJD z+8Ou6>Fyk|p56CYUiuOU_4!d(QeUxnwEXf~6wM{(x1)vS@n>ZGMGur{I-9G$OUFv5 z8S+eAynZYK9FK(n5W^AcB`lRY#jChp^JZ5c|g1v7zPaObJS85FTLG6 zJ(n1t63S#g)NK{b4M}u()>BXYwb7C?;)ap1- zRALQnn2t^AJmw=#UYNzlO7lu!wtjwTwOAJ57TG<2J1fP4o@v;}%sRTNVEcP~1q};_Q|A<4|0)8Qwg8ZGJXrg^= zZyh?8w>PP;D+3KOWKQLgD{A%O11OjvdFGPa&0`xAN8wC{9FT;qe%S#W`ErlTs<$j=Q}r58Cd6|!eQZp zgL}Dm)59!WEHBqP=1T&X0%|S9KSck|8ymQ%KuL`|`HpV3@o3fY&S5XdEash{l%K@` z8P&dWB<0-2om!5D)~PuY>W5jMUm(OEr&|r%6j>EnTixOv?(0vm9#;P#dU0G!8#9_@ zzQ1$0)9$`j+PSzqSUk79icyqw?f*bw)uNKQZck#y=J|ztPha5)rto_yw){?`z%=FI z?V_rsHpD8su=~+v@`QqvE}a6C<57j2>Kp=E5-BG%>eI)(<8un7m^k;&+9Gv=iYM5# ze>^@1?vWy0B5@wcws^%bH5LvtcOIirg%2ftD5}bH^x#Q<_i@z{YrZ(;OW0ryp1FKEJzVq0NU4Q&f5K%Ne@{9{n|Rxqe5)YK}x7Aehal@3(nPMgebmZOF-BnyQJ~ zGq_Dbn}xncSrD@?*c<4P5|pC++3Y(FeT{_`&oG-2%j%S>xdIhrRSd@Ea*wKW+z;t_g0ap?^ZBcLg8bGVr@QcrhjFWm$#s$4 zKeVAWQjZLtA)lmhZy4B`s$Dh>knuiUNSL~;${FFv;s#qZc~6I}$iX93BA;#5)~u-| z{RA_IQl~Z)hB<_z?)CwI!?Y12QOv` zx_cX?ekoi+;lX@lL{P)MBat2{cAh23h^2>H+Lqb~ z&WbY(FvRxR8=CraZGp5bjN3f2I;pWKb;l2+23m1hTlHADO^Q5O@T)VurRmRjNMIuHH35Bu3S5YUwz-M&C`13%!nu(uFP=QM=NJ0Fvd!M@nArkbbgQ;&?aL^4kdYU|NO-!YHKWM@Y*s} zz*3s$yPrEEQ&8xx52vry*L5G6&R=RxPWc|0AV~cyhQ&01)Aukt6T;$Fq2;$7ob6bO zW(n%cpU3v*qXDtnW&}LSR*C#0bWLXM!S0}O_35lFx(t{%YPO|stZY!H3c(v2m|#z& z10jvm#vdwq_1{<4!klfL_oY)y4XfrG8E$ArryGvoNds4yzA5O){ZL{_h^%ic8=kLFV0E{f;5N4>v z{$KjMZ^=f>jDT`MB=-%iiGz?I|3H0YtZb?Ko86V;;d4O#^wQ?nH_*^)TXR(qq9J?I zj3`63C{}tYeL=xv#?Oba1pNzNFfUYHjx!Go0nOv-F2|N*qPSnj1Qo?+9&PQFniHt) z`%m(9kno;5M;YsLN-v$uz<{xpBbLLTsvgDG;IXZ%NXpu-CFN6txkUD09E2sgOkBkC z+oAHr1I(SPAOyr+_y{~pgM10FF!7Q+d-coVs8`OBIti12ssM22_Z>(FcYjPkKB@v! z4AGk&<_V>pqY3~g!tY^|GS__?axXO!!rwldrV7ZgZd;6zpb=;Tf<$otK|l@?owCk- zR>TOrV)ee9PfGOL;Uj+izruhD{FL@E>$UV=*9SwZjg(KFmGp-?S_qPbq0rRSyrcOW zD8Qn}E03n@vPcy;A}6ch6_}&Xv)wO)N7>;|m1EDzP}7SJ&@LXlHH}Z|7pGrYtiaD5 zXcb#k&+?Rh@-w*;L}o zbVcu83=9YeX3aV9l<<%)9mNKVm+`4MN{l;N9PV|Vq2i$%<#D*-a76TzNV+))DB}D5 z4@Wkgy+=3xgk;>2P!EV~^rMWQQt}#O0TKl6Jo2h-d_|mGclzL<+RPj;llpprnSJeu z&93eH7vJ}gDDEGt;D!V9o|IDu}%k|KwO0+xI~FS@)zTDDcLIR3l2kXuQmXH7wnIHj1dSc&xyhyxrc% zpMxQ)@oCY^_clyq!GcnFguF;VoUHpqqU(5)rv+#MsjTRngJoP9U4EsF;B9FhrE!^I zpr!{=z_eVifx5vs0TzXFsT@@pHc6Zj&`oR#0pgu;%%ED`v_riokHa-S7RuO?(LlL> zZu-a!TLXd@99KS(>hbvHU#J7&tY7->&wXv=G?gs1r@X2bV%sh+cfLRaR)ze02iGg^ zX$%xG=REeM)CAROTq%0r`It53Ww62Up^)M--Vj!s`+hVMYE6s1`fCbLlFUEtz^fyp zWACd+OVIoX^96HUdqb<592|w;FD!pTx{1;+JavK70~&+n{ z9ghw-w^K*PIed@4(=7CkZGBci>#H^y%-v?olIc3XtS@-l2j@9aiK9QogU!*Fk`;U& z@G7^!n%a4LCHH-YXlY{)Mhj{a+{g{f-g=gE)vDsQra|Eq!MJM;G=d);-`y5*Di@?J zFyQ576u=}oKg|5-$T-M1JLDR)ny7B2D|eOuiSJeZQY-0Y-uL3>a&05uBV(&PZwe5u zGF0%LxweKXiKX}5s~M5=DeXl4k)mymqPBM(rx}<1U_mz65_&h9R|<0`W>vA)A5DCh zcrs_uD_ZZ_Ab}F(O%F+IHXsx>gYN1>&+i}1>^$dDdp6QLkYPA?N=0iR!qIuOGl{~g zPBQAJjAR&!1VDDn`#AuVy_mEdjt+-t*5XU~YMcv|!NNziExG1OR9B>6?%f#>!Lg>~ z9_Qr7PZ?H?S(oKgNbQjPdU(%JrR{Hp*R=tg6B?bpdA z=uda}L&TRBnqvKU`7Qi=-#-S^gThTLS)BPE%xSSW%+!$^vPVI+3HJrQATVR=3rR-Rf=^&B zogXJ+yJ_rQZH65CT%Fu~cM z@CF+Dm(Ec9Iw~{Ksi%}57G=}^x#_GP6Cyru>$*Xg!lWRHbRW6(oTv8NTml77qDOkR zU_XacOmp>}=B{7l%CqzRbM%;XJmCY=D`TeAvde~<57)g(-|)5f_%u(~56R_)2Rq%C ze->OS?h(l0AN}m;p=H`@RrI>1k!lq}cZJ&LDv~zcN!uV?v&S`Gp{1AJDXDpgim|JF zF66ccfKg55h~VdvM^6SL`P{R?-#tuor(K5A%03u)H9r|;!b01{83pmKi7<51n2N-1 zx_X8!)+E0&9$r{?;RM&ta_GKFRHIRv0`Q}%o$kg>&H;{7y ziJ?LJK?MnL(t}N($+ZIb*WxpKi}kiY4t`vxt95Hx<7WBbptLaCZ`NZJmp$nU9bfRP z*vt`cVxgY-U|7Om+T~2aXnR~^+wpb&vX!WO= zJ}~7*S*=Ux*5RKvC{)9Q9_{Dy@~*7ZhK_m`>{w1dGrdBMeD*YPDg3HB)8$!#k!MK> z)FFLmZp&#w5xU;(9y+L$>1>M`VGwe3%i}@6#cEbT4bmPz8Ff<9FAP6rvI0+J3g2f{ zhlUC6`WZzr`u8Je1==pGEr$5oDQY~K@WY5Y^kj4yL6vNmlT_apbv zz1OCXxK-dD$(PY(Ig%GY6$yB5|4tBlrx?WV3Dy3b9sPO&xE-Yz{T1%1PqH|Ny_ntN ze}zoSOJq+Pr}j5#OH__q@-U_-Ga)KJX6~Jr*$dK?cnbrvt)D4kh>+O47^3eq(H&r6 zOMWKxPhRY_Ut)7SL`@ScOk0M)fa5P5;?b&qfxM!f|B~?Qm^~ z$ehRv=cupo^eeCu9r-Ic1b>|6jOX<2zCj!H3UB#4LZBe4qqNM8EYP5kKeyr)W67g^ z5$j$4f~OBz-rIe;{sJF1wD<8Ne`4p)B+_dv+jAZwP0y%~fAomoSNE{9P1K?Y8Kg?} z6esm=9l3GDFtUh=kz%tdEbq<3x#-u0UVWY;@^Bkh$;Cs_T=A=LFvt8rpdPnUyzq5g zCJ!F2#63Q@=}r0?i6%b&p|IMYDWX5}z!=*wQ2GlAzXJ&zbr9lQg;kn!+8Q&Qk|p2T ztSy79IFvtDz~rHK>PcyXmtxvGk0J#4KRu}$Kd?qWBFJXusyve`&`C2B)Z~0DuRM2H z7CCzaS3&<#_II?IiDw`r+J5ejd8^ivcv~SF666}H3R7U37WTZusnp%U461o>3FpD* zRydF32s%4i8)40;)AbZdZOdD?XixEIeQd)*4Xi)qtc#jKeIj#^(L)G9tzj$K2WWB~ zJfxeIF-yQRY7Ktz_Sevd%d78^)rK;wy(t9^I1K7e!UmOy(;TSMn%d+KVf=h=_XH!O z^*yYW58?-pmP1DDs_<7JMZ(hIDka6|)-RC`Du4~)jW;Lk3#SB%@vw6qDe-! zxRH*>BBxPqrN5zT^r0Rp(}!}KS8qflX_V+O?9?Bj?xb5mE)FHo_8Lu4$siGew1!v( z>*>VbqM4<4&o|5-WulVu88d8xS}wh)?Z~i!s+*si)wu|ot}`KAeQ9d(1w)c1zWaz; zrT0v8dMrp4w2B{4xm#itmJFwOl<88>;`Qh{VI6%3JVy^R33N^Jr@r9VV2#oE4ff(h zm+%i)S&lhLne`W~_@bZ7;D+I0$bG&*FD6c2Mg`5p=##2Z(KXF`Y@D}XuCp}!(?|DV z_C+-4&utmvjg?T&&DFCLwdiBzcdh@noMb5XL{-P=5B#Sz6^8;x4=hpptref^Hc#?7 zT_njc%Xhu_WSKENEX=C7(jd;zb_7^J&`ag)XvuW3fF1R&Q*S%Hy&S)tzEEx@2}@rp zp4e=!h&Q^vczf!KIur6T!Tbl~@n50Nx1r`#jJemh#qGoR$)kl^(`#akBReO%euyRB z2pv5X)<#Uz&3;z!cMQX+4_^D~w=VzNRmhp>!Y)hg%JdwjwTZTSH!Pcy>7j2Un>~cx z@^9!HY{-TLiAjkoX%aNV^TjqQ;8(PhM{=XtICH06yK{XXpK6*jBKKb+&fi)wX|QmwY3UIz;L2mv^ja^+|uTjGJxrI8YSL z9kyzTgcMQ6rG5sVN{ucaI7;UFNv6pWCq4LUKjP_FET1kt`058|dD(Ayei@PTak$Ja zj+vp*Ny{8?UWWU}oL2T<0?ViO3mVLl?7GzN$y$A9pRc={$in6y{izd!^@%~&uyDGG zF@#zqw}J~_=^w{#xgkC9xU+y*F?nBI3) zF%+6h;05u`F1?(6DZ&YZ&N!<_wx7(R#$<%=O3=y7SWenIUn(PxFm~kkS9=2Ub$03P$}m?#6jxm~2TH7VZHDrfYEJfJ z${O9cKakI^Unloeh88CLL;FBt?!)@G0z$<+d1< zl+u3u`9ku^8?#e%b-^00HIDhb9A-TegZ;pw7wG2{-rs)$jQ}o`uI0~KiXqjsW9pd0BRNSS-~XAc#f^(v&A$fadgcd-~2|z>OQ^X(zb;jWf%2V0)7Zn!1Bp9Z6BF(igB{{=cb8a=+qCU<{H>-cS znImZ(>)u+=)|^i#^L)!2+87!xZV-Fo6dry{BPsi#b8Py(_V?-s`FGq?)A($i6DSS; z83;Lh-w~2N2qg*9$$;#~7Yg}E)1vVe8rx4)cwX87%$%g>3;xWNNQew7hs77Jd0KVa zBx0Cvq01}&snj@jb9z7&g;>V%FbN}d@xI^k=>oIWMSGrX?PwpauUeT_=gqC=9j-S* z1q7pV>*Ivt(})DB57I%>K6dA99LGNcXTIosABUCMp2Y*&DDE;t(>I(jtuF)EwlS^F zBNXg)dr8z|QmosixI6pX`%QI2OY!A|ad*o3&53T=)^3bddy^a0noRaG6%RQxhu5$O zyYJSabc)A4@kRlr2)lLxN)T6I3a>8Zb|y*NLufW!>&$@fB!6~evjT($bTeh$iEnS+ z1-6WbSdVXw-}wtP610ooQ`cz9eI{q|-i;jV9r0S(a#4Bke>IIwG^u&YWm6v0FYM0xMn*(&LLrkAC#qE)NZB2$t_XAT%O=qG&U0Bw6mh6aa2X-_KCz6-Sdk5f*ojitC%PdRSg-FB%ZC&oHJcEImILQ z_;T`HW-R`3G;8=p+vRbY^4MW&q>95G@e#^xqO%?ihz~}(n3n0d|6F5u4nv3w)J_Kv zx+yQyfgAY|pk8Z|wBOwHiS&PTrpvi9a48?wZ_*dI)?#lP7zDIo#qGwOlM&eIeepIV z+(TL832MN7WCGooDZDheBaCy4|E2}(?us6Rm(8c2^XMWEIp^Nmi{9l9K#9S`1@b?o zJ=TN{fNPgu zx;Gi06PRp16SKR3?adhu3uU4v)*m`U&Ew!v!9#)S4rFUV)Exi}w-i2}Yv2fmp zPN?i^_sFS#y^LD8E3w37)qyUH%rd}XcqSxI+kXUHoViulCXloJRqn!b)&o(AP4Hv9 zLq|H`8H_Bc^KyvaB{B5lHQqXx&V>$1XOUfzUQc<=x;Y1 z04BccJ;UXAzH50qf?q^+hD&k#>%(gxruIZEijoeQbXr>;xvQMS)EHr@{|V)(bS3xU+vk{j*eD0#qAch^5*P*Iuu^yqH`Eq&V|r|l>m8U;BC$N_sjF9-m*HPr}2!N+EJQcKnY{3n~nt5 z(-T(Ezw7%S!1}Ee0DyH904oL=)Q`PI>{)o||8UT-r*i2cJ^**-n#LR_OWTfN$tZW! z5N_qsLe<^0y0)lkipoA{H%mS}kmESR6aEnL$k_E63B^cH|3*K&ct zUzGP7%_a)Ap^;NyHRQU@2=PDwyq2g~#3rgb{@t^4xIs`I8bD8cZAv1}eR2C*L+Wxt zVqh9U53!1b<~uT;Pv0*XvSCuN?s86hjY*gpiIig#Kh$MV52VEzD1p4#b$8*MQErSDEDceVQeoZw{12FD1*F5x>20Tw)h;88)lbq*Z2vAlOewR?=( zLyiCIN0OYg^&S}x^*%69+mD1a33@~GA^koDLd{V-Cnr=qH@bds4y;^+9wUW16#r3W4@qh?NM*3*vqiWLtFTMvz z<1z6)4#HHWS*Qh)memACtVf}%K~c5&;j7sYbFz7CEf+Giq3LFB+;d)VeR zZ&c$BSnfKbRO0Zn<9lx=u5CW0z1x}|as3MH_};o9-=JAQmz9SMu)JJ!0`0LdE7c)c zh_hRB9t+z3rxR(>I1A=u;+6Hh-v24~NEznwaNHquR6*N`3%3VoM`)oz?q}Y7{5QG2 z6ve9bE(gIX-t`F4`A8v;5;YbKGs*5;JgFEtyQ-W^;j52{yiq=o_geFw=<$=j7L}}{ zax$s<-KUSA3kQ<#GXpLfH;-iUXWB6LeA4%6U`N@vAb;4i)wJoT#cc0+ zGh)4*cNOILGa{e;UW)sU#AaFH>Z>f{b6Poi%Xd2)6>`jC08RYL_Y(J<@>+Uz=*+b% zOXtgSR}UzahSU+~P>s^Qe@2IdL`3o2w5B+U;WQVmp`a|XXXt4U@-baHR9qPb1d9_P z0XGy?7jKtY8)bt(|8-cCp=&wvU&*J1s)#|fwe?pXtF=gq&0kJ)P}RRd^bF)>y!rng;Px5w5#~PRSx-iRoNM`>gDiaqyKx4}Kx=R7hlAY;DhR>ncozADK$etUb z*WCk%{jKs2jXp)xOt$mNue!TIz4->!eLMIMDbGTlLddpb!8I^QulnJreBAU2WZ}& z*SKMv)5LN-Tc_-GRPfzlr?KS*xjxs?e9p1!0XShFmCXB^B%`zaugVK24Foy$Oy5qx zhpKjeD^dJzdLA~f9C7DDg&R@Cw^XSbI;|Sk4nq|Ikf>!C`?yzi1C7Gi#Fu9t2jGI~ z;k$b%ut(O6f_YN`+Yl<^V0qMx&<~Lt8(2AVx%(bBck)#bh1@yfNgjaR#vQw0rQvPH)8Cip6=^*Z?RpoB zaomM}UjE)0t8^)9*)#une4!6pyY>4Gr3^Dw@0v$)A1X_0W}uPIEonB}S}pnGMnRIN zOTia8gX+mi804ysd*t4ktHxzs+J|=Y)oKS)*29C3_hP53bY?G`^u~F2R_?NO#Y|Va zN7lK^(ltojX(Hm(Xw$D!!w+s`u*itYj2}*Ge^A@53B=O0*@~x=em+?{&te;qPI6aW z`_8;3o@cal^#%FCSffsTpI*_fceP;TB++v0C->N?#~aJyK;rBRM!~C@^|pi64#rO4 zDKIHf1?YDDX&>J_zK_1r^?k9r=(n=h9MB+serd;*y}sg%r;}SW?NK?S98|5O^8}FW zvo()3Hx7Jo_WWp(#fM$AP}~K>REylxs&5-q@0{{S{Ln^Rx`BGV9XyoU#Iu;hPLGSu zq-$dFcUNK#$$FOh-ZRfwpf**zGfv8K?{pFwZ9z+131g7h-{YKHk+3c|DPUG^xG_R4 zqKPIi4y7-}MyA+&fPdjG;e~N($FZUDyiX8c;ME3W{w4~(YEOJ)BY){)m<_bGpeqWZ zsj=_-SKsbWIw4e-=5`T&$H`lV~P-|Jg@rEUl7mZS_8<`DDKL8@q`8$<{p5 z>ICJgd8R5#*6kk^uP@gl4m-qzuYR2rN$WFf(iChm=^}mH!sB6|h|Nj&mhUb6votF2 z=6ENo=c9JsqYol&x%oo~Op^wtGznef%hznZiVrC`x21;!Y^QX8X?$lYbnN%&E?0Rm$D|p1cdAu4x0Z8L`G$B z-%&roSj>`azW(@uqd{G%hJG?vef~H~X8Nom#hG7@C{zxD>CUuOUM7*9RGXO30_K$| zAfzH*Cpa!3$jG5SC*jWt6Vand)d+xuzjrjKCeZk+XKFNEH%Cf5XYZGjbQ~~*im;!L z*qTH=_GyU}a>$>9#OQ6*vYm#B{JiSVI`?o-P>r?t8&u!VDG8KuL^T$xm&GEhv2PCD zd3Sn*`IdLQSNVo~#VIp>bxpT#sg*t&clg8NmE_WrZGd^Vz_zz!#*$la`czX5IPRIr=n zA!e|=yFE;M?CJPqs*9S2$3?X;AJIH-dPz)tyA`pet3*mT|>WG%iCb;q%pFU-l8^k}H(aETXjq<5VG&rc;L)1y zoTCTQ8D4Gf4bp;S(p5-baSq?#{IUrCP)jR&^^Tsk_7oEf?V{mf15Jnw55V2tcOlv+ zcm=)h`^iKT8We%G;p{vZ46m=yh!n>_a0%+^rMO$rZdgcMWzPsKPY` zk*>MKhX-8BT`_hxj}%#*-G_fK6P+(+40iE_{IwY-(p;Nuwn)$pp}+nq3ZeEa!_tuP zJZl#2#djL>^D=*gLF~~n|KK#^#+N$Ixu-9=P6YU_Qf*u|ojdXRC!>GYz@sLR9r^En zSp#L7A_7`XcUQT^TU%pRre_M;6#FT&udto%1Oh=|=nI8Ib;Ie)TmNxI7&zy5_4bLN z0h_+pjNoK$T4KuW@a^YApwY>g%|3a_HBtOo@wAoB4TI$}@AaCWW})+x;1m}BWTZsN z(dcXixoo`ux~i|r?2$}G)Noo$nrYDJklzj9Rzp$zj4MP?>tWlQ}cxbzyU1tHE0tmK!#gv-CN{p64XO@&UCj=PW0OcDA`>pQ3Go&FEP4t*Gksv$kUouv zgX09Ak29mTNR;!x#q$qM&JAj3fRwsn|Kk1gzmvnApOW5Mui*(HX}Yf(1}m8aVeU4L zlpU=r6N}7*ED2NM>YhdaYM-}z$C7H~fJZ}RB~wmj@_`F!0o-~vxK`$8XWDp}q%7rD zc!kBvj6|vQ3n7#P9vzLLh(`uBx$gq;- z^`}HSInXi_XIMBYcF+Gkq%7L}_0FDAk8+$v>2|?L`I4h(l$e>tdF{kc>~YQQMe#MW8wzrBu{!$$+U*6i zI(q?2pJV6!_M$Dzdo|k&%$6CgK&=XPYk4GLWTIjCFT6qxA)%iN){;uqT{QpKsr!G5`}yUp^c6E_nvsp zSultcU#XE>?&solarkAW%HlrV6SUyocwY)PKD=7hm!9%{d@XLg);M(W_tP(q)%QF^ zr;@fHBt8F?RciAwF5OwbWvTB@TD+HDuz57Hr_N023i5>`hm#DiO6IR|lKf(Ea<2~M zR&XrnpIo&3@+#V>OsN*hB>`G~UR+1uJY&XA&<7#%rY@&FG$OzYP}U0b$XE(i?s)1{8xV-0~coS5N!vhCZ8 zB!ihGY;pS9reV4%Jy4{h2}T;CMY8@YTv!ZQy_-t{AgQ4?1rWF1=l6ttQxuc+i-Uq`RMenVHXSg9kOnPzn=dR<3>-zHV zLo=dRbJ$u%+6(uu={Ck>i8<0!@%bI`wM550@xnc+O^XPXZ1ZxpBR>`XJw@LYCJAd5 zGDy?flbt2rK<*{=^d1a9ap2pz{cY(3TWKigDLrtc^EnG|-_`N!|$EsEUFT@O z5whWF;p`I-gqI_H(n_d-t87~A^<8vii%Sdo6UMT5b3dPT))6{Y^J{tgIZtpYdtw$y z?>28RR1&}4n3Q2SzASku#f6t@qniX``dYwwAPv&P5Lc42M$>+*#e>}Ql+!eowV~2o z)&2&Y4XQdi<~a-QyNSoWEPZfXd^I)jT)Pp|aJAWN3=89k>*K3$AS~}xp(W~2#QjNW zmKwAI({}l~4=xRf?ix<#R$W$I5gOO_j$4IoMedUSm}^nfJF*1D%`JztDKM2MiJPEO zRJ5UfQe&n4xIf<;FR2sMpon%DymrjKPv}%rGi0;Ev&>g|!sWDxmLbNoKg9e>zcP}L z#Fal<>J5?;XN&+|4ofj0Ixlo<;^EX-<(eM2iHvnBrd!ir@5=F5soEJ=KQpR$lsT3 z{}GpUxsGae{N`z!xJ8&KSlt9$AdCf_PIDAKr(PiirrR}Q*e+j$YoE);_pLG49X?D= zV~95NuC86Z1o0w0I88G>)R5CJq_OQBrO)qj7#k2OMK4QTd~&w~p37}NzQUmhSE>GZ zQiOP^7-SsWnfi5whfYvDM|^4HBA%9|Ae6E9utTXqf$2lRO;1$HSD`cY5eQnAyzDOD zwWKo>L$V?$VORSJAsC`^x2(RLVXSfq0bK>z`PcCy9@w#)J0)OWr2147$IhV0@7Eyl zb8_nTY?b3o@6$h2vRlqSn9L}EYc?ACirJ{?xe^K2K>|*v+A7S`l9A)0N=eA~0S>VH z5qaVDpVrj_qpti+mB{&}9r@M7mlSY~w$n&U0={m(Lk(reA1icMqxge#t7zN?cD1JP z4>PS?0L}?!c4B)0P=yYx`0Q>1NDB3z4WIDqlIBuM3@~MwU39IHflOF8RX#6dTkV23 zvofpbruKUo7@me_UpV)K-Sy9?dBdx$+u35ev#NJ)6YcrKf!?_Aq4kKufaW8xHz3qx_&|25&hKnZVM~KnjdGZXX%Jr^jkU;Fa9z=nmT0mjfi=B zW^UtkW>7OmqF?*urozMg8(-5`dmRhz{O30Gr6TIN~ zkR8ZjX%hXIfBRaQhG9aBCaX1n5Sx7BhvrJRGVy*I2WymGNPA7*GnA1c3f-Am@N__q z9%TdgZ}0y~i-p>M|abNO_f&@C{D{uNxY%zAP9Z%kd(!H?^WDLRDTKCwBgam)rw0 z!z?+~AA+4N)!PonV%a(hxNG6w)`23S;Fn;8gle5>YSl3e(RRr zV$LkCUC@6~H!HDx?$U{2V&b*%i>~?3J&HfaYFnN>Z0~}GU0kV^TXufHZLZjnPpc4T zQFm{WFyUND`Ny3-wx%h7iQ3!%n86Bh-{iD4R=mWPoj={xvvihM0g?BbAOSj@rSns8 zz2f({h;4Cb$N6bb+`VH1P;^4gQw6^g_6)cw7tzIvzG}QfYqGPb_pZf2`)~@tUTNnI z(%hI|iO;-k8{(c0iWw@lVk_nH<}a=IwO{^^vHB%bbf$n8VR{PIzkP3X<@fdj4A;Jz z@{2dig*k&L6@f>fg(S3abh{s@UHxo`N8{my+mfH;^cuu?{V)Sh2{`oPyRdWFXVk&L z3(RN}1MR@iBe^vMHpOaV_9E-dYx&IU^3E;$jk`NTLDN5HG6rpCBcmsPv$Rf0Op)09 z3h8p<$QNWJr8%45Csq$DC7Ldcdwk^_nQXF=Q|j~dE`GYr1J;w7BP?`rVz+f&Yfnr1+L75^Gf#u~We~Sj>R>?le8Im4b^NAw zX=U0iRkDQ?BYp?{H`E=))a50-C;)nH;_^$pV>3O)BCjaY!wNHo3{|zC9(PB?9rxT6 zBG$8F(wt^JgHymJn0thr`f&%(FrKJeKH=%)y4gO{{Xs5wPVFC(&Y}{u3NtN#;*}bP zpL(NSxL0VvNI{hEJAE{+Er!j*GQ%M>=;BuSy{5~>=n9P&$;fq~AvEdcgqjn_impI< z{8NoKeh{qYmm2`(QBdrzu|e@dn-)v*QI>aA`9bf^hV(1X10mHknCa)7mQ^ijnBY{6 z;$Q{w00^Vd46TI6AE|jx2(#+%wy9*O!+;eZj4Jy%RtYujy+73R3;1{+m=KE{qf+877_fbiMT*GvoF;}YQEjPAGlo5^I) z+Mk+@TJ(6?^hER>7^i+4BO4NU5TZU1b0J?zp~dKAO1P^8v9&~P;D*2q_i;#FE$r)h zS9NGUorjnsbNdN5G`WB=_i~xZC(m{F&hrg}@jqj`OEkJB!^5u4xaB_xxgTb!E_h!?T46-GDk3OLZiI5mz@6-2L#p5VHz?S)!@LS@2&B-OkP8AvS* zC1$_GgVrkOrVFx4zdV0&{2CBhHCu@{QbgV#AERB(u--5(kK<8}yo2XPm`<)0rw{AC z_-`(>3>V1$FD{Jy4}SoNb3#f}{ss9R{QAVda!B|0A@Dl)Q=Ikw;{^i~lzD}S``ejy zQGpx?_7J#Q3qSwY`2Ut$ko@^edAHXTsneeTpE)xg*9UeZQljWQUJXkmj8`2kfc~G` z|1|%<9pHY?6OPrt#@DEc{}&HfW7^(Uc&qTJCDHt>?&SfRx_e~X#^k>;OA3Sw_L(D8 zOYf>E{pwhyf=N|DHjVHTYXyQK#l-wZ%A@s?SE20qtKzP_WrLh<-kb;?->Uluk&Lqy z_8*(Pw|oF`LU6)>^>z`P78i}nca0SP3jJe$o_b%Y!C|jXb-G|S?=H_FE>--*#$(G)-7*W}pZa~;= znbY_Y8tvEb`r?Q{bRMe(j;E?tLxvH7xLX?l2E{x1Z_JgaTW^MAI?ns5iQlUD^5NKr zfe!xv;syOdqy|fT0t`1e{rOjK8sUxt{!@V)*UFe;k;)a6l3K z?;^%~l*Z0|Ere`Kt=#`#Vn~+fSZso@6Z`QF-YjR!RExm^>tXD|*7?+br5Pa0E6-7P z)^OzaB=e_^9Hlx1+e%U)_+IgtQi#{uAWBTHYoN~D#<+99hUC|hDHfxt^eaLR9Lu{O zF6D?{=u~z*sNJtu|8&FPRkE`&rRXoCDEA+*u_}OCb-akvD0dds4Q_ftUy{{dmHt<~ zmwW#|w7aD0_YnC1rrRs#fLDgrKn~>V7DIG@4U4LpkFgLHK$*#y$Tf#>-7e7~nz(yF zTLP48JhcZXe_9dcu{8X1<-ra*xnXypcbQ}+l5YIM?kNo;&`!`0h5sRx?)c65T=seT zw=FbylpWc^HP7it8%hj_=L_6N8Tv zXFSf!H;=S{Sj;f0HUWZ+5GU#^1Urqf{Qj%mpRm+il|7d7(M;DszZuEGusSn24o-wA zE>n<&5v@srMo_YMQCYbGRnEnAp!1IEgTZ*&an^`D9dZj_-@gphhA#9@3HmqWcC77@ z7Zl<8*>2}#!g#327ITJ~`wX#pzvqKFHTwNn~nSsD)?l+58eZYwzya*g-Ziv&9H~w5} zCWw=1-SY3+^|#YNpyroN)5W%mHai_3(td&{Y>5AX-EFk40sAWMf@LbUwW@2&*9gobuA321IiiAaf0|jP!^h*G-K*^2RsGeu z?XFwp-G%oLXzaa&mnuIQ?(QloU$WE^G&qfXJtV&-d2l7@x2@ryviiXBnewWlZhKj2 zL&cv{o~VdQoPAo>(86|Q}Tz+ zJ|1rg!p3juO*{-K=oi&%ED09oqhp@u+~v6ycg`e;Eqa28qo;lxAwwU0&yAo{==OJ?zBsSBhc z7fkJ0gCDxG;$kCfYyZ+wtaOiK?YtM6Dd&bn^FJ{#$%N=I>`xc7*2~48jqc$(#1>M$ z2?lc{*Ix@?Vj3h0V%Lh;TjV6}D^9#KZqFM09UDLlx=Zzy$=1}wHmtl)Cz!Y>V$8DE z9a?O?d>$M&LagiEl^C0T2~xY<1YcLH5ohS!zt( zpUJ=OC8O=tBHvM3&#PQxH74Mx{Zn$ws#;%Nsh-|@emVhL^O_ml^pZ)ymn`dqa+~NVZwi39?*Bwc7REp8Vd9rFepTdG$S@`ZR z9YzJ{;d!k@SDktr|5^?v<^E^K7b;Ahg^xGXIlY))OLkmKU*Zqibss5y2NvVWhBeYV z9)e>dUi*9Tn=$8%)>o%{HqaHA;J^rRXyrToU2Lo~vl^nQCXv%aI3p?y&wI@S!VO+^ z*J#Ar;uvsSE+hTs$FPWeJ_6xOpUS^UTcCpj%Mtxil?j+q(^{IILEcUmNnLnvI7R6W*4YYqa!q;VQKPs`2u;sPgu! zTjp_1?YGA6p2gH{NX=D%$SO-mHR#Xn3ig;e@Gir56q+kh6oTn3^D_NvN7sfA;qfPV zI;{rOD9CA#gnWi>nxYRmxR?NB5m5dy%{Q z!`Nk)ecy(e@6qf1`Fww$&*S_1i<$er=f2K$u5-?HuIoC_=SYY96q-NKdb0}h5Eg?Vf#lWPrX?RRi;Ov7whbtHmN@?a{dODW=^njBPTgA z>Zt{1<9YmnycbfTb+c@8RBwG&aQ)YrhA^EtUDcnc7rf>^^>#r5oeXZ z0UIhWnds8iB5{vs!YEX@0l5P6ev>#?v|)ydGq{$zD6Ks+nD0j$5KDXnQnZRQ`$YgY zenwwp{vblpJLJl^s-EjMedQW-HQI8u&WmyAO}?x$arJ0T#ydHib#88-d=@BmN+aij zP!`{vClS~4M}^&)6TFWiFF3avL>9h~PELJd>XkQ6ny7S0U|l_mcbWfUtJv%~>!h(- zgm>K9SEJp(xIWg|YM$-9uUR`kx$mBDFaC?8Z_C@Aoq}_a- zx}1oTLW37ne`JvU3aqdt!STb6f!fbY3*K`+2L-!%q%NKXSyBbBhR7@In%;vYk(v2o zE8@NNi1|S2F1zbpc;r)BvorlcERO|ohH#l*v)#auwT7{Qq7$aBa!m>iLc^qzqwS1#9irkwrYYaaZ5g0 z#UK?qZ){r-TW|2I!*K6e>T5jMx7jDC{4II?hjb2>2Xmr3JPt|d6Y~g?k@WIo=S;)g z_3kEx*4}#`^!jDE3znAWXTsu(eT~$4&fzN%F!g6dU^TcrREd`cFgFhh@pj*JtSIHS zz@K=sHFfMW$VSQC1Iv~?R~3kz)?d_WyR)Z=Ce-C^J_fm;(>yoj<;ZV6$D2v-E3gl zx2q_~#b_dLw}vhVYi(O{Bc??OmqTL{@0J2H(|j zU%7AvUv@=vuyN3~t!*`?;)3n)ii;>nxL>dwgXTZ|C$0paY4$TOY2Kjx*Q}6HmCJjv z&pypUHQtjya9d^~5CT#fd;Xn23ldL#Gwm$QDLXC}@@u2p;hD24*qh1c-UlS0TFz%5 zoVlLhSoU%MIP^GgNEIDRoo==VQq>?ot?5er%+7N{1#BaTEYywsB#{N-^ejiBJOih3 zBSe*-fAe=d+i_Qc#OPgd_ei8ts^a4dKgn~W&V{&=2Ntj`vsv^+;MD!zytv3@QN&R7 zi~F+|fV;7ET=d1*cH&3qg;i#76!ikM_sONW;&x*?bRA+An>`Qu8p`{m;^=^$R8`rtL)e{>QYC8R%B`1t~K=dFvh z8hWxzx=dz5U zEuLh!nMc$_FSRt!-LOtBZ5=#^4RB9VIEZ_lrys~rmyudJ+vTL%M^{P%D$1v{?YTfT=!!ZyH_-N@e&F zs#(bJix!o`K&Jg(;htB}Te^7nQG2DQ%$&7Tl)EYP<%`#87R^`vBvl>Rv5H?`JAUX$ z8jQ6PZD88K7oQmlL8rm3B8O?~VHxrFc27cWnYW*w4%lc+s?^2bcsCzd>5%axub&o` z)U9;Exue_2Ju5RCM4xhvh+)GpOaZ6Zf*0+0;jG*%veHQJi}^fr>xhEqqj(ma z%t0hQ_cOM%w}8oS>F?8lqPUhz4;T~%VfC+T5}l<+j$gKCMRZ?ba}&p(R;%*9PAAft z;(msD#{%81qlaN2ksZ?N$ReAA%_A*=*iq%#0bJh-7Z^pq1Zv+6{Um3fp4&@5y^GSY z`VNEb)kyu}ckj~5xi4*%?+Vi=B>JZ=&#_T4rdUcl=+w_? zez&>(@gapv)z&5G_4V)`Eo;Y*I=J;jCV{*q< zDs(%(05v$&Ckr9mJUd5}? zK8q%k%cbhhOA4^-eX#n9nxh9jNB$`mV1H46c6Y_U@qDQEKJB`V3uT@Z)!nE${=mh( zF^cteH{D>wJi*|gR6*^Ah=_dI%B5YLq&Khi+#$daBCeY5M9N+dy8rPJ5J_$6+DNt6 z`5VIZmlG|FDz<9vSJ(;(<8)5#`S6_TvZ)&pkAjxsEtbP#>vtd!l@izK5->DUTo%QbLY)7wTA5pR` zu8a&T==|BP2kLr+B8ZsdNEX=L(J``XC(M=^(_prrIBe4CLcOzEKP+!Gr_j*}pvXl2K3eN1Wa;j8o!T_rl63EQf5KS2?B{i;tP117VcQJ{>n$tMYA-`rnUu`hE z$gPT==bw|4dH`C!FB5*|U?uB8Td%8sWF5J%>AZy0DHGod0JLaFX@3o^tvT!%rsDE)LsNq6MM`hKAUbx|eD3mI?k14B+1OuKfs+U-Y1d+V3=^TPvQfa8u9oPMkZkjri3`uZAAuLKSr{j z&}?J=s{wqx>-2sFu*1H3r!)MsdILl0@HW5#YTbiUpRdPAxV3Nnwdy0+>j6yaR7-@8PM5jE!w7zcME9tO#=YDNo+72q zF|-{O3l|@dOKW{)=jJdS@1Ig+K970ls5P1Y(@~w{)YCcU?oZeRN8sKQ6>^p;`Xk+S zs%CFQe4C}8s_A)0aXl>9sQb;?S+U+UbzRxhoB~jra%&Be-Loa&a)hFdcJXuVGV7rP z=&>ea>-nhKBj3K;Se`qH%RlYl#o#~$ z+xx3#D=%a+w+R-M<9WU|#LqjDFm%{FMlNiG)zpI<)P@fyWai~@7XK9W?7Dk(bo)Hy zEx-wmEiS`IlMbTtF(bD zWmaBZ_pL0wyu4oeZ0&7EAhD_EW!*h(Ja<=CMtv!}#WV@79(zlSwF>1l35BHk;i+pw z9>$LJ;>1SIDCMU=V?N~x(KYWMsw7sHg=xBtrD)xgpi0o{U)mH22-y$sS0$4+kMWfW zTQ<oOXQL-kRZ1`s&n}gMGYsS^F2e*Oa+D(DcraX!(GRx6^y#&8u(5F! zL?!0J@Yzj>y)}zSsn-b-xVI``;34=U%dl+S5-QbHnBD#83mtf9?n0*m_=!=YrGu{e zu{&-^iXtz+`vZ2;qh2 zik}2P>eGkv{;NZa_oDzI@2-FRUq!JwF;C+G3iQMM-!PQnM0$iKHMDY6Tv+@yM15c@ zbn(b5P15(uJLGL!y)BNQ=`4G=ng*jb4mFENB;OJ_NZ$>hsgsdH)}4hlP5i*f49#5< z$0`D%R1`ofrE4W>?_#HTa{(lTPZz4~e7lE^*`A#^>x2)dGBT63ZbQGyk268#BMTDM z)F?_BEh5dYlC%EVZ;?Xo{czar9_LczHdGopnrLh~ms7J6N(C=?Zs`82lLDW;Id@ML za7QV<#I+d2++#9Sk~{RaNv6gyid-T;c)8O?C4zTxX_gT)VHLr`djrEh_Fi%dVPDJ&#i9G5cU** z=x@#BjH~JlVnD;T$#0KLPX(|TIGBFdxSufyw+Z7bcy4EdD2>bUx9?WHcz7@QiPCJg zlbOkTmW^R5J2Oc`biQ9bOB{!_DrZox{|6Tq*VboejP&(*UWJ;l(qkN?r|m=}*~9$Q z^(yS3H+!yXDIF@PEjeV%W-Kry|+HzTx z9@W+(<*~!~J)vw1$Ij*3u>J8_q z2t)}XpowZI=nM8@mtXDuCMtN>Z(i#Nl$+8k*`nkE7N}l{De|QdEly($sc*HuHWkEN~lw&8| ztz`Flk9>RML|Wn{?IgvUQTVekv4exmkvT>xyhD}+-UZkBBL+@fxs3)qZulW>2Jn_9 zG0o@EEU4vhUn`iAl66Ys*SjJ^Exc;EA_$Tq_7%Fqe7fl$zptO8``#U~oIbgXW(PaK z?v-{6yhX!uu9W|a-;$HWs@#VL{d&iF>*;PLkVzCwxkI>~AkadIow zCqkkkHc*jyIo*||9?qCmE?A_n^y3M$zD;&wVy2#puJz(j=pTWs1@~QogG1Wg8hJ~Y z2S+fAIGN`8-cL<(_|th-tMzff7HJL3w55G6B+_DnFzE$X|Nd88N(g|1BgV;@{rXxE z)Z(W&KZOQO1J3r+~)<5xews|rY`?} zL#Y5Xx@;@5om~hC(XTkUxn|gb9L;oZz zO8ohl{Xm~6^Q1WSQ1(;gPaw%Ry}R;q)MmcH}u8jZAWeg*qCXVsSG{!hon8N z!v{%)-_m}q?1=>QJ@e9{(s~_tc$z2T%<92k(;6;oxkcs$W5Fwkx6pL63sGo?uj?5^#j@>Ex4F>j@OL!61<4_jnQLsXwvnZ%S5y86Pve0HiRmg z)9KQRE+aN>iIB8lcDLc~Q4(;Nz3RTG+b;|>EbLQmPxwacgOY448#Y$ta{xSzh33Xk z)qC^6;RUo0jaUQ6+Wi&Dtg`O0#cNQ6?GxQL&6DdvsJu+97L&eKx)x^$TMU zl;W!T1^YFP&p?Mt2_K;&=4fC>i3al25X|qho~&m6lw8=c_dR?R_Hj=&I30L4YaEoUGWgwjj?}-`$H9R z#=66tcAEFE8is@sV%;VB#%OalQ?vstPpCQWmm*{LS*j%VO6DdYkS6(gbVE?*&;Mx( zyTBCux`U}yKyUCvgf>^$TR|s1!~tsLiK8Fi7z?x6@6WO~o^-k%>z$-^D&mYn6xZK*c?jq| z|5)!#>|q^aM7HD35cO6}@alA={ZAi3#}v+=2exw3COPKN0O6U?F2!b$mCPea8ZGIO z$bTf7_^;%K%@zmIYX4j9qY@>Z0{uN^P;uQD+SmUMziD*Pd@?+$1Q8YcuG^eCeRSg+ z^mz1)z6vRNPX7Oh!}V933f~^Z**E_!j(I*!2wwlmvjkf{N*vxyTf*}}(Be|fpv1?x zWN#1Olw%97p!uOm?g^DdBzez)E?pfKMnJnu^^NVLI0$`noU%zRINujDiTfMn2aNWr z6?Ei3SI$}E`)Oko;rH(C;cun-K5tt*f2MBZL~Z8@D8~9KLVS1A2|xDthF>QnylSXa z*7Rs(4hUhwDN@=0t_CYnPAN!XsO3*OXTM%7EXX<;cmA8Y@q`MhBriotX$vF+z(hwg zP?_g-pHAm)%!6rZ^vottUoUFL$G7e%X8D&oKO*Prbxv5RL11)S!psR^z<`%|@nD24 zZ9PE1>s6Nhv)n}=+K}H{R5EJ*%=*cHvi{erO9%Hdw;7bh=gw2D#bEXrp}C92-1r9C zMAI1kUnfk6+YINwUpnXZ@=zd4E)=b;t(R9WI073)V)Yp9GaQSXO?`hXQ3N)tnccMi z@HXDnz2Tm7dkd}fk%hMxX?1C9sF6sfDR4_`PPiupXt2SKD>q}V6_73W$C+XTKDvno0N(%jDjIWM%Jolyf=GT8meb^EeiIeUWZjT!tbHxEi zrSuyzPQ_=3HU@72tM)#_a~GUi*`v|F3-_BQr)3v7-Qk4qGn9?vf8T6o>;pHJ28`fz zwZfMMD?R?R@c&)z*FslMG9~05(NhN~_(7smJ?#Gk*o_v{sWWcFEV^<_=_=ZjWMVu+ z3r2DrdV{%8fX`y65q*5O8^`_G90&eg=b5&3OI&ZSbsp# z3!@U#1lvX69S03NgVjB)ntx&J#HoZNn&)uAjdO_FR5^;;>QCb9SGTg2uKL2*$CW!16>J?31w~@JcEkd;X%W=GT=u-1^3;GM~BE9*-)vvr{ztUkxBI6stOm zT2bklTos0+o>OJUt9!bSxE+>#%KJM*U+hg+X0YBMN6!R1> zQE@V%0kg}!-*M_5Ve>)rdfdAz9M7Bm;JwMPKl!D7^d{N`zc2Dqgh^VO8|!_iB+MMM z)76cwzMq>roUouXarU3Ney+Bhyh{b2WqVR@g5$6*HDUE9#mhK*G^mDNxiK0r9+$J~ z%;MT9ihM)<**NB6CiXd(fi$soy1aIJ_#~s(q4MQj-^G@eal4oKJPVF4fvI5x{BO~- z4aA?;s%4*Ebd`Szk7lW%X_u}^T)ptqLhlcuUxF_2uuAKQ=+jj{uKovSAxoFIM?xRv z`_n4D!YzNKEQ=%_a$Y_Xb$j^J)T#nMu$tCPn2SRt8_ka2U;jni;t{dw2!Iz@A>WS3 z8T<(M&;T2w9K$QL&%cH1TWp-zP-Mnw;jtPj=YQwlJx?9Lf^$h7ESJU&ei*Hpq!OW9 zWq!weE2qR|b49;ccUOCGgNQr%3qwwHpe*Z}?6+1P8R$Md9pi4*mevn{u|lvsdoovM zVDpjxs(y)WH@<}(k47OKI;z z4;};$U;U~!RcPV1Atg&TDA7t!#?w&&el6Y*8m=&*&LU;~r2k5ahm zhx2isHK(A+uV4MV;uUV_ zT)00+`QsC1cEEL$y~X+c^=G=(-Y?k;chc1$URBzrh7klXF`UkD( z=OO0zf|{u2-TOGn9DqaH;+1;6c`@YpUMWUo{K=#%-DQAgRw$~!#(Mko#bg_Z8S~5R z?b%OqeunOS_uP*VQ3u(F0}aJtYYz7#Y}?G9mL_N=B~qIQyUy}!;#euBStE5lOAXRNS$UQxB#B_-M=bqFoU%wzQqt7@+|_p8YdXAX0#0b8ftrx3e5h&@VAPhjZ>M?Vw(Lo!#_Kxv2v>ts7S4M4c* z!U(L~e609@mHvuPzt)r@oHl^QYP_N$P?6zOge@9RA9)pUV;Q@`6VX=mB3$wVQL)MK z1w38XXjQI7rYo?e8=th3-T+=G5mNqysUI~Cr?u4HQgCDJ;rkH7hKfYdH9TRotJV#g z&sQ26JrbKaI(HY)JKAuyqv!(!Y)jwHCT8&Dtmjc0WNqyLr)TxG)va^m~&A;hImYcgYl$_Sh)>&4cN4`P)0sFjSJ>xa(V7udY;&xKbgy z;_tJVdGw!z_VbDLQ%y-zbF9F5YL6a|gea!R89Vwi^-n+g{c5|xflhMdm5Lv>nTuPk#**bJC+f;jJ0y^;lWWHUW(KlCX=|8gxD*qBknkBujy^%by z5`5=8;~yzT1C^hzw8D*!bf{OdVb@XW_CByf5ZKe7ypuNd>?+k_Y z7Is0KG$)bC_R$)L@HTt&sO(R9eI`?{g}{It>)|3&dB2@Rs^|1k+Eg!vF-4{mMY(Ay zw3B)fRj;d=?`lH<{PWOQ%I#<#qUVVBXNcLbhNN@GuMcu2Oi=X9C2Ev}#8cLbRmC}bP3LpUiF^m#){+IR!FGU{a+ElKA)hCn{i|0v zbN)+Bj|>QO5N0>Il99lSeaqw}8Ua~3xtSLOyyH2uStX&YY8bw@xeW1xFH-|)wKS_g zoRU?j+m&>KQ9_CXgU+pL4`-Hr7I1@L71heomv@6PM=K})=<AC*{63Yo6Rwx8|q0(zMZw z*|!xQ6$^=jwEPYc?E4tim*dOP1&l06;$ z?z1HDia_Xypt!KDyO;CS1VkoH9Ew%(-piCZn;jc=r#l1!Een_Hp&io}i~$5{XXZ|# zy}U{?v3IV*P#I3Dyy~-qm7p4*kE^%pe@JB>_y}O)mpWS1pH)Qb(!ye~XPJ}y4r4BZF;{jKAoV53AwHkYz zHg~utHPZZ&)z0ZqHn$zFuq7`!uQ)DhjF`mNj6l54G3*7bjDrs5iv2oDgMjRl-hU;t zT7`_C(diNQY|*+1O?aV}w-IuuW>8vN4=VelnQCH+)d#+Dr)GoJwO^F?sL}VWX==mO z&vQT-xi^wx{;x7RDdIgT?;Yzc(v_Km#3{6On3X7js20Zkx8!dY%`u^LIk)w^ne`c0 zD9J$LRd8gJ<)FWP-2ta<5~o)456&z_R+zaaiX*H^iit-PU~LvKp=Y#bm7Y%Tf=S&6 zhEjH6KtUSf{(T_5hn!e;e3+*ut^dgj2Gp$Teg3qTcXFEPV8j=B!lVubB5iMP6C#Y6Gn|^{6$2 zWi}F$Ec=#492_;e{XA?3(^cEi-$Lr+BsNbc{jVQ{X zji&9S{-0OCv5tm+k9Ax*m*?zvXG~pnsjF$dm1LKFa*r8`c6ENmyrsBBTe5-AOdH$U zl@(hM&HjFE^W{@Vw46-d(-=qfhN>(4FZO0q=yFh97-@15$9ZgLZ25%%0lJ4|$p72o z0MH6W9?;B#9kaE_R_?p0KAFwlfz-gFik#OA-f!kvM383M~MDnsm(?;KZ^9C~9!zX-n( zpx<`>(H}Ty2P{quT``tu{U3P~51-?y{*T7pPb8P9IKo`Z;+qU2Uubo!Jep6du|3$eI5TFI3!49P!mKY=_LK;7NuT`Y%dfu+JM#`i z{;Tc1Ff+aX8g0PAVb&i*u>_F_f(1<7BzUY-aGr+*6Ek-9ueiDc4shdgHH6!7c-Q3b z&DPvtnCaesn6|6Lw>7J{mAWX^ZEMaEp-EaiRz`xmvaZPa|FW%2U|X*Vz<8;VPc72O zpJSRh|7kO8LM%`WXWE`E*$#tX>ygq8;a&B;a|plb?FmobEF|Rcw36Po2pvAQSz}*S z58=d;@EM#>9ksrCN(3*k=@W%V7DQRJydys@ON-&%bjn_%g(kdZSr=x)pR|62IQaDE zdl=Dp3%FRtHz`KJL-io#t0ka^&xSX9oPa1)G1v>3)XP6pO0fwAMn zkCS2AU%rc_O0&j0uNuGJShI{c8udO8l}ZF z4XYBUjiaC8l%sEPx$VUX?h=81CaAeW&OYfZ?S#HIN4_|5KUYPg4I=2xW}w z-etL=1;)Jr+dR%$MdqND;r?)69Y?ai!TAYUOGm%m7l*s6lfdQDG>9B$wA;AgQeh+u zNKLiOWXu`)4PSl!@uHoh9tqe|4cA&+-(>-&ESkHJ#owH-M88W@H=um>akg zzv3Q9d#7qxRT{kl6q|k*#rxtONTC5YcaaefSDci_?I$zw+In^ygS}6SJpm_aL#5lx z5XH@1+h9h2q+R=opb<=}%1 z@L+0huIF_73uciwHmBoQO&ue~pL|JJ{W%CrL9{9~yq7~F3aLiE<~0{Ok#UbGr|eYWU~->s=~zZhD@Td!OS!`E)1n1gU6 zj`UHEX~b4`&C{s1<9`+dp1#veJXsw~Ju#>b{&Jq4U}w-~B-gkfZ#-4zrTdKOKeBiI zS_@H>csAETA7FDr_bHGlIRqh1op@4iIeTLuMnmG6Z8W3*b)JY6_k*{^u49n`bd*Sb zo%b2+UG~m#jaRwAFM293ZDp*p7ZExccVRty*29Dc;l5n+e=Xpgo&!n^hBa{Wj%#zC(B*}>COUlxi0>0kKLo%-w1xyO-?@~-9de72B z2~h#uj7nzvoJnK@<(1N<_GCDdZC)b$wR+A$1*e^Vl*(*LoH37IYV#3;R4^nraGwO( zU%?qno5j!1I(y{5sR+L=V(Yz2YR~%Oy@>38tQtqnv25rrnBB&6&<4E!1;oyXMdMXd zj@7<*<$bJ1KFKn<-FZ0p7$(Z={b&!>`Wvt6jKS)JFYi@XZX`-`OktJg$?um(cz7Vs z9xrvderEN)rNZYe&F*bDRn<$D*IJIQ{_G|qNy@JN0rE-*P33IvUj0i=8%_aLuDGb(0Wm_&?GsCzFDko3u&489yUuIuk9$zn7<@0Mf9Wg?%n5?l}VF$==q{mb~ zgpW9bD_%Juzse>1BuTAdMV}+Z2_e1OoXY;K!j4jQtJblrx_Nymlh*WwK*y60q`9QA z!daa%?=-f~#Z;1)fEz3~GggsVaJI=@!A|7i{Jj-&LIG&G+_=lma?%gHU2?1j6;$_9 zkGdRvhQdhC1eG>&GgV+8|K1-N_G*=El$ElB*Mar)CLfHayxeFLS-s2k0q;k{UPVs+ zCW}IvomWoW>Q=yB>ME9mw%?on0l7+u`#E?%*M zcd+w8?yJv=8uAd?ei4h)Ji4hT^1JII%+s@iESWaG+=Zz zd=!)^84ipNh%IzaO(}$|O+B{l=xAFR8?7OYRaunEAfvrTT=jJpp-SBScIVX|(fK6J z3Z>9pKpUy(ZF{Lk%Rav)t~~3$LJzh&&=2_73t?x7CVL?J!FwLY?yDBZ>rv`Wd~Vt~ z_^s4XQYNl#8?JX1v-eB~(b|5oZT|-*ZCMnL=i_~ue9H{`c)~?O+-*BPR@B$?b?ota z=^^hUo9OdnjkRK>k@7n|C(But7m~WFRsqhtPoG4KQ$NuiSWxKIH{ucbjLd4=u}G^V zuZiJuy{r)<+cuu`Bix7raWwHqXsc@8E%=2vKNO!pVr81?bPHG7UoU;v-+zD^Hd1Dr3~1Wh`1q zuM3sP*H7`WI$*RE0Y@iXUEZ3;JSJZEIL(tyxhDRa#ZC1T+D&&LE9z{7PXmrEf8GGJ z*vI$HJMw{?W}xZvNi#RCfvm9bHY13G0B=?$caRjf459kyhU6BrmRK)UKUZl~m! z1}jd6!1_^+8*O0X8O%4dpykmnqwPd08NPDv*wo(6GC7YJZ%+a(yB88M%JsON0C<(~df8GcK=E{*fKTcBM((hl`?Y%(vS zZ*r`^CN`n*>_5J@U&%bI$UBfy$&2n$*VPLV(7P*PK4aIFFE01Fa<0`&it$^``mq10N@vjyEfe|C*!^G^EP*sGk$~n!7?RYhBpeR zbH{VqW=rV-VpU0KOqqkdZdZo*KzDrVs$^%kDJwKx2v`Y&G6yMo6_gMGozXdp*ZEVj zaQ8gxOdJ)G^f`BiT^U&?{D*BgJr9nkt9I0XbB3tDSI`jT*H|0n zB@y$2Od78WR7@vS8$cI6Zt- zMmz1hLG(lJb=Gr@hcnWFp)^Mk1tAiDUMS`*Za@=M)b%C;i&~D4j;QyYco?kzN*&q{ z4<&p}*OV9(sNUYlzCF8+(v=MddkHhpZ@>kJdLW5}A3J{E!Yd$Y(+#05Qr$!rR5RnA zBRIRU;Q01Uc=9}9o*k_*CAY=e7#rPy{v#^O#}gqzv{2AK6+v!5%>X{*#u-JD) z?PH%~V;@_%!O}nSZE&|$I^gk_aFyvpnM;Al<-y+unl(c~`#DFWjsLGr`av47jJY5Pl$*^4O6(J-P>~i&U#iL1b zrg?`6kNgUhnScbjz6ZCr^|naEHouH#lLa^7Jz04#q9Kxuv5PWU>rjw|3J63@vhJo) zr~=|Z2u@YcIHpkNJWS($aMYV7g2A*tTWJ?#nOhKcxglpZ@sW6W9Pbjgi`l~^G|CBL z0=3jyV~zAvuQ<(#SgE3P%|3k__os;p;UMX7^GwUnP@jh?U&q!%qjtD2oLuI9h2#pG z$1l8x?0$9rQTV7bqhNF#>sCuYS8YS?IgkALYBQpE&4bYNLhGtkA&=MB<>zJ$Ri%f9 z604(8?YnCW(ieCt@Q!bdC}rh4SOPu(_;!2$K-$Y25~YuHOuhOLrVhevnj?DxkB^-E4Q=$R#jKlbO2T6Hu7ruP=M|lx|+}TyZ8a z|5)`I$StPCVu3}mx{f@5+wL_bS5DEnd~-*;yn0)U-oVVr{ioqvyH_2ioE6CPrva3C zBU%7QJNLmx@3Qehf;m`&>rQtK8fICE&S=f+UedV8pC3# zy&YeZ@->sLS+#9Tt3Ue)sKjm_;3Dpb@EFw`5#_q#f0N@an_@lGj}|~->?%B(@^Ya+ zJj*W?`W;I)DY5oE7bES@B+OXLn*c7Oy(70c?`uG=B^Wtjzm-pr1 z6?6*PsohC2?izB1BkqURn=rY~h)v>E_2$Lgr$_l4b<( z>10r9xVWC9RxvF$CqSIcp9TRBVfQ)?Ww4Ic=B>z(0~B&}s-}^4|K6!|=PJ_k>l8N~ z_$Yk%aQSM{=xdy{|El<}Hie!Q1Bx(lJ67L-(JoD1$o^Y>C`oQB+h&dUDG|5&o?C6! zXBr)IfBS_g2B7A~9r7zx)a!6=fxzj9L&PR+*}L7SN@Ksl)8x#QK=XI`U(6&C(W*Cu z9mB^qpJhjLf?XTS6*nyq%b!N0^^fkW9`$aYB(5+8itaQD-4ov(4ZL^xZwsZTSY{^E z9av9Q@E06F(5~Zg)k_jyN^lVSX==ynRP4oX9m&F@IT5)BnIVJz>-)Ah7ReS;{6v7X zIQ`~WA7U$-_hR&-0u&?HvvSf#*4_rS(&G@~Ss(JNh#1Ou+A9wacHbO9ycM^cSFQ`O zpQ_|{+J+f3X2-r~{_8(1d>~$or!;@gqYTsSHi(WtCb;oC(hxyR+uzVJd0*j176{Hy zvq>%AEPnA=uRn*-ewol@Ko-s~9=m-U7w<@yjxXcsns)MDr@kkhkghSAZ16diA$`^O zhYy2Qvxp1FGl*mCS5lJ+?L3vXk@hu;?BW=iR*cy1h5tqiw$|`Gqk|PtD!}(CVWGBx zmcz!@!Rs)C9XrBpcf0F3uZzALlU>Qx4{t%Vy8m|RVGf}ws*4%$C~>qWZS8~j?+>}{g4M&lU*(o$m#*Wi@A#=5U}DxCu!~~=heovsf&{iT0E=Gly6$Rcc}HK;nG8xo!gb7 zb>fS5g?cK$9W4+RhcSOjPS@e+@?q7^3%A8t2JAO_M+#mfDZZ*#|Jyca^ibJtX~G9xy z#e8iU%7g?%CQwJ=g6uuXD|mqvj`2f>qJ3$fhl(}z9INo#MXmLl5F|N}icPh9daRD+ zhYl(w64buxeE0Zudtd|&w%Z)P$IjO!@-d9Qip$tkoT@pG$GX%MuLp#%sOO+#6{oft zyp#NaqAV@WTM;Z>K!!pi$9r%aC(wf1f8$z(|5uTB&OQVd`hG&yvx530Fg8< zmv~dK00AS4cvTh)UK#Z3m8wc=^XJ#J9m&N!U3R)5g*CwbYCCJC+oUNHf(*xsfabR= zP|6@GPpg%ApBqJZo&{Y2fcio&CQ?4GYwDcRUTJo!9I)ENkv62L@Mj}-u!bikYc54# zusPyiUFv`}miWJvW22XxtiNZd7FRWQ#2_Ek8gBc;Msy@yDN;lrwL~SKR83)dmT4t< zZFD-oOX1ADo)hUUgW@*bZ6lj^+m2xvCFPVR(+B^t68JT;3-g!81OIFgz%U|3!L7S> z?$d`5!l^r}W5hceP?m>Z+QSwU4j=uFyGQsOrIxJ$h^%2ffa?}M($P((S27whc^qZ$ z+4;a_XzBq)D{%KGJW)2hNb;s{?<2p|u))uijPILwI}Eh-dRb)4hcfKa!UcKopX7x^ zy!7?%?q%MZOpr_NbH6;X8!%!5UKrOJ4p1A;B7D>+!$H_-r!(DKOukVvXp~Kdj?&Ue zu>-{>+Qb2mPaokWQ!$_%h`U1l)c0)w!sw~&gV?=j)yZ?l(aIt{L1Ew+gpvEc+03IL zuYWjBt=1ao-7TpYzV3PUom|tMDwXwCH8p;1rgk~D-AhMbVa)8R>=V@p3TV1rU%vOX zMPZC6>gPg^(Zl+i>k3On5P$dAkeWUn%tW6N$l{*C zafV~}w?kexax(x00YC_m~G+stXaHAHnnD%5B*nY zbqRemJKwi0rr}AscGHzt5faiLViPm7=wCBGX$A$x^GFCW?o6LDv^d3mC0DSmVmTi< z06h-S&svX{PZJoa!oIcCuO`6!*E7pUug!@Q4nS;E9AX8Bmbv*#dh3NW^>M$}`>QFS zfo5L1a@?y>*%q-M;q6mQlryol7?a2?Y{tK z1;=TT*SjELavP;B?cKXN_y4>i5>@rq)IV8XcVNcgxkW?E*@|Nv#+FxfCNgym>fWrQ z$ADyvEf4a%)#G761RaPM9m45j9#pl>J_7*^d1$bFiPT zOb%)Vxg&O#&Z3qxmD7~pQ>+IH(;wVsAd}rOUhj9is&K=i6Yb&Q<<_2XZ_(_3&Ec$a zmBVgrK~HtnVJ+#uQWhiJ#|c8WQd<5vE|9#_M47pyovm9QXa096^eZ>ZgGk45w>oI= zFAj~M!3fdQ1pp{?Xg9Exi^ErrfwYD1f2A!-W^s1kzusH^pF_v17YrRrwD-S;^B+41 zO&5paJZ}0R2txKt!ZPHGmoQ=g-YyXD2Izj$?)rjA58#vfvAqNPn-)_T+q(j4;hIE` z$FraGG1{4cJDth4_nL{j5zoJfibbFUAZceSn^nN+<5%i6GiI130Cx6&ID6}`s=lpl z*g$D1K^g%G2|+??1Ja6wNVDl~1Vq@RAT24~0!oLpw9+6UEiK*M{mr%U{LVSg`@GkC zUEe?GUTdy7<{0B1_ZVxjw{ZkiyX)XEMSfG1`bq$#0C%k3eM+ zr?;V>2$zEGvbHQu(1v_x%@vMUBM;xE8SePV_FUQ;?Ax3s2&ZAry$Hg+tOiz@)MjgxFBAoGmUsV zE7(G-nj8R|mdCPM%NOjur>`IIMRN&h76b_G_I(3PCI4HxZp`I1_poWo@l)ipumrGA zG*k-qiNH>*@!5R9#fpeYcXHeCP0DKNJ2#L#MUzvIHV(GPO8xS|zGl>+-zsZbAaKIw z^)pe}Wi`&^bLJbBplK`s!m+jg&Z84y{Ng}Z$f*&kN#zfB+M||Fqu+(TY47Ox*CM%! zQam!@0(3way!{{G6serv?9sWqcsw8TO$WU$8rn-+m`nJrV?+Qk6-ssDy-@y575hiK zxj0-<&)D1eddwA45mH9}n(HFZ>A>qd^hkEMzNCkmRYF^dtdZkKuPf-v>kw$``hTMHe?4;7n;o5 zP5`24d3K;3AH%dAvi~CRjL^)*>)LZa*j%Cikp<=c6X7e4va$F7s{Bv4Sg>^)%5QQ5 zZ2cn}zy2i&U_^y}S<3x<6csvxD7!$I`0oz9Cqf-Azht5Ii`F}TEb%5M?=#JVj(q=| zfgW#eFS=Z-xY+pscKMGwzUGB7L#-$ojT2-mz zx%e@7^a-|~88_2hZcufPdrv+n^r&&@DamtteSVJ*&4ih>vfx8o6$g~A%r_MOc3uSO zssMe^t8U?28Cu;*o>TboXu$c;ziCRRzTlV}Jk0(--41#Nf{pj#1gKLm57a3bYzc!- z!E-HAd#e9pC5tOo+LFK)@VZJ*P`3I1o1T!gL??XmNJr0Q?c{XIu=%Pptb+B)`GE??RGv-iGO^s1Yy;XE1{)aUgt`|uy8BH2fy z0Za)$(TalY-K%`xbZ_;D8G4_iLtIhSR2)}%R!saL zcM?@a9aFa6D@>V+(BW2i{s`#Hm_Ksb#x`{I&I3p9IN0V3Lx91P3Lwq*h0+~_JDMX0 z*A{PIhjiZ2#lBbeD<};YSrt&?_QnU}fEJ9kp(kV#&!-Oi_Z=kzj^Kr^0z(F>rDWs{E7j5@y*<})BKzsn zL$JMymzo(vb2ewxHI;%*eFkF;PPrbw>b$0-KAV)y=ArrKV(gy#mZN^L&cTWGxlgQ- zr&d83XuZ++sJ!irGxYKobnm0@l@9Jv(l)7c&UO^Nxo`faxJdeKTRv?=c5)nLeR?#4 zw@}FBUO&#o^nq9xin$`*SzaKZCb8-viZQH!;VdE5w05?6|q?T1Jeq0x|1%`NH zb;WHkW{;v>D_UXq*72dE;Yl%*cxfy5-|)t+)887*6K^+zQG2Xp&u-_tJ8ZGp)aLD< zCf9*yj+T7qbM^Z#H$oA)mvzO{PdMSTj>ZQQMt${@RJ+Brmcdgn{^f#z%KkZn)TEG< zk$5MU57m5=)+O|l^#)D;jvJr1UEa1i2u|Wf)1ylY;n6*d*revHTFKW(;}T)_l2Yn> z@Ph?UL7l*+fRjK1`eb=eC@-MmEKZ@(kLx+Rh13E#)&Y7j($}Tx?&B#uk3eBg^p}o* zpeEsiV=;qCsA4`X20md+E(|pt3g_|CGMRnURVLF>Qr|ta0ZkZ_Vz@5KF^>yr8*A7S zzYenuZ5cf@Xm{n&Rvezq)v-7N4H#EaV+!w3mECw6As+0Si}h-lJMbdjkNf7)%BkZ_ z_lR%G;mD#&JZNAi8T*seV?vAeC}CLVSU`ar&aJsy3C8v5aLOg3>U!}pp^a*hc3;z_ zw1l27YK|R+`R?M!_K-pQ-o~b`&l*SY^Ikw-cN`MJrVj3zetKaqRKFi{>^d3Wli&OB zQJJq|0^8Bh>k90u1L@rjm&PCVaL#unMm5EAO)O?_R%G%emQ!sP;B%N`v`mm^4yh9?f~JdHCd>2vPwem~0Ab{Po1UH>M**Keu!8nP&1vh{az|a#t8Opp0x` zkhnj*&)X{khIn6_K8Ci`$zVmsUvF2Uoeu`9wX40yO67Df)A(roRA=r9*qe7f9mO@h zy%l992DX0>6T$Zyri752_O4^9!?R;_X1BMRsl8KbexXd)Q{qp}f+x)07oyKyTWNyp z@kI(&x4HeeZk}MI6|}-9`>>YAf~qJt!SC{H3Wu#a?-tkt@zzB>_hsvX1$6cAo9)yN zgAh6PH4_7{v!!0nD)ld{KZ5V*nYd_vyV$sX>MiVV zgWf}^uY?#(aK(Vq~I?_(mkoaxv#RoYtOsS9(RBr@O><9^ND%T<|8iW2c1RjmM+R;oizR zYn3)c-GkvVPIr5U!mN*5ocHZuvQOm0WEbiQXsul~@^{_KyJ{+A%a>RqznF};wgh*6 z*)HJ}Z|_2n&0#jCDrhzHH{E%d{PALgw!3|=^>}ovlB*L|cB--8C%=MF=szfzw za44@%UylIb+);`St@MSaW+!|mb)mPKuEz*#fwwV;`dWj5gkIAaX2<&Ye%#%W=XDZu z?cu+Q7={y-V&&mGtonNjl67~2-=f%Oe&v&3PwAPfMyT|68*ezRsOS5`+=BVU>Mk1* zZnl#u_ASxLJv){8dgJ%>^@f{g-(g%dXA$h>szzsHw$g%rtL20{v3H?zUGWMnn1;Kb;bI+GT#{ z}-B->pG?bC}y?;SFGl6IMxOnoqee_5s9dOr}!#SCe_Us zmLgIop}9TVKb*yK`3PsigKXpc!}zf2TlyU`lY)vxnYn_%H0g%Td-q!tFq{QM#AA+A zEP4^{>K`UmEEGEWT=0)Ux%?=2>gPMg$`L&Ut)hczXV>r#^i#O0pD(J{$5+EQ@Bdno zjd8u1aqP_J=r>m#5V&6e+OE1b@pMm`m;*>ANF7VQ+8wl6drEy-NmRQZQ?_JPMkJBW zleN>8v+!YjyyT+|-Z3l3o0`o*SJs4TP4J6^?S6ihM8T6!epdX7XH&P=k*Sk#tz0$X zOmDAPV9dTe;I2=M1cI9?wA#*9;gu1-n!^d3={u{mQ3I}pL_&9!@dGJnrmTZ%g)Gj5 z9@t&(lb~#>ALv+_dGrW)75ErCvQOfz*E8!EvK``vlTk$y+LRtloz1BVR8|n9#5?`G zSJnPrOA74x(lgagC2k7x2!tIs`-8rj^ppL*8&fJhNwRYn0@34w4&GLj?qU-*1tv-% z!<(tOpN%)UrxJ#>7d(z~9&Z#F*D&Q02dEic_z{?vx--rQCyLx-9=UuiZ4WDYl6e+0 zcrAJ3!x4^$f|QG$#F<}xwknDpZqdCv6fU)0I))Z+ElwS=&)h{e?q2xSSA9DFc;RSr zIg}`W*o9uywX1u^p)qjH9lOgU{POilax(qN)cx~ng95_@0*d(KnoGfsdXf3Hepl?@ z!2tzYt}N`AS*;WM7T^wfGfLrsoMJ?)f z=Hv!#Yox8wh6mL%dpy_B-e(nmEe^$Dhz(y2ujJ}3pR@rF_n-4NOm$MYMLWq$2w--e*5V%2b}>>}Wk*j#DCagKb6z|Q+O|7u zRx~#wei7ELnM;=+CILOy^TPoZM=2(F-IoK}xhJ{y&(1x{?nm$xF-l>-Y?aavEB{yw zlrIQ&hTGJ#lFc<_-du5fCGwyTN32Bne2nJQ>dxh#DtWS$#ZJ-GH z3Vz-J`T#tF@&kh%ydmduqjK9*5`}w0YTmMh2zbTnkL{NLrjn@5BNZx|%>Z}9EkQj| zIv<>xMXk>tz3w-D`_M+~PyS-uQTY`ohpt5KKJEJs45})NeksYmDFqh^On!VRViyj| z>tS)z+Lb%}J!SQmRo=eGXYbPsSZ^S%ZSuPqz6(*Haeb+x-tM>DBBi#ESTn-5JNhtn zzn9ToC0Y{)6g4V^BEJIr2F&r(=6qjj4F+OW_N1%0sVO{Sep(4{bNN(PdDz7( z%RO{USey{NL7v^qlrN7eUJMyW;br|p{W;TT;PbqWY7Gnn3x4~&rxZTm+r?u zF?l-_&$PmX4zJ`s9UX+Vxl-EeA28=F6@F~=bFNl>aq0Or$|AKVaa*j&-h(Tydh$gG zW&hlDYK?SpNr{@c{GAV3Tp%^F) znbseqCJ_eEMuvKNjL5sr#zc*XnOJj94O^ttd^gPObdzeIO>ytL0Z-vyrRb+R;@#O4 zy8Tr5){p%yaIXPxr9fOgkS zbvm?eDxEQIpHUsYTEDnG!PbOYe^#R0el%vcCJ@%>SF5U1oCltctYl4R9N~E9 zd2N)`Mlbw7)*i|fA5OX$8*LJbc2J_;6OP%Oo-M3CtaIPo?>t3x{~$Tzb>l+Ip|J?E z9Y9g`E6y7yq2J3@SCTjg)L*lw&C=K{9^LRD0H0yAS?F0b%rF_O-pircoaC3L(fTSh zv{@@$-{7(S)LuD*yY}LZ?{hNKpRBzK8Z|;umJbXWJ+|@6SsWf!xjI7E-I{X-j+j`i zGD()%d*w)Sw@SYMl=Ccmu=jqJbo^?Ke&T@K%YDYd>T5svGFQ5P&E<^pW>37&xouMd z2AZpe&IH<)3y3JE`f*=~E;XfMWa7w^uky8c+kdY-o=#mcIAm_l%G&tx*pq6ZMexl1 z3o-W;jF*0^aa z;#OeR*YeV6o|c%8$@)fNvCaiIO2#;#bFHT1<#BvcSa*GMe&^m2AMBgQpP0s(s$P7l-LVm6!c#aDBcc7)(f}r~)N;ExsR+cW#}Bt(HsAaa zK6r5+G|I6yhLJLu6E{=XbjnM{QF|%9#2La7u0|PNJ;COcpT>m$6UW}bJ3CF}*%x@x z%vR!yFV!dY=s7gBIlM5cSIhR;GuNo2gsdKi#D_`mW7xh6leVX%-(zbmC4F z_Ct$I!ofJ|tI7!W)5oeoh)*|;lBoYo^IU6I>tFbR@yF3uhti~Yl2uN0^H$exqegS| zyO1>mZVE@z2rhq*gswH1rT{CCc#}__=xE!U(`(VYzrF_*y%v+J=k2QB6vzH)Jtlx3eiKa$`QaIo=2%XzkFQDmVyAgJ0B(9)i)aw4(D zA0u3iX7p4oWn7GeDy4gjK8wMpcA1weZI+9cbOU zovVl(e`pzQLQB-5lus}u*>}&{$~$O&G0?_tt4K`XeyM8vCYqE=^B5{n2DnT)&bYxu9sy z>)fNsx0|`=L{gz)OyfE7!O`nPy>*%^Q!`6=uOyPCWVdQtLo;)mc%8kKrd76U<7JzB zX+IaMs9P0|JC0Ti@?@P4PV`vIoK*G@UaF5pso$+0?BU(fv?(49!CHhBSEtd(>h;jN z(3yLYbT1rU1Q3rnIS%OyUzosLej>C>?5*bboF9pjFl>CGptv794ZByX_4p~{E^7GU zOu@C(AiQwAfOuVB=5#IJM^Wy0o0%c)Oki{%x3r3S5AEg@yA%qCW!#~Z*yKh(j4W0bhW&5!AiL#Sg! zm>NV7qY;Vb#NHUMR`kpYS4Y+530?gnpX(RL>8ZdydS$6?m?y*>bEo{zoU8MR)}b zRT#J(ypQ!Xe_Znn+ROqrB)B)`o=48@8Kmk9eKJt(#>VaZeNO$9z0raD$ad}8kD$VX zEOetp)0njR0)TGUVM$rW*{1lI+8ZdG<*GNlIV4TzQH3VdU)1#uP@MGd(1apwZGr4 z^u4d|uRBJ&y{wq({?0#3TzrxYTa>Ak!fi*Ts5YFJw~CZ`6H%)1C1{`acg}VAPvvMP zd>!6G-hBPiKyRf7d*gx{o~Cr7?h7If$~z%dRPiF91%JE9GYOg<*e@KTJRcDpyh$d6 z#chebHo>pO#w#*$-NN9Jl%LY1<3lE#oWMb=3}V{#^H1ile#T$-qExEgP{0tce21zm z>$^yUxAn=qe{SG@-)&fybOpG}U`Gc$#64sfRoQAU0`sT&%z(0x1w1e{*Qge8}-@iJ3gh8Nztu4{G z+97{4m)VoAg5T7o*=2(}kQGaXDtiDPBB~qZkDJegXHDp0k&YW&MHW!BbBQ1=#ZOhn z53b53wirbVMqha(^@FLb=hHADobK(w_?1eqqK2d$nd2801@iK;b^zP^=sCL!80 zF-znBfo9Hx@_{DZX4YwHG8|Ln*&R_P{P0CjcSZwNEGPfhgtbXdd-g_e)?dHaR-IAM z&C814J;V3^aNR3M@mwAiZNolCs1=4q!}VT?kOZ`vLQ&3Fw7P+(5uhX+TgwDKy4bNE zleE^B{Rzd$65ujDO%1Q_B;4WNkK#+gAy$wUO5T9G+E9~ zysxJQWz6n8;yFJQidk9AJ1@~bw+n5`($W(pSs&O6=}UB>D6O5Lv@BfuKC0X^A5xw! z@2RYBr5c4+(UHq2#ZT&>`go{xzp)z!PlK*Et2(eUV?wN?rRt}`eNPg@{i5ToqQ2Nq z(PzT}_MD`r2HhpR%0z6F3j4E*b9jTQ^@73%f|nNutv=d?sy+K!^4>&v0sCjwsOULM z*KeGE3gptTsP_Qf%2vv@O>80_jF29`U4kcW^{VWX*UL5s5!l1mZ=}9`NK3PW9qIq^ z-a)|A+%Vf4s~v&^V#n&3>xYGBwVu5aJ=u1lTT9Xsq>~4jMd8(13$*xBk{XXsJg4#< zz#>d>l_VrJY`-ZhncWFu#|cJ<->^AV)~)+l?=tvJJvYo#=XayaBVp&?j)mb#ySbz_ z`FXrMAmNN0q^;agm^A3qsDD%;3zc$*|ffE zbV<^~ob(X?@_k#(W1MAE+?(2w4=Au_wtlS0jj2g+5N<}&rq)M|DCRrtzVkz?xmW6P zX1eL&>`HgBuIC+^b$EvP^2JS*yVtH=L%YV2@l55_s0i81Z`ZHw+hSkC0!Q`r3@q%; z42>Syzj^ICpM*xa|y4?SEi zLv=29&o_mRx;%uB=4PiZcZKUOT2FD@Pq(Koj#q`x*X2D<8&QQXn^o&hFQzsxcebad zE@%5wPX2tLI=i5vy4*kVm^$Bkuj6{Qts`{2gDQMBW>bIiWASn~<kIC^ooRWG?M57roqe2({Q#chF%P$$p7daO_tVxxkMn)ii-Xnry30R@ zmnUO3m&ci*m%fBT=h@%~TBJ6GPByAjJQhuao8nWXnCo3G+ifnlGwX%NQBy9*7wfi+ zSdRL2E-zvZJ={DjOW01A*y?H@38~hF3m^K}XtG|+!G+y<5_aUM-FH`kei6dw8|RD0 zFD}peb*4P_+J!yNhwFRx6|;4o&ogIVrhP8_dE^|$_T_9plJac$@??=p_@Z^U#q}&y z`0T{S<7BFExa;gxc=GZb7~EYwPaw?yqN#Pdace1;A_Gcore*ed!@MYzu>rn(y`IL&n z<7~!+>Y~kL-*4)&eX;J(!GwI>>8|6{59z7%A+|b)v#q$qy5n6c*VRm5pONa6i?xZK zsq?veQ#&`vJn^jtRRs{+c3xf5GUn@!Fwkr_09eP<860-EmTOySJda$K&8-i>2!m$ z3<8wrPUL-k+ik7s6Ij7Ru)YirjDPc;#)n%u-S%na({pc!k;j(`Ylm9&|NckU= zH_k`Gc48i%H+vLN&h)|t8evs_g%J@_2aJ@1Vz79>v?9w3`@<~<>76#p=5*&H{*s^- zJ<5s3;jDH8YjxHO`+eNdg;dIgUO`ui=aeJqPD(i2rj+(So6Z(DrdLbn!UY4R{yhX+ z7MvOoHJ94iGTW2u|ZiUC-;y1t0gkFH&(12rT>>W^D904rFLWCDqYZJArC^= z6ks`iPFy(q?4cXe7Nv8KEAj|0E1kihmpHpiU2cuTij(#5A8oHLqh-LEDxM9U5mtrFcD3w>?X)g;LszINyP)MaA`Ln4 zKMnaD81geDu8v)PdZ%mCZB+mO_rS0Itld%gQeBuThRtLDo=y_xSn=y|%>8vy*+Wq{ z(SnPf4$-R=19i1RA39dddF|L3pLK1uXdh>`yq}`g_d1HdPF-CQLsI;Pt<*@b?%sis zUgfDj^E&v2tq}hKf~z;l4NPZw*#= z$Xm7aW#OvEF3#084i5a)S|j{%=OJT*`7Q(R%jL`EGSd%6hq|1D-hj(P))no_9h{T} z#yTq|hQ#~d%tJH0Ijqw)TkUvb2Tf4*wz}9M)OKmToco7`smIdx_tmjkPt}}OS}L3x zVi=`Uz+2eD2hy55{FF`-_OLsAI$Y$TQax`EYx0ZhU$-)2Ce=;VS)Hek&c3a3(6)O1 zaH1P5IL4+Tzx2y;$9l`q{PKqMVX1==f2G!B6~7i(Zxv#%_roXcih{0#y|={<{7Dl9 zR!Lp%KiA)^Qc6*EeXyE{4OuXPhbCvFBS_$Ww4o_FlA~1|NfVE3w2}&@3M?nmDQDk0 ztdf$~T9bk6wd%CS_!A1o}4#tq3Z4~Xo&gKTaw*IFX<}* z3!IVQj+X*|*hlpC{Cg`EXu&cwBWkD>;F&S3-kRrae1WD^YjHc%j8v zPCrrf2zO(Rk3)m>SIgAS0+JzCS0zcb4x$zBVBIm%gqP?mL_$oBT4Tt+Hp~(I-sAhf z8(`EF7<5+C=^RPAlMVb*U98dIGGBNe{3xsQJ|mo$nG^p95Uxj`1^>;!f?|c)>K*l` zoP$o55v7%A0X=(&+e$C)CHewu9s%i(Vjm7Y2DOT>vb;cUcZ}{sJWIGKSZkG!TZ8DY z^4BtI=+?}N{obOlE%lPam}t#_&eD+1ztF6icb%4h_F%k1UJZS+?d-wmEB{5`iQ<5H z>h1H%YC85S{?94%HUC~8slHijS*cHG2jh<#pWQMNM=K-D zTU*(yRX$b?A}`Bdt7PmnpZzb!d&0cS6norY+@ckkyg^Lu5oW=_}HMOd=BvLaBJ;Dz{S@Ljwe+wH!30OM+mZ zihM#>ezgYkSxx7K(0d^;SH0sPCBEY3!GF`|ffblIBnx#~0Sr8W{2)qa3g-pO8S9vv zv!0Q2vb0S$n#1`7em*pZ6K#Ptad28b>;<@pDa`5V$sW4x$2kgW<=F0zV%$+ZmSqXz!-u7E+`OhSg)dDlJ&o%f_f@m zv0_UhN#r#=39HHbigC6nrW2rwmD z=f?)I5mLAc@ENRt${)nm-q<$PSo=4tqAnFO2o`Wd$f-)eTzg!pc;tXL?hLwoW_1m6 z#_fdj<|+~(S%Ds6g|oI=bcD7-bbwAKGS=`o6-2f1XY}AdzZ=x!P9^-O6l(#b zMc8eo^MW2A16u|P?5{xh0Q&KxF%VIyxC5+fz$90I$PLOsijHOY+%X5@agmfRw&Hc2 z*Fu5)NCTp49g4_M&QXZYrp8LeAw{$Iaz})qAeew4H$|_O4 z|Le8S2{4do%#nf6I7hY!MRPDR5RgD7M^X&V*Z=imS#YtH5#=G?)-dq{BxnHleWTpk z+xPtsHieFbzN@FQb?5ohsBLR%w9%U&8$dN)>-9yR0R zLr**oZua0H6v_6|@5Ch7SRNzIH#pl+b~}6YSz}GyZ}i`dm8M6PY>WKP1qMn>-Y_uK z(B+TQO+LQXrTv8Bn&po9TwqxLotehlrS&0NB*fR76o(~P3b(z2_mUn*JS~%*G#*q`#5p?eMJCa)H@{^!< z-Y4j^e{RUd9vAcD5S`nDV{2#$D{-%EjRkx_P%eC-`;htm)a$B zxY^&1va3k|WXk|khlPJv0#k}g-t2Ev1BSrC>X}Bv>e73TTzRy31`2&dHgNs}_9z+l zp5U?G?`U9wwEX~3lDbDJveIC6c3^e7$=u=Dz*`T1w}1la0Odrnk{PJJi?3097hb+X z4q**{2!@yg9npb~H)z4~f`fo5_JAqyh~pQdk%$}rzpgDPoWwH~F?1Jc`*08;cY&@^ zAe7olfpbBK!SeCJ^1<3nb%U-3LY`bWyhD47KB65ML>fc`DKRxI z0FVZl>vjt;A3yL21dG#ipQ&P!SQ!xSVGn^9%yqqiL&D7fz)6W|4S>mrNod5f74bcdR+J| z^>8oo4@b54E;6TWC<4k}h#DJ;sC>Rp_Ns@~>}T}d_e;-8)d)CfF^g$#jVwefHBVuU zgsZ{vkw*&gmx{6b?%y?Qb2o=`pO}I9<_Fw*^F`5$sS8JlbD#K!hzrM4R(+AM@MUZZ zj8t4y=0TGnEvD@ar8ATyGECyM@~Y?loV*_M<$U({?%K1`k-wsjvkXu}m z<8Iks;tipfhpt{Md|SC-$43(~L6UZ#d1oavze`8;t#vcHo$z6s zuhM5~0esfzH=R+JaoZJt^~WCRnVeetQHNzU!Ccrnu3I6yL2=8`-@d6L`vYvCWdnn45)b7g!Z|J2f**nOIy{0)DHU zivcpG1V%A6p_vK%g~WNq9Yk95u}dapy;IKp!VyjL<@(UJlBBdkQR;%pRwjNF=fc0P zhn+6J&^oUmLySJ$Vd8J%ZPuuqJ)6CPMU8XeYCMKsTS(1`daets#|0o`NU=g0Q(TN` zhxAK9m6+}mZtC6a;S)2@tY;$H>1(+vXku^YxI4-UTH{(cX?uJ2<6S-@$M?x4sZLO{ zcO-`$4_IiqK;z35hn1PVsRis3o%82y54M3PY9vQgSaGqlpNSpVQ)msx)sM4Ma~3B$ zXJ=hT-EtjKfR^Hx$C5*@uf9C_qr{arR{oYlL7agh4Q^IU!k%zug@3pMVO0!ywGuiWue(BPk_GEuvV=$|=c-Za=F z@)Ih-lP(}s`SvyTwW(1?!ko?FWg>4LoRC1uBlScC+vOnxb&-)S-}$0=7+MX?;`o67 z3mbty6sm>p9aVQu+OM#==rpNav1f!W8V<}8uAH9oF>Gnk*=PHJG>t767wM=1q@xB( z%xww}j*B5%B7%zxkuruETXTA=K`^DItOo5I#Haifaat*-JuD&&;p)o3Cd?M=31Fcb z1Hj*t@zfZ_H1h++NH}TFn&nDvMkC=gG{)q8e{9*(0WuDGrZ%%%q5|w+a{%PcGKE|Q zSW*2AtD17V2@_vYVu-7(d9#mGic)ou!x*h%yLJ^4Dwh-|T z-}IL~jL-7_Ivzw4-{LAEOfb1i5C~e${+V+t4UEhz0E^w%F&q+8$ncC^4MqRT@`gDOFaL;a$o)*;20B($jwE3Tp#v6+ zqXgi@aJA}xn8cxc0NZ2rS)Q9m z93KJ&?;46}pGP{#Lg0=lbdNsotKZpB2k_2}zGD59s(jMg7;kam;gU7y`QG}@bqM*A zW>;x~8|e{z)){-jOT}#-0N0^ti;!r+AN7-~U=~DIubRXAmk&-VlLcHfxSef)rRN7$ zwLMJ+X3_5exUCeMLz3+U(+h@KLkVcaK^9BYP?>0>!8OO7P;S1bjgme#t8(gSb?`of!gnm&`zo+ZiMz$FHG)_rL|@QVkc0f~|%)qLmz z`^Z(o7nd`hCLnJJI%t(W(A%ZU50 zq`I?Wl3g+NeI29ZR0tk#at2;4 z2MXh7^(wO-`XT23s-o~MbXqUQnB(j6#5Ca}MAS=*{IvcBX-_rn4Rdk*b45Yox3yYU zlknrMD9u+E>VBAfd>29ZyKhydzk>+{3iq~mZU(g3zYuPgaLROkU<5=02YxJ!SH`7CZc`d zZG$dcP?iomom|ZvY?4P>3pfoxs&42vpka{H0Xj;56L6$h<-0s(gFyLjbqZa++e$*! zL>?d>s8;C%+z4WNbl%C#6JUGodMg1hPo;{b9D#5 z?~G8E712J=b67_f87IBUj{d-itjO}?ZyAW#?;lqAh11R0>Xy)!Yi?t{b_M4=4Y{iT z;C0a6`cZ`s>>@U1$Ojg%zqLcF;t(m7$=xeHszLJ6C`exbfuIJHuN_jms+}~DVU9$=RS*GA zzTzTKp*vV=p{B20k)VVN1dtT~HS9D{RUTLFWLZc^{nsr8z%^qxXX`{_TM$g@_`o^x zszyNOKK;6u-Hg6E7O0l{n{3HV;6L5}99lUWgNmoB3WK`McR+Crn*MRJGa$U$sjg)x z>kOJ)l`JN14**^UHlFHWdXsmyuXzalGV&1R?E!-o}GVFUImq? z+VQEW{WUi8-thB%Y7u>!$^Y3dkCtsByMuSl0vxdy}w8$zre+Hyq z%S?-0sF(v+~meezd_*&+D!i zRroet-s8PfkRKUTB;Wx-yNjnDX=ISuKK+7OCc+xs)V3 zMCnSkw#S*vxJ4yOMjIhQFG3a)oS&WG`(QI2<)}y4EJ*y~Rw&HC!ClCRrYNvX{L6ET80y z`gF6if$3L0{_>@HXYRzT@$n#H+n8?rNr7m=bh)4dlb%IGep#5ZF==r_r|6K=*bLJH zmFJ>gAJ@vA6^VuVSxy8^z zeTIbP!e`}lY8>753k!6|x$|uak6st(5hmaHt|1y-*-y$L1f6{X zrrd({ZApGj?PN&|>t=xwB}?l_ISnRd^0;q~f9pT8H?bPmKsfaDbgkr8uUQl6bj{Wt zf>$7u)Lm~GY&~POl&vf~Qgd42sw4XtdO}2rDUYfP>}>X#Rfx!G(`viuS8Q_%8`lQc zMI^)He$}zJoS0H4O*8U{WHncot%n-3Oj|{twrde_>WIP72{W}@&pYP^7vDK%Zj+d? z_p4Ifo9xuK8tXdAU9N@HTm~qPQomCX9GZ7j%UN&7J9@`Y7f?wOM#T^?omm?xaFUNY zj=Bj^ouo5=_Q73_$#7@QTl0WN!YA{6S{wRDiv0i)B{o)I5J(M&Ln8c~^s#BA`H-*x;~jYrY1ixegY;pq}XMdr2vB@3$AbEA1^n zVBwb#S&#jZ<2Fo+^GQrbl=r#`Ro}@O9&EvmJoe&I-9*$;nFNCzr9gL8%vx z7Odk>W{0>8JMu?z5!LD*4zFr~`@R!=oMpl?XKg)PfC9N8sm1Y`inT0&@q~t&PdorA zzN0xcbEk6~lOt(LxRdCNOL@xMpC23Le1PXTjkyyi8R!dzf@^^e1gBjyOk9*^5P}<+ zp3Q(iFe|vMUS^WI`@XVQLUU__V&?wf#amAF5#6DNaG|mc>RAHSvap90P{sjfJPHd3 z-pC2q9C7DQq;r3}F>Z!kAsg$XY#IgD$_|V^q7LPTBz2sMbu%faRI21mPC3;|$rf5ipA9y=P(-L5WgV#&Kv;HAB0L};zj zXhk-jT|>Iu1pwqDFc@ZJJnir~xw4-U5GfRXxuh@jGRNcRRmHx6B4bu=HJ5r^roqZ$ z9O!63q^ieW66P>j4gsinGbz|{2N1cDF`psK2H8J z6ru8qVUs!l=C*|2GH7c@#jJ@`Jsm&esiZPk=huyvSC_>oe^bX4I2YDA44Id)ey`{B zSdJpBDHw|!fhtt4xao1P{AF@-#hrZzFGI@f_eG+s_H%n!iX$yQp4;7PE7yKF5{`xX zuqBM8EyGZ<{DD13L}>ivq;Tv{O9`TnRz$MxUL(@Qjg}{mWQx;&QzwWOCofZ3uB>)i zzF_kl*}EIqxi8bcH+6B(COd^N&M3y&Cz$o_Ok37un zdv`z9QXp0lVVd%u3{9Da36>9^FvLACZ`0IyS{ydw#X^@b9)=WaY$(Oi&E;$O-cp*# z@Z`~!7Cp2)x-r949DJ7-2o{~Zy8`cJF6jFBKAR;>Tzyy7w< z53F?JBSkSSiG1786vmjLVlfRoaPR?V`^Qc?0Yf{CCvC4T3E0)!EkDS3z+*EVsp5jk z?B?$FwP)z>>%S;s;ZU>`htKdu+J5Q)jKRDGcv!nmFqjSg&5vB7~AXyq66F#>@e&(6P|;gWBowM zanAWM;)~()3=f^x9DF`}->6RlB6VNL>5+^?js#k^TfXm{lSZ_~Bsb9XD>@ZLj(Fwm zvE49)b1(=524fqGJ$89~Zev9rz0A-@-G4cw4(5DxK%e>NJ&RHA1Lj(k;`|SG=u(gL zypF?0=mV<~y--V7n^I`#I+J0nCaEB_yRZypZy{{D}jHco`oQBuOGEZIXwjO9c~wp7;1lASRe zVQisI${MnzAr#7tWiVq`%D$6fW-v*Nm@&i{OZYxV=X2ig?;oG@yMBNC{`*~5SJ&NZ zp53qez90AFao;b?Ov~3JGy98kGmaB)ba$*UdVAX(JEZC#Sv384)#-hk%Q^YA<54}! znDtmh%lE1V110-R&9A?|@a_~h#=g!F%IxqqWmoX)5qs?t+Kp~Ln~uCJJ$(17bm;!r z6i0(5=yE;k&FER|>rrE+luaBl>&1O&W`x6K>@%W$L+Tjb5hqu1v_klOvN9&O@NS+; zLARxg5li3g_Uqn>o4m#CU()G%1J6Eixyh{O<|t=nH=lwkW#!JEOqRn+9mfZCN_`Yl z&XlwHB+iY!>dh-)Ld;6~CUp{Y69N#;WkAKn_aej0@OFNk^4YeC|5o64Wn6xjq%p^OQ-!CuB{d@n%y93QK~X6N`Tif4d3eC z4Z&`6`4%wlr+kxIr00LN8-2jOqcP>c86)r?EV1|wfD<^-yqBz7dZd9a6&B{20zwQw zCXqQ0Zuzv~IQy11QfUvo+5bKhHuX(&V_XgBO0==rJqCB%5vamUvI+L7_ft?i>`(5{ zE~iCeH6J-`F>JKGJH0QmMNKox(N{iG5q5dTMJjQ+*rUTc%i9PCs1r3Y^OP3(Va~e; z`1Ce}*sP>WJ*^p2U6qIo5^;X|x=~5i7VujxOh!Nxi$924+1wjj^2X{4&c!!N&%_Pp zQXC+3w79VPdHXXy4T4(8_YW$WKuX2PvU4#+G48F;P6MB0#AR#(%4P}pY}#2!^(pt+)MS&6 z;A6dmaYSS6#hFlRms2*$uU$-k_Te8xW@5&Zai=nvo6USF*B1?OpzT7rqS^9%$|eb@ zlx6aPzte<7X6}8Y!aO2COeR8NpS$SIU_Ai$bDY;dTvL*i>4*a&p$A%&Zl_!N%==2~ zgUU3Q=V_^M7ATu#e5-aJItK|68Dt#!p=GZ-5|N- zTA#4#%u7LkHI6sl*}9)1Z1G7ogD(@)zJhP&$lN~9XfXzSldm{#)9!7WCQatT{_g!k z5A?kW(gk-=;5OH)({(o?7b7=+rL9Ilk1{m@o6BJS%1=H`1#5$mCFtn=U8iiGn$%p= zqTB}h@0NTV(8vAxDWVhZS$F$a{%({Z4IB}wcGT04jT}&k? z$0lUh+so_HL$N-9KR}NHC&0vg`c3lp*oEDit2&#fH<$qWatfF_lomVJv%mRQ7-112PB7rCR^CjfzKC=e3vnmF8MoXL48~V?3;FE z2H2oxo&)i6b9p2B)v*uHiqg?dTk`LGzy1BrxhCsvK-M*aW zay{}_&|GEh#%@#mQg-0`Nr1wgQq@VR-IlVofD!qlaBK0x&!%7+PHfo5U~~%@I%P#h zX+MP{3k@U+RxSv@J&22TiS@qX=HkRvJOhSne9)~rc|hR~|lQfhB&9t^986q~xJ zuDj|6va7%AZV2fx#sWcTP_vo!mVKVg1A4k*Hm%_Rae%ljTie=y?5VL?F5{ahz)1{j zNk;=)?xaLHsafBkM4bjxSP$=H?_yB?;;cH;Zq((vyY4{Ek!3OEmfPh;joi`fJ=UZ} zqkYBhFM;uxRAq9K_dU!hqF5HV&ueQDr4;X!8YkD$r>_Ce0cNQ#7jb}9XEN`Bt~4t( z>3Bg*bGay?O|*Zo%XEOh6w%FB+(waX>CMMhikJwje3rUbj*G`-c7@r}EESG2JB zmOQD7hK%gy;#q=>I25az{ZtT8(WE6gan^cwSY3#%ZL|TD^I^9sHo2i8W=^Vp)LfQZ zmTC8Sb>^8K3fx=IEygvu#$GCnyThJ%4XbMz;|k{NkuYd7!lgKOG!tme1vY_fC1QEq z{9C+I*i!Qb$jB9Ji#JT!4J;pJnk!}C$pYxTztVLycv@h2wd<68YQN?-RfYueh;z|H z?uR`f_CECn^MfPvMY9@^XbJz07+IjX&t%)LC`k@o|9nwBlxtP8LeT|h-z>`B?~MdZ zK>4t$>9X(iFV6tv5CFNd*)&-&D5LWH&q6qfpQ2CdQ3qwjl{Q zT?W`<9*!~(*qwrzxwE!lb&5DG9?KTi%L2RZ2KnT{L&#;Y+B5F+gwKPC^7+x||G0DO z2BX&o#37yuBv67lfEVeGb^+7bAMA@KT)r#3wKuyRlo>CR+5~Mo?jltohrLEzjYWV3 zA>pPJU&x_MdP_m)3{7t3$P2I&HG_vE2o|h6nb|t*O^c0&w_D2fzub&8qjYf3u0M9f zy{<^=kP3cUz2|0=sX!48Mz%0eF9ODYp)9 zm`Il+?o60bnexgNu!O&N4oQ;@Z8w&`1xCr@oSc~dE-vLv@MfK~h6V%o&6M?i_F#JQ zkpGJ=CCUk+64fr|-{O=M<+Sef#`-||)tKp1v#DMOSHx z>E972D+U9dEhYo-f3CCswNbd{6sPe{!}83P^cOm&ZZI%EQ{wcP6le~ZC|MOAS8$*$ z+|AXZoWT=TDa=he2@T>}+jf0=|CZpSp&j~%yvs=Z13%p>_ zEA0@73zbxqutW$&-kc8|f{#RJ-W)Wu-6 zl_yhIKm{y?(JGPa+T1B`q+ECe0&UK>@9u@5md|yvTk^cPoF#}!ah#q!L|BpuQ7F19 zO?oc28)*F8hHrVtrz2iRV&|HIc(KXdHUV7|akTb{U^8YAE_Xa9Kd;O;U*Nf-3vuY)d(ayG5%tfG^3&^3+Dq9&Zp;&X~A zHF=?Yx<{P{72)1COz;>%O9`Ji?u;L=45aeV z7{EzS0<+w|KbuTYZou*59(4*Kj?wGs+m~24{kn(oLj+GcHX^i7M5r=?%G8$F(pLAJ z!f}VCRfZ663S$rh1VqD>cbz8-fyu{fR#I^TieU(DWFk31bROQ{OYTh=Kn|9WE!)PC z10+OH+YkXHMdgQA29mC7YCt@O$D~OT2s@lx+c3@pIAQzhLu~PDl0-(8ePSaJ{iaEH zeX?QQrKWPSylovK{LAt1-Z+A99W=Xl6YEFRbVNaXp-?T&dRlsoYnwabVx8W^TbyB- zPo26gd1Gis5YJ2~rWc^_@n$PtVW2V<&M?tRBzatsY--zt3DiIwL)=`A!_{F1A~MM# z5`+HSw#;o@17a{D6BZbU(+m5k8R0g`3mqQoBynJ#!$Qcf?9ws!YK~%_9H)BLd2V6d z179@oDF}fZ5mx(W5cyLZqbDl^Ve^6rNxDGLaxhshY@vRc-yf$ks^YWRQAc$~At!L# z$L2LQ*#QN$;S@beYt{u(L3mWaTgL>Nhco?b(z^2g$`R&OG0+PuOXoyQ2!);7XRP;OB5 zS9a2+Rd%4*G;2gW8#6apVLS+{5@fQBh2&UOnvkv`tK>-GeWU#!3N$GrZaA{Y=*jdd zvx#xdZY5F(Z0BP+Ssla_u!6e??_8B#eaR%dwawKV3gI!@eZAS0A>?7kGBG3;=ToOm zsHYc<<24Z#^jyt!<^VF1CQ_#21Jx!NkPV@}?1s>*^MMO*Zml8cfLf#z7z#vvHzv0> zFCpM+u9_@?7)J(aAYze})jLjcAhX@fStE|DYC5f2oso;e+X>U1`v6a?5+;y?Bt(OA zrCntN+1;mjWTw)Oo$CV#J6D!tWgvOT4&4kh2r&FhdJn*#oPUJR}AGiij3v{6o8`UMRE#rw8?g3%j$PR?g!l z21o*!aR|^KlX)OG1FQY52&=XqqbeY#Vd_YjC&VWED@{z6U!iogKGqIcA3t?~&4*)s$Y@sK8%Xa#17 zfXK(-c}U@GI8s*c;E^J*GA*CYoxV+y4`{3Tdg5w-2|IrG!<9&)8Z-fCI3F}Ij$@5* zAjU%4fDjw9nb(&oOWJL|EF=XP7`Je1KxFs zUIKN?KvtHs6DsI=@#KYszOnldg*tt3L;X!xpNY~81Pa*%xRf7unRLdj-jd2QdNRm< zeij7THMSS$F@g#TtlXvFfFhJp5a?RG+~_@q4C=;3LsG+gzjhH2eUi3)&7AZ`bdP8q zp(~qQA{jM(&f5%Iw9oI7GtLC8xK2`e-i)&)@2 zB7S_e>+)Kx3ZvB`-c4pTgBS2Tr7;@R;rOTY#0j-8){1v=Ig4gNd%t&Fm&SM)%8*QyG$0;nd!(^BJ>P-TMH9|54+C7hGpy#1L3C)^PkN|t% z0Q>wZa%kIZee7x%wX+ygr2;ypYazFmv#^J(-$tuffZ;K{bx_~_1qIyHLcKzmPnK{o zV%w7?_+@LW()rsg@Rl0}|9gg-FoyG}FTy8JT@H+GYN~hGj>9qOcaR4g*0$ob>ca#`ciDI$aYV z>>V&+I1k8D$Hq>-ZBFF=E|JNvFk~&tDH0HcNPJR0y+AX)XTWcjbZC{#GWyY`FG32T zRwWcK1D(PI#j$m&1auQ#<*OXX5Qf0e3wpZT0sw+Id1z}6q*Zj)ndQ2?0|e!jCIzFd zoqlAQR89X@4Q1q^IxVRvz?izQ#a?)&!$MZ1Q#{UeK7H%#^5O9h_qSHJl7~SL#X}hN zm8P)t9`CwZ%FFQ}z5xPR0%V}no#z-n27zjA{#Ln+!STYv#hc?mqo{Rh zyV{bSQ*WLHi5drE0z+O9-F#98tLLNAS_46xhc#`*^g=!9Kq5+m>bd$@h!0e~_vfrLyFwhqS$3Ntbdx?IJgtP$x1~AbDq0>&WZ{Xz9=b z*|u#M;?aiyzlwlGH23C)F0zFe%m6x2@OU6U$$H|&TgFmxb=1|-gLSQ7T!D?P7YJD4Cg?{jM4j=iULQ^gowW*>IIv0I z6i1Bsu=N-nX}WdEq0MtStceI20qSH$wL__Tu#S-j)EOYV-h^UAbHsZ6$3^1j5Texf zRN1K0`PVkNa>eFR14-7SxY`1j{AZcHot;t%U7v zj7OgB*8PxW0)~+Aqszhw8NpNDjzO9xmw`(}IA-D2V8r^1`E?j+ zAS4CSLTyqZ3xK_co`N?en`}-uhEPo4VIF-!^Ej}qLRt~|%d6Qv7okls{7^_d5G$x} z;DjNZg4vv{HwAjo8>Y_4i)RqRkrOX_(h*e~N9z!S1i))g_7F!#d?%eJ`IEPvXpz*t z6S_8L*U*R|_Ucg%q=gO!7?5=5Hww`L3;ay)67V zV%Los*&DdQDw6bfcMU`XqItm&HWqsp3_N%pn0tXRUnp4wY|)kUn(3F!O`3JvFmkXJ z(U1?ev=H)aMtEWhj;*@OC+Llcz%c}B6^tGY#J<%yu(frwJKfbk;04e@_7dq^2c8Yo z$Xb1kc}&LU{0^l;SIFTzt|t+5F$<)Pp}*QvQYGot`OYJ(VELL97I<5BrYPL`P8N(j z1OcOy)i&b+Cx03j|7FzXHx=vSF4-^wiR|* z!pH=6XClA@Mz$Fmgf-#{XNN`bVJ{w8tIGHtY>Orhz1I7pK04MF^uU(t;pd^QoyYW!^G# zn{lGesEtisRiDJDg$-q7tGQJ$HC`x8Q^5KyZERGHt1Go3u(4;4C6|n|Lpm35Aw>Nl z2HyG6&BxNZ6irLKXMVu@hGmfD)uS{tnvTvp!FFS#%j7o7$Cg(loN#=D^>^PFcz?RH z1cfT%Mjx?k>y^L30UX8K?Hdt(ALwq87G`NzUSeU1OuKp%?Hue? zlD;?G`MsA*`axA^XRq|zyUfnH-V<*h#Df~Ed)-B)GEqFA4k9feNMv4fX+mc&$}auN zK3NMSU6})VMD`d2S97c7!y~T5&T9yyLLOplP!Czc)hOq8HFFm8?s4krR1fK?ovT6`sH1>g+D8 z^3KbZ+RHJwAD(Ilg_<85#Y%d{fsCd1dEZC_P#vJ5Wqr|y%DCL^ZN6=Jovg4<9geW$ z>As-vif})e`u-Y-+9FLx$O>1sHx1~+(!B4gfNGFzIOiSnvGo-k zkaxYEovl}xWzxl}y(agf)uiE@wW+T=Hvkg%raN2NNThS2-2pa2uopZDZ1jKt|FH}YbYGiHqz68LhRMON|r63L0EZ)Nhzd>O4sjLMAVp&;s zlNd4uzrIHX_<~0bH+NP~kG!*W^>l9lQ8lVKa|)%VhL4{GO+7K{e!|hp72&|*hPD-< zDWmi1AUS7;AV9CM`8z`gET!up1pQl8W$HdJmLb3i8?FZM_2G06S-`MwIgHtp0O~+@ zN$b6J(r_X8!_Et;ptaqPTgcB37J1XqFQwURv(ZxlQB_qungfJ|APMIC(3WXP$W=+} zVp#_5lAU7%7F)rc3P7*Qi89>-m4QR+-YK#9Mm#7`@!6a>O8f=B%Qs>4gXzwRjI7>Y zWTKem6F#I$@fUdNbbS21E9{_3xd}W#1XzIw(NiS6 zG`vCCE-ujBwZZ0?>^;CclsIlE(HCZYM{3ORM+mRcI*lzk#GD-V#XT>LQPc(XLVVb^)<$ zi4zw@-$+vx2s6-N(`ajxG6SeNK2tzTzp{rQ0~a!KTn9{QEQKx|=BJ^(X*3;S(6-cV z!FODvD$?W^zQH{^j%7EjkCSVsM(26cWQ;az?>#Xty9T7t|Kw&65Wh~g237&uaJ{|H z>?FzY?S)9sZ`Rtr=mGpwe+w#y+H}t7qn*gd7CWdC_8LVEmzRd!I^fSA@*bo*c?Nh5 zbN2E7&H4?R=KYcv+O+2fn zAn&u*3g~#$(J~GQKw#cc7$^(_eUGQC7)u_@Q_ly(Y6OfBSqnm_rSbdQfI!Da0r`Z4 zjP|AOij_#%)~LHZakvz&`%eE>cvjZ8B|$+Nng&t5>VyTO5@`F}WH)#-b$Co$aXtW( z%MvgdbIY73@x9DE6mC6ICU3pBS6fl0h=eQ#3(vE=Uvl&y z;1PcG7cfNG6M@a5I{8%2Mx2GsyiHb{b4DsNetHiQ=z9Dky_WUXd@uqJ&O4Qoxsh~P z(Zmz;*KSc~ZH~ULRj?-6=p03NrB0(-)G9d$;qSrRvF4CT9frvQI7n<9s+uP@w!~9- z&{mMuKpxS<0AqjHF`5e}REFH$vvhbrk}dK)pPtxUc75Y6j9x2Zld10AHP>kv`XsQd zWr~Gh6CV_MQ>)@r{WQGL@Kk2@aG-|$8}F6GTU@v7O4$Ya;@DCJh<+S>S1!@2wYo*g zx>S}fn=1muo-LXVWNu3cuD;afj-};hpxqIm6?Am2y2uAK(2OZXM;}FLp{-hZjx=d# z5aep&vXcceOX#e*uys0E1RO?M-d_QQEAJ~?NHz!U_VQ9{S&60PMxfnZKnS24sY`-I z0OUWP)H>RgqFM8yC%tcgJ?84s#CtN(Aj>7eBlEqTB@uQG`)Ja#i71sDZO%`DqHQeC ztGFa|-fr?a``|U`UXHns&i$Z$O*I}x1=e5*r9v8D@`SsWOVUSEEO&2AEibV|uFiAF zfgPr*)TpQ}d!@N^)TY(>5A^2!*Ae3{0i0b>nWC7s#rvtKmh7ANfRa@?sLrxSfIH9d zlAs%K*fd5?Q(q7@?tD0I@&r ze~jF2P0COrKxX1F@#4sRVKj= zjwq-i+QK{$SHPJ!;Pry4au*r`ecV6@){3c`K8`0?+QKkZsRTUa9DcMsy#C2^qCcv_AK% zEC-j*^i@~sd&b+spAm|F8ZQW!Nf$6lI6vDn|K$+|r-8d)!1%%Ahfe%7Oa_4=2CnQH zmq10IxQ*HJcU4zOWV0_muLQ3e{xr_BjUjO5e>HI6B~SJl96=TsJ%j&dRDm-#>@!sa z4Yo1#Zw4Nm31OeX6HWs|Zt!0W0LE#I9yqg$3b*G}r2q-wh6cC=156%+S`XM}dCJ+s z`3Zk57sn5gyaBcl7+eNp0uDo}z?Di!T3kcC%9MvQCm=2Mwl~y5yxcqoI0N3|8HlCP& zaGOIfU4|P0Qph2uDskxlXh=4K2DAoz0AAuitFp7#R4QPHe(PZCvvQoGyEj7ic$g5p zb)Yp3Tn24$;Wh05Z`F!X zIdR-b=z1%u^+oxA%dHB#4gOI@wgI35k)H4rDpdI|kJVMJK<@rg#a-hcRopei08}2} zKIOpS7oej5sN$~iud2uv%)eEUZTzi@lkN{RP5&3*08DJWc7gj>yx5rjjThVacf8n` z{*BkJkx9@27)600!3_r*IRP{>4}i!XWwHN7vH!QysQ&NLsMO{$m8n>@)Cp$R8D~%D zPHS?8GVVX%g3D|u22WHG&SK1e8eo)F0JwU%%kkxIClTHN1n>@$e}*)#sd_r7q5ZkYAgA{D`K6Z+GQHY*j>Ve_IyaSy}JPiQGxg`7u2bxwZw~_&U9>sqX9= zKPl(OYED+H=+@(2Np)?_dcTCj=QSh-0+iJe28+M&ZD)18?UCG^99sIK<*v*?@u1c+ zOdKJ(MUUo+{JJG2Y6IW+YiO2r`3 z`<`%{ZaeS(GHZnQy4{p;pQbh^pXe)p-tYW9$F`W=Ll!$z4&S!s<9JC%oS=(ygvXmJB-`MbffBL2WzzE8hQrCvR5arNl%RbiEcs(`!? z?)ZCGisGb;V!VnHPJlDQGHP0+gQ?~REGX2l_p5!&EKVu#>62QTCqqMM_rvpYsgI9q z-CXLD%1LMskvr_ZoYC2KSfu=B;J`|3zFBOqSGw*ie%b*yj3A%Xbq_Cp;FYmYZVn!@G&-Q_y%kBasuw7)osl~7c677q{o?3SC7 z(V9_cCgDy{Fd%H^#D)x-q$)1@?yL9vZ5w=+#Y5jf#CiKmv97IyRgcye1JQWVh}l23 z!)lB*R$q^8=qy?^elZG3EM-`Xs5P?G($DjhyU$CJ=obo& z>Rj}=?%d?yU#CMElHpSty3q-f zhn?+A2k5_QF;85-5SP*NNj`mnKFS|`D`I^)kn-{CmZ(|%39 zpc5OclkzCKlW(=ULt}`h@L%AE=H;zg4t@{tXniXF;lABg{v&dtv#9$E+?it+$urjA zPa?0CsK~;hI1hWy$CD*~0kQo{Rr~>cAM74&Yet7@`nQ;*71{URJRaP8w&co<-m#8Y z@z#x^Nv*{DH&1)adP1-1W28-WMkC1OEOmeS|Y`K_0N~?`}mjVN#Vol5luOpt$K%fl$X@T3C)NLAxn2SDAg->GK)&|L{96Ap0D-G z)<5%%n9k=9MHtxcJec@^m&n}T%zR7fU$5d0UtG={`KwHcZ@+)(L(YU#$r;XH3)V;v3-iW+!T8hejaD3%ng#C5&nW@=_ z{YwK+UJm8+>r#D%rKfUkQ|If0H?G3GQ{uDr)z4a6?JvJ-{KDzHx4d2L%qzbdPF*7t z&ZYCmn`n*;L$yY*l`8{(<~jMM)NIOzix9RCQ!a zV$@eX!SvwxrhQdg$iYNMMY}t+AEFIozpg!*C0l(@tn*el>_7Z|Mk1pn_DtyxEH-#; zLaO*(waE5x|N4OE%PfP!jAuL=wOu=BR_?r#m|dCe2G?!Cb$9DF%AL|5i+`p7c+6 zeWZ}yKJBmFN-4-m3yq^B)PI-$J&0lzF@aAQr;dzM@0%v}@}NXfoVA&ogz_Dylb*k+ zYt{Z15E^g`sQT&thIPa4M&IbQbKI;d4m;e4wW2HdsljtvjTGW-5edbD-f9|5qJicl zachEwV0~Jd<{#o4$Mrh(I?r0CGe*ftUDSxUCKGKrreKqB2pt!`206tEq15{{8qThf z4yrdGA1$nVk`ApbZ$*f-_G3-mSOmBz%5Y$37v}GEVShu7Hsr^FjwFucU@RYz+L;M^EVe$zdbbM4J zz+2?hF44bLDF;-$wNIr z#%R57+9vW2D|&OW$L#PStHjBe-_^C$j{@+#X0xM!SA5oK_55AGF*Tm9#ICmlG9B)=Tv)LLLfF9?oBy7Vtk zl9QbTD@7j&NCw;qkOv()26T+HZ_7$>1#kA5KYpj`qV^q8v%MbfvDagCTb|6aQ#!yu=o~S$i_tRa7H&QS7u(-7 zFFdEZX`30t>CUlX}eI(?AdKdf(nB>YNtBKty=q zgKCq@as97tzgPjHMQ_TfbEpeHK~F6b$5Wv-6p7vDwHbXm>B0AW89e^^fPnRqt|t$3NY09 zm0uOJD^D_7)RwyTi88y(e$+(fJRa&={eIbDGf83HY6n5RvnG*y%`xR9+2|lSwrxN$ zcM2{!dtOyeD72~Io{v5B|I#xk1hY24O$gcSOCuLpIJlout|;s3`eH#x zEB11yen-!w463IzYJ8z8-gLU~MlfNK*pk^pINhTE&h`6;?Sx+wCdR)NV8iQ= zoG7)6+zRT6W~jb(RQ*<-b>pD0D2hv6Q(Yw>JM2bz*2Ho&(d-K{TUOu*O>B9^(BqTv zJ(Spoz9E&+c`bgM)&h`hp((vaG-?lrjCk8=3C2hh(8b@A&Z zs>~-gw;~j;9!yQNdGzx74QQj}!~9r$H>)M=p6{02yX}4SX|c3)?ZJq5DRBs$#K!fY z#-Xf8>UfY~4(AC$5674OFMpp?yo$PSYEBoN4G3VU_eX|NcQz^DlVntb6F#hb-U-eChgX;^c{g>Uveq)n8{P{HlY-hIe-UVl=w0 zY217cPIUb|!M%He_VYx?KPR%m37ILuqTkf@Q}GS9^3i95>es5`7F)tGz3ew(O zBivbQMNLg4@a^u(ca)cJ&7Nf5cC*`lF-zFos(j2c7~fGZXHf)L+jm*z+J{S)7UR_= z4?X=gH8D2{G-Ozl`yat|#+zDi`PMUi!{$G&rWMUoYvH3$!c>8$d8*W`dzR>fDGfn6{f)Yll)m~7~nw)Fl6I7v65ZqL7#-o6k3IyS+z!u!863;F(LZn? zKcy>Qw{(_%`NKfVK+7e3f{zo*a3lf5X;0aS6zvP5{&d<+4Tm1BYcC1w9B8S^nk5X# z(Hf&FxHR+A;csVYB(>UVB>#B1XdhH9AF^PaiP(tT>;E}u zr)9$3ym}_I%dDm}EN61(BV)>DYJq&O?}J$D<*$N*QtEZc1o?^3sXs z1^Jsta&!D}=j@>Rk|U-AlN-?!18piO5XwP9l4?%i&Q7=nE4xZ`V>4J_JiPdOi1R^6 zVte_iOQ42NKn+u#EUYJEMm08OdY0G3HzU8ZmSjWM1f0%3D!zT_>QPWobx=?gn80ws zlJL~YZL-yLA<|dD0x5Nej?1CK%NqvIujSJms5(=+PP?g*pe2v%=b*(7M zayDwf(w*?+mpx^6zj42L%KiGPXnBO%;g{+%-<6!^zqqEL9$cjzxFH`^L+(naGz4ds zDA-4Ird*(CU(i;F&!MQ$nda~#PPAO z;x+p{Rr@ZpetlmkJ4m6Z-eHNC$UYZtkU(-$ffwbZ+c9Y5PJ%=CRLL-MT*TmHJBZeR3_ zOsaWlnIvj{I?R!n}Hp6@qkHd4>$5qeRf0GK^Hh^v}sKbKeh1(YF3uD$EzdEgX zy13o_S;&na{hsynXFu5O6?~Q~FKjGCM?aEEzH2BONZ`Bu*Yi`iUlD!rJ9kx89-rIu zzGKugOy(pv-=)3Azs94XHRB$>J~Nkn^fPkrOOWHQ!J_twD9ZM?=8hS0kqQe{7$iu-3zajw&4P zf`TTK()giY+|JF{RQ{ttp=k#b-nY6LaMaf=#1Q=FI-{FOCzHVM&wf2R{JieVZB(v< zEBbN5W0_y|ssS*6M(pBapyJ+9BYkmuF*^2~>c_kzNTBgMBb*(M1mSsgLBL0=n4aMoKPcjd4g zbsB@ZTu2snvO1}m3a-;*`}V30_2e%Mg$x+?q+ZoL$aIyVq*@5>i{hy`qQuwhqPG&; zT<0J&{Cm@Q%pLdlm-bvXZWfhoxh|Z1*ZA~B*E)0g$gXdv?vvxcuajSLe+Y$5c5%?U^xO9=}CtkPLs;=ggpplcxcV>2-3z2>RIh-=^eO_2?JJ{9xb1{O&CmN*^9F*@dU*V)rtzU^y(P__$LD)gs2S6|d+#Xz(lhu~iTvd8rPF!8Kx)SM`x7f97wP&n z?q=_B<7XMPgN-{8<37)b8x8I}V?Vaa$Imv6n?`PQS=S6`)l${$^hz@$c*O2we$6U+ zlJ&|kizZ0;D%|H$fX=8BZa9pzI| znx~C>hSHtGf|}MJ7%x#e`=@ZRPI2#Feb%{5R*kdc8T)w6f+>Dwtu{w3yzsHd|EB66D=`AE7sK#Kh)d|3i~cHi_-RM!Vq$ zLPzOW@w(%tM_pS zZYS3~gpmZ<|Ebr%NK= zXvW0+`6uk~-+%}&+uuhAOS?WCRaEgyIq#XG5;9czFlQ~C)o^&Zim?5oYPG?@_wZvh zTGBVBK-S5lS>kyWL=k_Q9sR^7Ill-@)eaO+A2L8X_+KQM{nKvFX1V`yc^#iWp3u|S zx#-bf`^yz}zas0ptPvuaU&q1)q6)-T@ancJbKGt3l=wZkuO1>Sh% z3*H|_@1RL=T+XY6_4dtY302>64J>x%mA@^{8`moLc6~e3P}*CF4;#4AtNiECq{hC$ zI~V%?5QYz>FYgfA-Jy{?Ne~WSR^A(wfyW7IlDY`hT-}E%8m6%|LafM{{PE4%p>lFk z!=}a{BExvVPef4{dfCSq#|_?@{wWvE&Kvvjm!LRO<9iYLB*&98cLf-Im0Fvj@sWOR_d*5tUE~mK zLFV7wSZ<_iPro=_vvXD`7B@xsY624EG70{gb*=4ZUrcEGA29K7{pBB7YdXBWbdc)d9$=-!WLQeqPz}y#5XOy-#$l zFu3&n$-k3bOh5tM`FcK5781d` zv)xSjwfLR)=hJha=bjt9Q3}c($@+cKNQ5%h_k|oZm`7n=-vIL8x{Glb~+yjJ!rCw$^N9sZewCn=r>`5>s7C=%6;qRJ5uDlt8o$_D<94};g1sP z&vpNkmYK%gmF;IQ(*4Ktk-V|3fpW(gVsGW|J-ll5WYR}|;Z*LSjl9dWV9Y0z2yfNT zhjikNRPQ(wb*&}^tutfVZ7I@6;*RkM(_Mv{?bh=y|Mv7YCdJ?EOu{9LFI~Zx$kXws zH^r}Taoq|xpIHt3GWq>Q;ph6}KA$NKHc$PTtD6cZniL{@!(`_hS$PiOT|X3lBn2&G zn~Ksm-CrBNiIxyf6%(J!kW5Pmbb@jyte-W9X{@d_FdKzcS-O$S!v4pv<5{{phS}Hu zC`=S-sO_dJC3YDLFMk{?H`S1@Nc_F3#kqoR=C@9*ud2z`y1g=2TRE>(!X4PnZ`7u~ zR4uP{Wko>y{=D|4W*>9q@T-wS{k^}S4qg3u%P$?jFwOJuYYg{yeId#L4Lh?*wsk&J zwdQRa_B=89^wH#Y#tYI?bjX`2oV>ig7)sw6A#TF`+~~AVU%HE&v#r$$PulF3>?;d%XO#+m=-7nkL*P#3o^?H44+XP008@$_=n)6r_+iJyCOhjr+JT}oKbFLQ@pcKni;5aRUBS~C04 zAG@BU{d1D{ND8d)FpmEf8Qxo?e3xAlL*5h{s0fP)^OG-kDC}gEE_uO*z`@3*Lybp<+hbm<+k-xxDDml+rA1Psaf1hO=$UI zM(M{I+;9vVH|Hv^Hs`9)HUyJu`K3{xDOGItf7p8KsH)nneOLwQ?v(Bh>5%U31}SOj z2BkZtq`SLYdebRLcS$!$eQV?MobMgKbN*m3_8x29G4q<&-0NORJNo4f4GUFZeUxz= zxs`F8G?n|5QQw$e1(ylvWqQ^xELsly1I<_#!09{Z%Zs6a5fjTQK@$Jd+;jQFu zJ{VvD*onl+2m0dxu)nE1a9mtQa^Z#KfATy16!U-5Du7smUefB$KWWuVdax7M_u>7M zPs5pOi~J+cQxn_wTFI;zsI~>Nn~W+SOl=|Dcd1)cvd$^6HQyP^_FylXWpYz#%v+9g zmI(rj6qwS5-F(F!oR(a9qn@kJ%ndeA%<+8-qjB1z1PjMxfUwKZlBa05MK}<WDl*WKw))z`Nd~K!oR3&r@{t0)DG`+BU0sYBmB2m`a~7)H4O3PA#347yH2T z7(06m7&|Bagq^q)E$tlgTdn@{^wIZCy&gC@I%%e_5fZ6Wne@TPDO7pTiugG4)-#nd zsSiB%J&9VjHc7o?FpG%(vgE&81mHJ-MmHphhjN92JifkI-^(>L-)kh-KFL=ZgYo#E zXhExEtBQx|kpu|enxi^^SGl(lo*4#&#FT|3SJ4Y61zc zGB`wxgr|`W*QYVpFtSDg2Qre~lU{(TL97mp=U&o*VhyqOvEC-yTR17$+!Bd&xUc`$ z;w=7aab*8%aZ~@bILiOEIMe@H+{pi0+)%*(vp6d)LlZp{f_bbI@oTZ2SmRjJt+qt- zWB*s-)?}Nc_nd@~Rl~p*|Z=$PQmW2Z<&i6zE5#_p=1{g+yi{+C)!{!6V8|4VW-|0Ox9|5tKt z--w@28#|x8%cbjunbb%yPmlbRl2?m=F15My%XrbUHkJCbhEbC)+Puy4JsXfFxmvmT z?Hi`Xee1Knwuc#b(e4N4@Ag$Z1AXgkyQY^v9xlGkWoDvQ3?Vus<>7&S^$lT}P&AZ} zbBQcQWMj%s_ojJgIZ{#+0~Th_oe(#sg7Nq`h;%Vh(u~S8Y3!0w; zxbLe$EX6{~eu42~JL8`x;8*Ut&|21bPCq0RSmqt8(NlykpCH;xw*%Fo`$I@>V^KkZL} z(Wc0~wrM27O09)(kRZZ^(=*(zm#lsBT4I0KB9U4%P`0uVVL1E~=JERRf^}|3V&3SUgkU)Sp za%Rj5`XmNWpGul1>eLUP7|+jC^eSqgAw}N23ck3Ovv3V{5`#nT@%S!&3^gXS5oW=p zgL)!a8D?{(8=)ADAPf=i!5C!0s$KA1Nl)&K{{Dk%f+*KK38OHp2PLbbAPiFA6obJR zuHsC=;C+kNdudoL%ha59yd)3j*mn7;E_MlvF17-~@7sJv;$b~4_orb?Rf_>S_I4r! zX%UyXkGjk@{BhKtlS5>Rc!=nu=;EE4Vv$;*n-RurGW!cP+RgKJ4}uVM5bM2?0ud>! zN#<3%yp%lCJ=q>5)PqEg=A2!PYYXC~OCfEolIANdG(sj*Cwui(H2SE`ZEzp|&O{#= zQ#&~kSN*nH3#n6^q@qA{t%O?PP+jaZNe#Q=bbPymk25CLPojh$NP$F;%FPkisdp>a zE)Rk>-X7zh1UrAg75>Ix{MH@p5^UFrdcccT`Hd*Ye~hWRyPT&F;BaebvR?S)Xju7w zMJ@lA)uovcK1iIR3+wjkg8a`nbeG*liDiwCV zmpMh9=*TPTE-~GMo0>bBS~T98i~K&~!e0^BA;5wD&ZDpFuO&@qe|Sl_o7euHapg#R zu2{+TQxo)*NP))eyhn<{-#)UFlu{m&b@{xNlxSOb!^zh?Z+x^|E5W6vR%EyE4UbzG z%xn@Z+UuwLmLB$AEN=kxDc&({SqhWRQN?T7S7H5kZGBLOu`$ALUKt5>v{Pjq&R=YY zV3hh?c2ht6>I%JMRbG*sevQD4+gSf}QGcv~1iej+Px7 zvT)td;}c*Rna(7hC+!@DrM*62*1as$ocbBYT|DUd41WQN*EoiU%L-1wZqQxSKte;v$AkhybSrf3Ic*y= z9MQZ)^-xqnb~g@OgZ=54^+pV-wStbn4}+tBwIVlJ>!GO8FMhzToj zZ7_nG!5P|@Q!>GL$=292!hj{*PDp0pE^+4R$#Dz6MPqC9`Na(bSJY>!=~bKVM;}Na z%9h#U%IB@M*?F=&O=kvCis4M%+Z|oOYE{MdYmDAH4=JLCXK{*{|B@E4g2TeNK}_s#?T^0qmgnq#Oe}MB0d}X7e^Dbt>-s0 zJX?Ficx$kMnv#J;I*|_ut>Y@;$;Zpze#8p{{|B@zH46el$j4cD{z-@UsI3v};bt zuiuK$p?Kyvx$#hHB#XMBt%(c)^KzLA)JZOM{)h*4_q*ET)b0LaF?G+Jgt4K2nnX&P zPdIf{L6~4VJsV3q8(Z9{eK8va9@+H~)%Cz!x1W$d02OV9zFAJZnjN0pd3=IFeI${EvOb}Xr#ms% zXv@{L@nu`=yqt}6*^Lt%W0Gc}6GZ#ln*#C-e6C{=B?{!_FvzJSe(rB&ErpoK6 zP~e)i!t#M5i1AVyQSL~YnX8Km;{u+kToPnz2FlOvrVLh;o_=0GOs#Z!51eCf@k-lp z`_7LZ_~fQN?(iE76L$|O|NrxkyhGF_3#*QSBU;oM)^#;rxnDNi!g!74xZtLt@l}TE z3ym~CD~@UkeX{P}odg7vi)Ky`C9G%i3bjMLS(K%pmkK8mqb6WWX=>=s52(_23 zGc$bxHa?TMKnC?REr9)6)OhxCVOR9~{;kVk2B*5fV@?2m(w=&=FQs$I%2ZIYDyP+p zEhLg41!}tCZ0N=U4K%QE%(gV&7SkTTbF)x)#W*A(ST*HQlc&QA^fPeukIKTXOaRYHeC{K zevQP7aH<>2wPV86iCG5+IX1K{10rp21855wrh2e8q*67P(5trs`XQuGIahl4V*Lw>1_Xzwo zrwi~uIjyfm-O)$lPr*@N()p~26@E58cdevQN+?4p z-3p>EiK=gP5PZ2e2%V+l#c70A)KD1xXn04EzR7xPnwTeRQ~8l651zT}&3Jo(FO%6) zxchp+t{v@;y3z&8G)hW;))zSacPX79QP-0sbOzK&Ekh=(uLy8OSzjylks*asb^M70*c+lhY-K zUFeojBK|M)N0is$7PfHv2rok)ic!TxC;oVwiNQY6^$MLHMFASTrvU}H9xCXw%Rxts zcXS9B;-*|gncJXebM6icOR_pO3|{RZ>Hq~M%CBv14rIN%1|$r12ASuopDeQcch%1p z4{U2faErg^mCvx~_j(3}P;y%gZHHgEKrU2byHkqNRAGmIfO@Ms@j+1gM|>*DVR)a| zC|hZBTK!MAw$JAnDvTP^WBr7@O7WrX6j8>Pzubb_a62S~PF7uW`7|fc7nr==x`fn- z31%QOQcK;fh$2jbfu(nf?kbR)JoZ@p!qck4&bQFa|Kw&wB(N;`^ATs*K=ZA)X#Qi1Zj&%B1R>wzqe%XB3eAFv z^?br+zC{>ZGiFkf810fZZnr6X37|`TY(%JTtHh%S)$*}ck|GYS)EulvY3wgaQ{A%Iz;)!j9%}c z!#^0bI#MK+T_<8pz2ijJkik-kZy=U=(q_BXqvQ?e9Zn0G&OwHU*HVsi{${?Ofg zGkcAsd~&fF`}Hbya}QRlC}iW%lj5eThLQt=IQ-&5SUZ`H%#}hMQD?AQ1)yK1$T`G3 z_+)*}4%Ti?#E}s1A*HR@M^l~4=)Bd}yd&=5U#U5yQY=PN1KW*0`FD%G6sn-NpV=5+ig{*cdnyX_M1FbpjGK_P>bfGVsN1 zos%9!3Fyox6a0Z>mpavbS1>>>Jv>5bV;hNbQB7|vDyo~0y<_w%dVha;J0&*tr{c=c zAW{m!>#YX2^N;=pn>cRk<)Vj*6exVL;Z*Ur8ft5zn9@p(iFA#G6J_dG%w%WME3IC# zCUkNqo%%@H_)+7wI4Jo7KVISzeeu54T zA8cUM!5zq!5sIY*goz0b1{e6ch~2gMej_?ehRwFcYgL6^`QWz>nFCVpGDZJ%s_L?9K7c`!`NTv~-wiO5qWDi>dIdTAX@K z38-CxeV@_r!4VP*1{(hB!>Wss+RiV|4)?Qkce}1skb0bRlM>{Z(!>X_n}6U^*~f1> zd-hE1_}x&>cl0^68&^D>s&TeshlDjnGsRDnhgD-fBSfxERdb|nzuVyq;0W)fv{OD{ z0b%!aX(Y!M`L$DxdqSbpaDHvI!O2K#I4Q48X}N2Utzadc%${aA6;t1B7ui+LGNc(@ zwK2#~^yU!Jhjq&hnO~%6x=AEuVALUjT<6W6I+QC6%BK){{f*Bs#ExxAYeVT1yq!-z z1?nWXS72H1;-xjhFFk8h2V?EneEsOGul@MwGHmHA*jg${tzpPSx$Jh`-!@*j?eksD zLU9ZT)Oy{&F>9_dVQ1M#DNDn~8YjINp8I_Ws!f1z8;Xy~`=P((m_H+ufvoa%v!}ao z7^)_ky6$~}AjZca+BdYfvah@~E!p*H3*&>6aN`#gNG4|Yo=_yc=%Ij!*7>M zI^DiRp*3PcFJg+}tRB-p`Xj!NIzn`>n|p6FGa5V9-MeYt+Os^+h5|i!1y7N^>&;7Y zn#U9~;?^PKE={kI(3E35!caF;$4L{-3#6~ac+gk7%krWhZtYYLJY2b6Z*`G*)sS#N zu)=cN2Nz)QkOK8HzmQ9&`djSqXAvU#0%2>Hd9M?Q$UvKXreMCY7|{=JGcD!Py$jUp zO^w#~!sF#tJ|={9JT$Elx;L=KiDZ1Z6#d$sJT4jyslbwGS%^|eA{DPCC8rh1C`e~4 zkx@>*8AF8`hqD*1a71&JXfZGLj>fV_r}OqfrA=E$tEZF;RtWB}FTQpom`j>fuSQgw zOEoCY$Ksae-7?{t%^%W~%xG;&K=NS|)svm9SHifus;YwzCwLcd#^W%DH7-w&9EYip;G z5+(Kr;yJO4{%Qx50L4o#JG-2Ay~@?`B!W?c=rST?_-%VUlRUV?WW&d0)|g14!ZwJC zr%lOl=(Bu09Q^R-6M1iLY*oTixwH%#otN25N?e06!* z=3hgW>PTm#gpCw?N#9^Ui%L2v&ZUn=k~`sHZ_q+h6=l?SXWKdiNlL-V9|8{yj^WW% zioVP`nJD_y9(+Kd0F@6GO?PaUKR;w#Q+mU`s zflE3F2|xsB2rm!Ud{hNaD>*Bv*s~nHX~~~uby`V%UM-E5b)1X&!CX)GybpVfZ&$}i z&Aa%lQW5~(vFqRWAEjU@(wHE1T2b<<7R(%%jddq1bzkNdct;=!B zH`qZy?YqhsQ^k0RGiHsIBBcem#U-sJj~HhS>CqIJB4{sRRMX1?IH^Nk-OLnG>fHjz zvNkJCZ@nGVbNA=%u`ZSMhJ>FV6tM8Z5r!gnD;4#ImK)7PsLib6G_9tuEViTg?r~wl zh0p*Q6kK7CxmqHirs`6P$@a||khYR2Sew3ja-) z)n&cEt6Lf(M`A#)P6mKwI91^*fy_i5-0o~sa7Yk>7%!iE^wPGaK(Exs`gYJq8PnyM zum%Jf^&R_9^RU}+e2d~wX!yCtblzWRyV?&x>?!n+}Ap~g@GLKFb30cU@}(qVn})|m12 zHg-DRrTqA2fEo}q7=#h*uYTm+VQMRF2y{HeUv0Y`YrCV|@zEyF_$>eRvnmSc1s*@! zbJkn{F~1pjDc^MDJ#LEV4{jhGm{YzWac>CDr%vuarM8O-PkCz*HGR{ts~Q{*ia|xoeqMj@o=CxAZGpAg}W}~lrZ30tghwuXq;RfKgz@9fpe>P_vkNiu$Y?b zNY}h6f(1E0XmVq|OpvalMF6Q-Q|(qk@`syKV%MjkfWVlgs}^3?=Tk$2?{BSRb1PZ_ zEMq`SBgnRl4e|F2<6l(a{4O^Jtt5OtHzn8E{I1DVE)qs1`!~ft3tk<1lHb&4$`@f0 zKuGZXEhmtkb`|(H-`)3DQr@&O%=ma@zm^F68$&)jpxrVIS$9_9m$LSEoQ+1FjHEu= z9Z?Buf0kzfFqt{ski%94`!WSjzUnlaSC&6V`BvOs*${j@QHEVjK~oK7O3RUp7mu+DxG5Of3AN0K(#x7UyHx15VY8HkHkW6*5 zbHDC7l#m^IS*E^C&HwJ;Gtgfh%9b!sAL^x%2klUS1d3ma=bnomWN455zz-o_?&(h(Bu1L{A;e~Ubyg7he_a-ngO|jyK z{x`>;qjUULhwO{JDgm1O{qT+}^bFEw>Gty&rw}wMc8G__Ujs86Qu}q(N@`B2=8-6^>thI-?HHE0k-t&bwr`SL zC&dKZ=*6@R^i0NELB?^(a2C05Zn{n4!@u=$zlUHXO%Y1(`$n3*`Ly!GU`9-bW^A3* zKV0_1+i^tORr!lrnqDl^ZVUCzzB@CT#1Qi9TUhxl*KGv(X*h-3+syV4OyrC&+Cti zr9|||2B5;a1haPOG?eNe`Uo$D4#eXp2ZeY1Pa5$D<*w$zcM*n-tj6W0AR5|ldYH3T zw5P`?!zZf?LlVQe<>gcA8!m2CYw6S|D^h>&HfVQrkeM@BX%^hImApc*Q#N))CY<6E zTj*)0iK^9?>^OLBuHh6UjlAWzZOrlma=nDg3PXUuws^G3*0M?2R!j{B!$$j~s3zegVx5>IJi#MI9BMj^Vt^cfdR&ZiGxOJX>qkEQtE=1oRZRp$2y$9 zou-h=3UD4W`V{7`aN+PmS8*R6mPX}95m^?=T>$K6q%%D6vTVwa&}le$sjxK0)rrV% zSA#V#z`uKH7wf)1agHC>oS;JZ5zmDEFJ*9GqO@K~CZk8yjACDGp@@95e-pHEJ!^v4 z9h;v~8~HtwkNa>VKG;ItKF?i4yn#QC^33NuMo|9@?7ysoC>Fl{Z9t*_-_q@+ZuW7o z*jik*)34W38zm(b!{hLZi$#mI7ab_s+C78;+DdkuxbIWgG;6#4BB7@-%GHf2(1N;X zbp47b9?W8HfMT?WvS@Rh) z!f5Jp0K0Q}79FMMVSxPM>a5Wh!}p#Hl_6U6*ar_UlzK>?{;xF>MvytsofUuJTZY`& zr^4EAj}{*+?jIGOS?U&XmNv0y%sD2`A$v>G^MEVtyNochZxObY?WNHZO+l7yh_O6KZ5kP<1(s-sqDieKdMdRg-DLN%j#UXa@kdVh;V&4l z9S10#6|Udz{j{jj35pF+8u-y>6s!}Vk|XWSW}hEm9;>zplfIE(vXWz4kC2YGB#kPL zz3T3A68mtzeWnVp#D=IgxJ(1JGX5OyP7mgu{zA(#+y6kav&;P>8zNq}3<0?34mGerT*=zS2g zG_KLZr-KtUW2Vkx6!3LAGe>o7JygSZxdFjHjubnEPsUr=|g__oVmTqJ-WtTWW#aWT-9_Zr`&@^lOPUWg& zkZJkNJTOiXJ8(uLGI~@P=n0*tcwuJphEg^-On!NYE8W*`Oc*`X|dvGKNIN`8BIORbF56$RX zUKyqEn$pddA=cYoi5Xo%oh^q{WvGihKDY0Ea&Pp?fVr2&$03>pE%{?SZcR5A2LIS; zXKbuVYs-Sqj6=s)DVX!2b*1x*KQ3$(w-Q9_UX?&_HX=m=sV7VhTwfjw9)-jH|u1 zxufdodlTZA9yohz%}ZBmso$65(yYse_&YETYK|X8tj@B<=9e6Db+$7^nuD|n4gKC; zM+$-2vYacf*2(qCb~BP%TDANZatiTZ?Bj4MD(&95v9+tXK0wcmC8-|K^`!of#PI!N z%1ye%kar_PYO04*DJ10XTW(!6V6bj?S)knO;E6`eBme{Iv$}s^@qj|yk3xVbo|b+o z2LbQfIg6KHL9-QEeSUO(t$y>m!NH2k2bJh?j<@HYaim`lI!Jr9buz@8KtBUl zSO2|FGZDc#bhuZ@m8-A*Ip*-qo}u7FbU!q_&ndQoE;GkUNh8aOMqjJ_`4Swi!wAIV zulRM<8!Jtt2m{R*sv1kd!1#IYVf69r+vci5^wVSGi7T^lf@@=~hJ&eq)0fL25$n!4 zba`+_Tu-FJCRrk?W4ERZS9gw06pIFaDYa~Lf3!nuQ`&t-TP^~6g#l z&OdSp$wuk<0BwAB8M~j!H`WmMdycEe%F{vkcS!AbQeQF5E5ko28`gBj+#6-4^gx}+ zB;X!&SQuFg?T{-Eqh+|7ED9hO(79Ir)gwLCAaNd`jE%wK9tEZ&pTzhPVquVRY?d z8+k(iMzj9C1`g97b^UYNpbrs_eg2vG-A6j}egvIW>)0+}X7fL-N3@vBThImqK(REsc!U*Ouh1LJhuk(Ogx%uggj`g}?+$RJ(VVpv(- zLZSYb^}^;?zU~*8$@nCwbM9Q`}80?NvT{W~6Owa?vWqxvx_wZgCY zU|GK%W&VsKn!k%wl7eDoGU{4+(qg#dv+87_rTI4Yy!kT@CsKMV12=4hd5^ilS6xP6 zd|~o-w>~X<;fbg+vG>y<2`D15UhUIFV`r20dDFOW-#THwkaUh%+i%b{{p`%=uvL%7 zH3QAD4wj*PQE{xpRI$3pzMpZyWmf}b2{&5zyf?8A3EZg{Lh`XBM1)WyM@)=~UYzEe zc4!2S0w5Y;AyYquw@=!xXRTWIt~7NQEb{imMCe$DNAY%oUL5An9DyzZ{WL}|zT~`pIwh2RA^SPmMO(S|>aBFEniz2Y0pLZx;(FJundGNDp(`8G-Ld^YiN+0McPnSd zI|p`w2T&jFk}=LFxzrUwJ#!p}-G1$IfIxn?e=1l9y{t?JGLxv-%dJ;TfbUfFum@eS zcSVpwY@?|EcceJ;Zk(6fb=dg;dbEPI62EME-cawTb@99B^z1*oE#G856e+a{!zm0V?4t10xYYSZ5>BQ#uE9fRug$z<)$bih$d12CJcCeUh%IT2%nlz;=Yn_ShGNgp*D4IJZz>= zi#H?Hid0-2u$|L8mUWf<>k~99iCUFPEgcYOg;gkMJkma6Y@t)8m~cFlz51^qCRIr8 zi_8j`9j=-jbq+YbkrTEWR?HIiM}na2mF$pG97+I-@MTkmc9F-KCJ|&`;hsGYl|E!L~Ub@L=4SLx?P}2X>p#mvpt%MigM-lv$%IRI~P$u`+6Xavx-LwzGonw{1 z1ZO)`=H7cO%l>&NIpGhryYVL4%Kv@5p!!<|+0JN+eVg7p;*DMCgb-=moH`@A(7;Dt zdbWhLrSR=7E1UEBmIjx*dZy@3=XO4mf%(cCDON9=O&;8wU@3G|w!j*C9{CQ=jtBjA zU%Lt$K*B;nn)Xf%eX(Ho!aB48q^Ov^ELcn^0sfdO{^Dwdizah|HiLuDhx*!k6B{Vo zvP!^_t!B6s7717sW+9gu!a041j7klAA(F8Zq-dp6izx_a)(On;V{YCDGPN=8q&gF3 zP0~flP15T00-z!Gu+mQ*P2_x6x0VtP>&6()sC6#8wbUX&hF__k?Af0PNs z$|BGx|a=x5o>8_Q6l~GStig0C-|sTGFTP6{;d*S0x_w0u$V)F z$@!6Nj7GksiYV7+eB82_a2&6c!=%!NwaqtY-woEcT9)6c6-lG&gSAT8>(7n??6u5l zWRyrEnpw=>Q@Nf##ly&SvF?65 zOnicsPLfgF=I2s+JGOHQ)=x|kQ0?k;Gm}qx?doKN0sA}km|%&|#rz7*_4A$%1^eGo zxS?Maa7Zy1_fSo8Ap5P0cqBJhh;)&nm0VdFEvcr+rAt2zS%NUAO>t)b^f$^r9Hw%F zDH#pv47IBEAM(sYp3Jm=9F%e^o^4a|uZIKvN&-?m&Lj^b13NtMkpggE;a1-`o~RC@ zEnnS2Y;MK*_qq(cXMVf_Jfk8dVaX~tpL6JE$o*P>nq*3GM9nf6kguAzHRbY}7>v#- zu*#gx62sDX#nlwKhS#VaqnqR;W10bubQq+AFj~R0QGah$>t?`9jk$2 zB;@}|58!}(hDYpYPyRRW0)YX|h=^)JkdU)Vs^ux`UE`LMCK4-aEK&t%;dSOL;EJh5E>0Ee)EvKW6Q)QG zecy)`OUyPMpBJXeb6xx?Ru%1-`lh#75`G6CZR~48$oP;UV2e8oz?vtMrr+9;q%1BA z=kU-fh@c{iTj{qoyurkC!ntA90L-V|<|TvfF&hfgvm?puM>7g1dpIj%S5OktwpZ4f zc*eqi_qAd})v!ID)pQC-vN}3gF` z2wrx22YlxZ;7pd`a0l572&y_ z(5uw7LMs&XB8W}gsm2F6S0!iranT;pg>~F+Ea|YFfSGXrW^Fcu)Ob*ga<;m09YVJC zBu(Nn>3u}Kjs^;B=|=pFPTwMXZrw>Hx!TdB)b9kUJDxqiz`+IZvw|hi`He7*i~%Jf zPGq??wW0_-hDHqyJ}EHSJ>k>LF?N*{IEfNDD z5;d_Dg@OB8@(5;%J(f22tf)+7!JmzVxC3(M!rz^gtV-#FvZRn2>z#3!nKqG#!net% zKv`emD(jDIP_~Bc@^e=olMKj(p+aG_bONCsSy6e(VJ3Y&MB7uzNdIsXyUa<|P%;Sh zE&v|ANDjKWP4XiHgCeliivb?+XhsG6Ogvsymh?S41S*|c!uOCxNqsW)7VQ-3_^T(f zF;$nTF!lk#TDknzz-h`J1B-? z(2*eYlb#0T&#*0$>s-~W78fbq^ssx8?C7WB84_UH2^i z@gRocD)CUL{>@2D^mE&6*txph!N+Cuq7Zr>&9E(fngFu6&t%^_T=LSjc9F?W!TIsrS@mBaVWR33tV&l=`N{0 zJYdqiEoHl(B_|gPlp3ckZ}=%?1T8dW~=$g+? zH|s5@g2iM1QC!ymz-4E@LuONF`)TFSJ|9KbPaHDAncEXt`*P*=N9Cvl->7&){F(-9 zmFG{`nx+`Weoo0!O=?2RseT8;MI?wF{!^{>BBq_4LxCRYsCV@CmSm?*gL&RV zA6Cfe-3S-i$*=_hzUsvpxLuK#9I0zKZuatCsY37K`s%P6spijHhJ!3S_!tZ9^`TakMxtxwp@N4Kt8*f3qFYBnS zso|t@!sZs=A!o_}RRCqp>B{plE5V&p3vqrKXe8uZz(A3ae7@f<{_Rd*n&qUAKtRX= zqczI>0uO>)dikC}i>0`IeeXV=tZwiQF`!NcbOKq($FwixQy11vNc}?eR;3eb&KSw& zJ_RJMzjxoQ$qwBG!Ah99Q z4G2&ej7V5nFxxlBrjzgSFhffLCYrG3EOaH}-$SbHKjqw~r2l&~LERp!VADg3SJFNK ziqHp9uq2*OT9!AlfIyiuyne$(pW7l1N;h9<_gMrlV*50P-65wW{zKZ_S1w6oAdC>q z5GK0DXYO)dZaHgkfIit&N_@TS^Yf8^Q!uzd%kD;4_70*T^Lat)N8QUN93PB-@XE%!J)sfDAv{1H^cHPoE!x-mOYIc zK#mbdS!ewmQCgA}LRm|9El1^3E)#~G6C^eiazfvCmk;m)q}0KQ0Xq9T5;A7>c^Jr& zTcMX&v8I24vh1kHnJ=0AeRHzfeVf0YzviGgc(25oo#P>u=SCCRCbhtJKdVwE)D>$| zFSm|QGw+Gi{9L%6g^dc^YV}%ULbK;@LzV|jt~xy;f1m4w?eYpmfXm9pQwI{dQxB<_ z$Pvz9%NN-rOt+>14l#<>bl z*{-ShgWm;6OlmK#;MqXmd@(E;&YP-;V}^$(~)@ zb^igY03N`J=EoR=2!2!L|FA$o|7l}G*zdv-h5P(RNLCe`YA0NrlKxat|1sS4`UG}g zw|1oSZ0d~2J+CS{e)d=hAeG8ao#G*Y*BGh|CIa*;bLB;HrisZdx54ntfN4$+AF5Eu zdIpT?Ki3G{WHWmSH1GJgj~MM(;WMuneK;2q7JRz*l05J)FEiRJ`HpVFMH}t(D@z;6 zr6#Bu9ItZEse>~g&b#`@n8)iGel6l8bQ!U)38~htfyY#Zxg&m}xlqs!?lK#!I;}@c z{;UeMZAd03EyWtnC)G_%sZD$nPu!z~yXD^|Mord|BJW^SrNm0_44`6ygsx!A81q0Q z6pVC0e{^+(OJAQ^5HYDNa74wh0Sjs%T(W(R?0AFRog-6b)4hOXTj6^^GjA%37a*pg ztrJv3xFr7^>4kGhg`n|b5J>AQ5=A^xJ%$aFIu z=G3!np>L-61RAEs`llJ^kl`a04HgZW69%{cxD3O{ZuPCucy3fZ~qKgDmypBB1UWs)n8oL_r# zp!%C8R_QJtbV~$3ExnG_es~&@>U68xr|Sln$SyPQJp~o(rcE`8tk1$=0O;64csY8V zbK&7GJ0zu#z~Lg62S|T4%7gNv4aW(M?B%A@ANV}qHw&L1oOEK4UF^i_Ds6rQ%<=!k zF36?27_RX5`B($K3F%m6A|3vFf#=7<6@3J=Ut1{-EH~- zi58WqPgNszn7a*C;BK=h0;xLwOz8n3L# zwYt*Yc*e?TC{zsWYZ!O?{Lbh`iQ6M?-%s3Z<#W* zH&|fIkD43i@;%JYEjr{I#_Do4p@o8K*Kdr>p63}Qr~*A|vv{9v@oLQK0V21*(LzR$W;x!!Dhr`%kyBV6~9 zs{yG!wZY$;kVAkRww?p9hgAqA5V z{!i(_CI>>8`4u$UgKfbcLt{sz^Ck|yj7i0fY#uQL_XwT^g~^b$GmDGV0Rc414Chzw zGTXRALn(tkK4%qVuB?6F`bUQn1fn+UihW@;>3^+)iso?Tk$)o@qYm(Wru1wnT59~m zWFjls*pjTuxRvg}k*czhuXBUY@M#+%N;i6LjXb&{HE}8F2n!Tgb}GykCihwexhTP^ph@9t$GvNmc1IIR&bMLnD=wryXQAafv6@Pe}x z(y{nc%`VR`s&9u44M@hkt=QaD<1Cjg@6M=r9lV&ku1&o=-px``l^;2e{^>{1(YuL= zX9Mh(`g{vP2bpIy4Q9>XqQh>a>WVx|t?cMZ^(dar+8>*Msu3_m1`36-Dn$LyX-h@s zz*SV{zo1gTD2L1@z7Xkp@3Ma=`Isk&ge>atZFGRLw`{+UKoj{#t>SNs%`)ZC&Qg z@7+W`hg~e_k2~=-YU8qp>~6F)%%L95iz0k%#al2)sU!EV(2x!6vXh^u;B>~T#7RqkI0h|b{FD}`gvV~{T2*rpPH z>w;nwr!9je0YHtsx&~g8YnTzmiZg-aJ+)(%5lxe`w9H7<3l~k|@_+2wq1XgxL zug^HB1WFtHGpcHUA(cE!sw2AO3suD%V8JDjfPHE_zP;emj;cCxBX@fL)0)sPwe9-! z-X|>?T>oXI;u0$>aNB3IqEDfb`{$;O{6?Gpy9E`J*l7g(Hb2InvE73_Beimn$T_7v zVLH0Vz8Thx(017}i293C>+X!G{>4yoVB`mGfItp+Pi~dNpV&EW6d8IqjY`!63!Hg+ z;-K1(8TXxAqxf8$3~J~qhcKwi^v7<`N3A@%QhTVW$88&9i1b<}SPDHAgXj5Wm>}NV z@YZt}NG@=J)&I6;0E!uCo&d~YR4!P~|LLXp#!*JWUC;i9L_TRYL+9-rSjRp!2*Kr%;W3&%dE@bn|y*3$f^}}}RiUHqgc()(7du?-4#Bsb=4CI&k zDu7oMg|clCR^;nv*!yx<$A(z2QS}KZb=NUj1>#>E98l2YU(YMbbtx;+DOm(+>71}7 zs!fto5=OG&6{uy@JTET}FZiYE&M1?gX&lOte4D35*1HsWi_8d*!76{+M@^0Xn zve_G>PLx_pO|jzoBb7r{bs>jZI9zdP^aK^{#4y;WsILyg1b8e4FQ5{ zaQh~C&$(aKt@~$YcK6a}b+4A{+3gn)P?$@f&~G{E-s&pkV{@bCHq5$apPg{H4C@6W z#0{d0&pOVMyY3$dKbc=(lBZ(IkUQUsPGw_Vi^?vbi3<&nwfe-Gb>lWg__X_Oo)DVC zP$S4_fb;w1Qz5k|?EI|Us;4qbq5KdDn{TNx3N~w8V*AV#%0!gK&BY@Hd?*073ZJzK z-`#z0JJkNC_4P2Sm7*#uTncG(`)aD9Q}q}XB~$8ug;7~R6t^Rfb8kLo7*ci)(2~hf zI6vm|6jEJVk0IpV;Ldrxp+6EATqKIArSTv1&=>9kg&`74m=<`ujl~B)>0RukI<$H3j^mw8LZfhPKs|gOG>ehjqxoe?ZtKWv zBLT}#&W@38wqO(RI78`kM1r20wch23g59Tp^3Yo4s`j)GcFtm1Y%S}1ZN?vcswvdFiq z{K@AegapfEMIo7?T?O0htg(rH@f8qxWvO~AO%!N%%8GL>KT8Ib@1Sq5`79r4vqP* zTA~5sQ|6dc<1AO>|5I92^I}g1gU*f%qWygKe`qh)TB5VW<$t!l1wgxDuu81nKVVJC z3}IqU^%IKCQki0~Qm)>2U`_SkkIR4VCy46<;Z9*n2hyVR9Da?rOQBggLg7uc?I6*= zKm@v-lQlZ~i=CeVhtXPsrz858FP?_P7@jF{GD{pf+_2m&^u+(2rt48h@nkS<)LoZJ zeC4R3n7J{-v z6t;YIxuKQD0)f9>`PLW*r3b2%Muu3Ua}q*$eMBQRar|V{>#FPpSF%!7S=YW~-841OcF}vIyGjwq37S7| zDHbMwTy(sQ=gpfJ8gtzQv4lU6xpcOvWW-`V_@WE1m8T5U$|>>Xq{fG?cm4^L=|(l` zG7L+cKw4$MZfT)si+0T#sp;p~j$}6Y7T#fcc(ueOOrI25q?I*R(=QGxmgo>2tKrWM z+dC^kGBq}#Yk*PnA^z^((?}puN2<7xMxFYeN*EqK-i;@J81T4ow-8y=wLgD<#qc`dgpM_7xiUZFo9$kxlZ?ysFSmn*PyIheTzQ-|hoPov2fo1J_rY4V?Uz${d0_b%g_^T4t)ZC^vw^U;N`T@lg zkg)>Vim>MQn+6n^D126&Kj^0}wr(bDM9TDKfxL>}5n6-Lw*0#v8JbD7oojtZ%lr{9>URVsrfz!pyT`|8k7B#L(KyJcHE@kXE zrW>-2CQSs>0Sy^g?)EAwU$#=-a^2@mg zV22vjEr%R!HDzSPkL(>k8LzSo%CBd_SA!;AM=v4)POeY7MHCqX{`lu(y5?oxl;u;x zSCEEYN6&qexT@|s<>`NP65fJOvo~lRS53RgC#}`>wJ$Va$yY(LF{`Ut-b&XabJ8ATg0PTRyFl<`8`!aMz zgL6u(95S^t;-dP&Fce1n-#fe@+CsdviSEZ(}a zF$G)WkYmQBjBKwx)yn68r~-aT1q-vuIL$@(I=b?uLK4Zb^l3mbR0;ssMj`TEUm^Tq zFzW$sy~wcI(KoU|SVaQgmu30&`)`j(&(#(kuzrrompFQZATSIOj_DM+2?nX4Qo-!3 zITGmFmIf|m3Jejh=^I1Ap7&SsVAC9nnG}-@Gp7jQLQgM8B1j8TaQQ`sOE>k?XG=q{ zNe($in-+o>*2kvlZXjP07}G6k8vjo5>FKNwBvgftsSKUZxSQe8W*sb@Fhtpuuybc% z_htKg5x0naPI+dW4oWxu`-pMJnLQ24k}s6^dQeg4%YrT{an&8%mFrty>8PBYpnuT{ zISCyKtYu>6vhSlvos@|BJuwfmpH5vQDu^jeu|?l#Q(yD+CuAED_)n16nOy%%xWs6) z8+>8WMkJ(sik`#+Y7{KYb$3@l-9(Wh8~RHR19nh39Gk;IPrV(Ctsq2yg^urd*1=kr zW!1_cET{mzqON-tYX+p0B%|iiBm6IY)WM0L!A~TRYSXXJhFUxzwLonXj|Td@zjD8H zcKr{7hCXu7v32LxofICBVv(V(ES(_7tZ@PRcB103!wCmaC zjn0mrmCs*GKt0ge`DqVQ^KZR=Ju%Oy|225cUj_Bj0BuJD|2|s~ERC8*A0Mtkh=g2$iyQ7hl4)1dVco+3Mt<$3Roiht>P^pqlkMU=#Y+EhRb;B zLjnS1IT28$fM^Y@Q*0I16O7gSZ`Mi)wTe?j)pxg~{#SiStnIKJY*t`fbVOIqf{J)HH z6*phK!5=_Oa}NiR-|kw}b&C=}JmwDdUzT%WSwzP48xm=fLd$r%yxnz0!t{e8Rcc8~ z;hSs^U{)E#~{z>PX8 zQZ9w2g$MAyiD(@+R~eNb--q`hUlr~&hz9Z{lGGOwXqOap@D@8NV__JuNAYC2}L9j4@5o1(I_D3pqD==fXV7rST3NW zm;{iVM4xRz{U!7a%GBr<7}+hW?gSu?NyCgG|yq$E06;O|rZt8z?FK zvZe6R8D19Ac(8yyF)PX;A2ZE4@J%xCEE0kV^rsl3--AK%*LMd!$?}JEmpJXVj!J+C zcPphry2)I29o{nus}ldh*3d}co%>P#SI7eS7(I(r%nq}FGBK#Je^x2xRecTo348|7 zJix`o%p~tUAfhgfiVRCBs|P1w_8NJE#M=sml!&?)J-!V<-mxm*pd$%^TIx%~$R$3= zss5xzO_c5{+inBgH5~IHn+)|7ITVM4WuWi)ufh!t0L>AcB&gl&I$VQBF%d;`1}#*F z8Ke&WBq-d;Ww8y`!E+RI!3x*AIhZNuZ;&<#)dRM>)0bY>UL*~yf02Rr8}k)(VtL}2 zq{(g}U^X%0*Ci$&#@B~skqo?eK@lY8c^;TrWGFA2xhaA0JfpZu7DYL1ehw)esS!Adyo4rYa@I2oVhY36<*PeKN(CH)M zQ%)L*S!AfDn04(A4tTQ;KzjWy)tK=XiLj;=)HX8`ILai6z^`pJi~45%9{#)DbeCEv z!~-QPxp1oY&!$FPns4K@3+qkkQ)a=p7+~QOTsy)zaN${Q)?irr8dgu@NW|r>9K=@k z7+MFKn?%k2{|`k&?+b2Ptg7$*hNOI|=0QKd)&OY1e%9(8_StUd!3kaq8Z1pw8PeK<;lGNF%+-@U<+B0MEwCu~M-azxp1H z;bq5aS>mzpRhgwi=a2y&q#Qqy5m6FBIP5QCaOgsfDA*}B8M+IWyt;6#H+(GsS_pKy z+Z`)X@igG>tnQy2jEf?R@Rz~Td_M)fOz7(~==lVQjvi&D|GC~J3e#NvFY z^lu!?IS^@kFe_0|g#aT1l+N7dZKMNe!O>}9k@70C@H6a?7ykgbQdU2_r4oT+!DL+1 z3vwe2krTbQ`-uuxE61HyWd!1_o9ylrpMQH=6#eUi2xgT8QIR=>S-+z-NstI!z5Tb3 zpz^^8Xs^&1M-vHM0cRI|KeSp+?a$%{wOh!c2~4rnA*BdL>hd6C^_mdAG?AmM*;!Lm zXUn%NrD(doMLe%@AH*T~BuL#VTZ&FEd_Dn<7%=eUPptGvFkHG!H;Myen=Cdtl$mKd zDE3_(mr*R`34YX42;yl0ITmSCIup;3-+0xMz@TNJDjxp;=)C%VqT;c7Ea8pS(eX^D z$hwXvOCfT*XU%Y&XW5n&h)Y!J=*kox^pzI4so7+o_J*f2PUHr@^EBtiqUxEJ)C$91F~@vK^l2 z8!V1(14s{k!J>kkjbK_fErXJ%gK*!Sp9|*>O~$}%Lzn@=iZ!BJa+<5l!rj7i(-}Ld-DkGtGspW+D5K&rML_Mb$ z3amMz=Jus&8JVew0tK4ARh0-d#TXn{69YbC^|x|7u`(}4PSv?m9c)~>=7ZB;(WV27 zN__o-s`F+Tpk$ktbQIygpwLC01#6n+IdU(Jm5BRyOhXfLa=VG&YeU`lq?G*PT^rGY zEMS)&k7o43eq7PASV*4EulcnfW=5~j%QFT!8Lb(wiQWD1E4hV0#z9E&*ZamxsS|I4 zzY}AeN`s@95?X5!MLcf8-nNBm22 z2yuhUf``%;N_-%%mEApm)}XkSHBwKW@S5L&L`X+vvrW7DzY_k~S7BUXH-%W^ zm`s-DA#?~7dgr_5QC>;C^Zn?)x_j^OydB>t6ncAFe)+8>9C&>){0*nUs3*wn?v`82 zsll+vkMHAl{-G>zULNTFz3TmG|F@H&@W*hA*D5o8ffQ1HA6uw_*zo zdV+4B4>ZSj-VO$LKHiT}H!OP{n0-H9Ph(Y4FOEt=qbD@7^x#?)ech5$n|(_;Ge{pHgR3D9EVP z-Ti#9JSm0xas4zmo!BdEOW0H6IpY6v?e+2ae7q4v^!jsh^;2#PG2kX=Td>}?8WV+= zruJ(8c(z0F^gT%ly<6L?f!Fu*gR@58dp>4Ioi4q8)l(98@EgBT-NR5NWG%>7I?7%Pg#TzQ zP=ioxxVE9KhBBOtrC!aa9w;JWo4r8qCp7O{-y+#>*SkqH>V48F&)Txz^L_~WxW8lG z7Wnoh?PKe5von;gNFldSFd)!ljHX!0GrC6f%J=4n#m3v#^IK+6!29E!HM-u{s*4&U zyzNoErx)S(`;K1!t`)^veJ{_BkDJJIqXvTlrHeAlfz;G9&>d>ua5ngV8wtI7GNbZz zBX{)Be>~l;$gjS8_AL@#`%86iqBnRAZ4h1?dKM;kzTHb1z4xSlyyo{09>3gvpfvIf zR3W`S_}D&0@|w>E`#{}bU*9%tSUEUl93H;DGO+1#2;PAq}fm-TxiVV}3dRX4}i`=5(O zM2eBUdFyzm?H{hf!i5b%56|nTnbfh>IEB3dug_my_dPl9?>8brSE*m!J$OVuZe`Ab z8tdr8#)tpQ^8xeagIxf9)mk;t)S-fEl<3s)bqDH96dRq=YFr=+mqwj zcA+mpZ_Y2X9n79VJFjQMlbOt18~mrs-?+7M&$(e!vSeoJpPwcx8xC=Ilnf2eg}O)n zyxH6y9^c|985vNo&u|#olOLb2TZGU=sdBYX9zdBp? zL$MNd)7`O5E!4he(f$UM2ykZk1zz`Y8VU@0d>;M`*PIXBSr&TDbZ;AgZQd>ZZn}CM z_7r+PS=XGl+8DlEwCWA)%};yV`!X^R~ibn?p;EtnmQDirRvblN&+$v^fBD6RU@$jD!jQ7nUkwBHC?F9L2 zeL0VM=k`|Wb|j@)!oY;`%^A4k+5hl6fW1_7#05iSe$>*W#iS)RA4gmkOo~B_I5vDZ zVpu2xK@M5Yz~0&9tI5~I^a0sHS)5${fHsr1#I0jHWV?VfMI)!R`W-aS`}l}>AY8`m1wMrBQ^O1*3-pP82a!LkLZO=)Y~ zY}_2xH7PeKPrMtj9keCJ4{wWT6XHTVMLspCJv&1~#t&e?=ECQCS-Z*Q>V6LwOPGk?j$830t@uANnDn6JQdcS+IHVd2sp; z1nsuvw87kfO~5A96&e;!7RKO~zRkW(SbR)vJZCqbQT*qG3pm3+3mUQiS)lpP z0zZ%i9^eGf?J(`o&e&`CotK{>Xq-8m8G@Vo*8A3B7pJD?1jZV{Mj*@}e?ep+$Ro=m z8Z)tQvoHsj_bv1_gRMZ=LD~^B@Y`wswZIDb|3U#r;D|M}$w%23JP&#V#_-Bm1XvBU z0gr<|ggJy}!TN`zJ}3|dU~<4Z5D2x<_b~U+jaWQ*AWI~fow=Nuf+s_l1gaXrWNK+$MBNGVIzb35wGhyvN6aE*26@je(<)171fAilL^peHc6xWpz z*EgQChH-1np5R_S)L@!Ch!zY!1U?I{Jj{JhT)gxcw3N-j%L8a7&Qq`P=r;r`9$&9Z z`Ib$pb&WO`OM7u}QpRs${D_|ncVb&8NCBJi6RD3o%$6U?WZ6Te99C^Rxx;Otar*Q8 z3b{;9oPYgOGMiRsjv>o^5{LWo2!@mx{weNi$_}deNCQIfg9wT-Nm(`Z)iZZ%X+AN` zvjW|TA|x!0Mxz$ufXZy!xRt!Lko9ClTQs{LklgagH-C&gY8WVzG`T}w>z_!!vlug* zlo=4=st1|a&{kvzrUwc7_mX2Al5;c|@@KEgIyHA+feWmu1I169Q8jRk*c>do24y!R zZ1T{+cm*$JH@={Cb0V4RLvME+O18+|xo`I&EBwV&P( zcfI`=zy_Nk;^?tWb?ty!y4tLyr@D~s_K^1n;4@7t!|6!m^th6mY;kiF58Z5C7Q7_zO6)=!Mj^ZCEQte=AIs<)Wdfvtd#RAD8Ymt9UpV(=?!sHEZofXgPn;lEQfw;ws8;*ce?Na-P4PF~8U;SJstNU>ac=1nYS?#d$b=fkf*^A)FE#~6IAj)qU%u1< z4z+yDx*AT3UA&c}UCHWHT*`_3u&R_#m?J(TBz-pj8wXBM%D z#=Ht+7^AOklks|f@?9>dD=eAjqJpGxoW!-f@FwdcQIouHBkc$hTegsK%Zs7{^%eq> zx?H?BvN6l}Istpg6iooUue=K~es-+ET?-`J@+WMS+Gwm|zxLBou^lMST%NdS13`xz z&980dqgJDfJUR>0Z-c#}G@eaLjQ=98i|eJ?({iY$J>I<$a)! zP*69?{vN#ZzaCtCf*7wDZ5^ku+(#R7<~51q6y9&n#?_4LqvuVxi4WF#?Q0$>qNiJ% zm`-=v)VE0p3YIQ4=MvpNwX`r&JNCa8<~p=a?IR-_>$i4Yu&iH`F&2Hi>N*h)Xe) zKCJ%z4SaICQq|kMJG&=YP<5SgN!cl2!h(BajJ$Ny8>6yfsyancKB;=?`DB&+&s zGuB$CP|8`@qrs?)hZ0mt7ug1oduTqz#jnXLpu~X_N+JN=y^LK|nI$QdtlYik2}`5! zz`xNgBxCrcO=Kg);T?UJfQO0M>#t}oRX4wKmV*>hRgJ_*g@9j@;Y^|~Ol@p*5&be! zut1|Gu{4cO`9Kp7hCClPkQKwGN|BxhZKHGykDG?;fPt}4942q33OVA;w(e5GR&K0( z7JrOq9>Q=uo%Q2atFa40wQ3HyyWJeRw8Pe97-5*5xU(3^|S%7 zX;RO!&;7d-t4@D@c35$dd~ye~R3ZJr+N>H9@+&zx6!;mbfmJe+m2Ds&%0RGOg$^zi zms{3^V$OcPphJzU*qX!=3i7yV120*2yl#V`qQK#m!W|&Spez=G){nYf3}zueUFrqE zg`@p77S+Lyfrr-grJ0>b6poiobuN*Vg3gveLG0wpC#u8-P~%7NOP>*p_XhBL>@dbe zLF{{eGN}v&Pulb=4`7&+Q57{b8Qf(hb>mU-n1v6Hq8T4{l+>gV(kkkS)dY?8i#O5J zA5S50;72COiPBu0fq6avvJ*&Ht82pUrbJOfktUM)dqWh2HVAV5-1QRVx zO7eoGxm*;3mEIe@`AZfRKHvfl9&#L+a4{jwb+$zsyyx;bF*sh~`J&JJH0tyE z5*n#U)&sXF6a~D-SU0u+tE~4@67O$PIDEy=pF1ep5044R!{Xs2`QV#64OW%eFn@_e zbtuigPDObgvG1|`GOkR9!5#IRHnSwSY~7UYL|2uCnKeiHs;IqMh=Gw!0DrgrVs92e zMBN=A5sDviHHQg4zI3N}o6Oo3mlvG8PZBpwBWuHYO0F80M8YuA7d0KXZc>J%gpEqM z!XSwaqqVeIse2_4?sjh%NP2`W38oxFl_G;qW?82{5b7D1ld_)|H3w*#l(x6FakMpz z1CynIi~7E*qMA=WrGQU<2TuRz*$71~Q&DfEkq=Kcp3tFwB zoo;isILUPa8m}k~#Aa?x4>)8tDOnK^yS&8oyd@@71=FlEoJ~3_nGm;SwCe1FG$}=y z-Ga5)9TJ1>2kRFpDoM60RzEiUqo37jMgfuNeznBI=9)MU(I?HA zJ z<0uiInh@Uo3>5l^M5%zX&~jII+CDzdcaip{!WGrERJo~bj~2H+qYdX->kGlRxTld| z98e{c(0P#K;WCASDHklq3v0}|Vl|QWx}A#a6UEYFAe)pydV98S-KQA(m`C1~GMM(S2&#Gh({di2ebLXg;1<4J22bEAgRXP$$h|RNO zMg)8ucN%!xD248r<0$C~hz}73qY{;xxLCn$3O1t))vdy=q^HV8+f`A}gr!ttz>?s}^I zT=tZZ3>fB>;Y5vNDC-v?lN#Bs&qn7nDe-+I9m+@lB)|2=MmW-(T#-Wh ztT+l)^2B~W2T9%tf4};YZM{ zL((Z))@pw^6%ifZ_{}cD2E~%r+E@B(+E*;Hl+iT3jd^1S%F2B3Qm}M~!7zYnkdd<$ z1K>CM%_i$4SNnGz1yU|KySV?UL^0^xa*vB`O< zDa(?Mfhur1xDAXpAg+wvY|N4iYzgbUen-&$jVO$M(sqS;iFHM3IE#jtp}(=L|R) zc%^|#kW#hPFvS-~x(iW4BpWfDwXew?awQNaG!A;Tx3%F{kJ_aSueu>d!ZQ{t&8#~l z0V)Cr4k?V~!}KGxoK%~bYTW%mT~rE8lnK|Yl~1_IDUxn-o^YwiI=C1TO>l!6^#g4vUqSa$JFR~~kr%|vSG{SLtnMutaVw|HUt7wj*=i$yhMXBInpkdJ#$XfSXWBxP}7S9kT6-T!*`9&tNvv|UD^uVPqhly_{ zqvjGyV~kTRz?F(=%fY#cwpTTJ%EpVps0|UCAS79v;>{(q_=VNOpqvf0l4GWcNU^~3 z*+0JxEiG@N2k%ZCSjL?-8hMHG0t=v~mCTn>H< znndtXN46Op6rq?zutI+WoO5sWWv`3Gq2xLObceHtq`GE!s?7~v(n$T+aMU4d6`+OB z5KXO{f3yj9968XIVwk8-FO|Ugyd!BV45R907KG6ztm~Kb2-+Isl>L}n7(Aq_D3&JR zkT>>N;pmjKe&{|XeE44Kzd`=~aeh7Gp!Dbza3Y?I$pSB@3U*w8loIxNw+V=k{LukRnY6B7Kf1;3}Vog88}i%O99IyEaZa%2V-M`BjVy_%1D}dxPw*g z^=I%N5>$L;^ajuhNTZRtPfDs<1k@RV)7UiM$g!6#bc}ilsM$x zg0R@Zo5#|Yig2INM$@Yy+;PdhGyRL;mdUE_DWH6$q=5w?>lF$JYX_6&scBF!%%U=C zq}*cTgrpR~woy?Wk|(SPu7KqPPg~ZN1Ws9m94vA^sK_cYkyG{uTmyLkB$=sY8ihn{ zHrP>uN)sLyOfz|DEenRV=rPTVYywk}A6E82>3tw_Vwmqv*hl&Kb~E{CJV~(Q*x|U9 z`94JV2cr(OEJL+kQS(T%(6iah9|tt?U~e?cL*vfyv`VYqSkrYXlc{>S+BzC{6Yu$X zId!{cd_r5fwB~f6hyMY_gAZ*uUARO`C69^T;OYu~?FIp$Q?;L~SXXn=tA=Bj~pBMYaP@!P=&;Mnk4*&Rs(su9aiJ|J(Dj*U1tVA6YE2w2Dc{GuA^KW8rd*jzZxbg z^B1T+T2pGvZ%_tP!z(;rZOGuGzWu;JKZ%x{zw^L+bw=JBwehh zQSwz+kwUg-N_$RC9Zprh`>K1k?UMpTIbE8D(?nzptCMB$Oezwi86$AzLdgcT4S_=2HwizZG=0?a17UU^YXzo#B zx0vOtO&nSu-op5aAJZhx$FWO<*<1N1cqVDf6!FIOHf zyT-0GftE7)d%j_9Uu6UvHn>gGJu}s9Y+QluzFZD6=aeZ-X)NYKu>gK$$`aM=fqC&w+27PqkpKY`6I@Mhjc_9#CrlOq#GcZ>uR10d`Sj*yRnLO&M24dXVU%?dM*I=;yYhO-(XR03akR#}!ZO;z+G}pvImQtK7*ZxY85IvWKsV*E zYRp(`lWb1=^H8Jco{dNGsx$H<>Nm`Hxu~{Uwj5dU8mr1cf_K{(@i4GX@j&Kwb=_7? zbM;{iLWXcjzY$ulsoH6S6P=OmsE8G=&vT4TL;9aMt$l;sI}DZ?lD&lx)wsw)@KVsx z6^%^i2YN8CUE~Mo`9u7+BW96L@(CwIC=+6_>_KoxqdS5A{5Lt$ z#e5NN{HZaJ*(5Vc+Y0s#A^=h|ty&B0?4Wq?7?tAIUmZWzV4?n+!T9XHQJ!&{^uP*y zkUbra_I&Y_#Fvn6E_M=G3#Ez0t1FLyPy4%K?D5T#H1!nXHB{4vtE;v|=EzGarI_d@ z)^wtZnHEeO-N_?rD~(u*hVqagK*MVHrk1%3crqCQDlf2U@dLff~z_}%gYL%B#y8>~uA<6?I86T(^# z`60c+^1(VQ(0k@reL0G-mHn8cwZ2WbvD&-Ed|bYX3k!s@_`S6F-|6q5M%s0W*}$^b z0Tfw>Ff=GIWk-MWoi!b09|c#hyfD#;A05(k{I1RJ4UlH|s)w{V#bNWgy5F!$>W5+( zlm@&0lz%i;KSuSEp)r|>iVd9p_Wf8a50rf8s!wHnwt8#zqS9P>>)>S4tZrOBK*U3X zgWW6|Z#%nq%S0~j%$++UM`(C6TBPwjFS1s5sl?8*Q`cYMNN^#()&DSjDI9lsMagCS`*S{i!0YFiTlK zNS8q;IWD)DwI=Fmo2&s*-EhF%Fb!h17SE7zLeNk)jbmEnSN76%c{5>`;68Hux@ zSEzNahaSZg?HM8$=jts%o+dZdjv1c-;S=5TDSo+jRM@D}`uAW1oQAN(^fIy^?;D02 zJwj<3CDs`w-Qw1d3HeNbb6N~eX`xnpJ`M0p8hmUy(MFnFl&0>hIJLU`qQX=6YTG$3 z?v`{^hohk+zQ`v)x^E(mBJ}5q1|5gK{j|1s&129JU95}p8!o^e z@U6j~-P$TcW3SwLjn9AJC1u-VeGDIlEPjQvYlv}{YGL6K3@212T4ssT^&M7P9(6&U z>Q@`Nr9^l$92GkD5O+8S4i-=M0Z`tu{sG`Zis%4(@A`xJm zW@z&V)=B$Dh_A!*eIeb_HNgSAU~##3#o&6QSPg#~LsC{s!X+e4$@c|v+nIv5a>$zj zLFZRW1MHQT`7&@13dRtJkjFIb?pBn@z0EQ=DoF+C)%ShI@4opBIbV2IsnU*cFdHca z3(3K09Cw0q<0m(-fV1lsN%&)@!dwimA@>hOxmr|r1z^ju4LA<%1lkds+*U8|d+3LK zs5!Gg#R3FR#>sE4jW8vw&I_kl@q^kD`qv-jBvAdo?lbb>2UQPY=Ee6KcJ8k~+69i& zim{+*vzOwwVMl)VR>7$vPYM`&YOhGAyM<{**A5J`u}0+EYY%H-j$W@AG&P-MS>p~5%NaNf}*F^rNH zui{-+f8dPL5kJfxWFWf=bw+lg$?a+oogxe2A<)#+K=KUCUyo=t++`qlA~C7Y$rn9l zX4g|b^%-wTB0-I8cFUh`%(Wr1Wc2~hJJ?4?GU>{$-u;#30HaPHHuAksN14c&Z4f;s z5jVKXD#xp0^iv-60rC`D-xi|($E!Sbf17{IKCE_2nScn|(Mgz0p0Tx@q{@#w2rC&M zNRu(=n2a?)cn!W>6N^I}9{CCUtRz)YvTf$<_zUTz&-%M8v_5GNxaBIk0{sgsaNLmw z+blFrhG~(?dJW7`B0uERq%RQ(V8iM5a>~2=<}_K0r3L$4lmQ6hP|-v1UEHN)U02=X zzlvJfdzN+XE^N}i@aeNLJ7s+$AX{<2T{wF1WBBu6LAnBs;ubO}zNx|4%3e^UB`JOl zxz9q)vpGB=wov_U7;f?fO;QSE3^h-4E&0ZuXS@QcHoFk1GLciagRMQ?3r zQWM4V+;UZvP&OhiX8@)kK*A1l@doBhN4XibtGwc2gV+;xCWMWs=7E9cR>pNUWI#ZD zP#Rfg7T+o3(}@a}jK;0gI9yBJg)Gmc%t3O+S;h_8R?sUzaB>_Hie0Wp z^qUZj;kc&>0E9fR4`lI_CzKe{YM)%_ihDfb-@q~?HwQy2oa1?yH`YK9duX$P7&$V! ztgCVZk-DWHSibE2WegUti1LMgTkJ!W1Rg`rgxtWWlCB^0i!&z~kY%{jCnAEP4~}hI zjc#MJ+BXSCE4=|dlX3&oo>n83<-LdJBk_5Wp@5QriZaoodG}hXJqXVyJ&U$Lg9ix# z1${UN5^U;sU(GQv;~A`SXDJ9Wcb-;VD-h48ExI#=c=u24GY{s<7sqv-S*8Ad%9OOz z6cE+uPc%6gN?K3gHnOaK0Vt5E~XkOst%%;!a6)Xxx+y!|SUgcWouKWCFOJ45f} zn?XdOKNBJNWR;1@nT;YJ)&sZpk01WHw2Ce79uEZ~cDiS!@|fqhM25rN&+g}3OpYd7 z9^jG2od|c#AJ|4L20RH2O>r_Jo;|za8=OPtT}&zwt8i{+!X~1uj@h2J=JF9-OqM3X z(c4LDz3g~+bK2)p9w48wXrV$1IGxNz$Yj4Kgf_dVMj&rQ$W)tofJgli{W(c#1v(`vIT(YUhr*8Df z-ZIKlXtqt0RlXv}5~4tH}OID#yIs zMrIO2aJZ&sq379Wd2uRk!we)q>Z5bVqmIB5#)U$?`m?9Z`}~03Ek6DFm#iU32;#eI2CV}K(xSn9#)a%cj!Lcc7ao)Ho@A-Nb(C6~sPyclk z5ZUTE%hZ(rPn5x_*CyA|Ud@XFEkRJhF{of_^#W9v80$6bn`dd+?H_4l`MrMUAn>ie zA{&=^cbS8I5vw~#(y}{DYjMoqV6dfkpE|wvjSQ4rnPD zHL(78XB*WK>f8~o|m z+gxpB_PB@paG6Q@`@5+3?3$Pr^o&aOcl^F@7!bTNz6BS&+oEE>4TmrhtC zv>}hrjMRZ&%_QN8Mv8-{HvMN$tgVvzk~|+9Mnlv}l$`#Ksu4+q33qe@qp_Z?|G~EZ z!G~79x4Wm^1$U)SN8^7>JLA409J{wm{{jP8g)3f?2;H-@j&AaILmzJhI433^OSq2N zIOmoQ%0CHcBUQ|eD)3I0f5L}5>;FiS+I+&Ytme;UBVoD9#W5#jxyr_|>)`w!w4sUA z|Jco9b0EmV|D4D{oK@?S2)uu0=953+`FkJ4l*h+E?<;Sk(j6|=U9r?Z8>xh3=v$T# zABtQTCy^g&zujTJs1$i_8hlrj{8F!$CdauYwWm=%u)sNod>lY|ud&ylEq)-!5re?0 zb2hZ@?I&Wrv?={2Uve>KLA-C*5uo;}PaUt)7l0x{f0cWU>+*v5)VlEDBJ_qGf_mLy z8(5vX?rVZqw`S>>_V1%cq@|Y>z_(nPW&wFXsz4axjWelExq31@SI8>}G1;uUaS*z6 zo3$L^r2|a0ve-;xj{u;%QT!be>*!+simmyo;^1jT4|Ez-%&(JPUJ^XoE`sY>iN2sb znyfC?y2f>W@YVQv$uli!0rL2+orYXJ=`^@r4JKGXrI+%_omA~?6w7vH73Z<2MnN>~ zkalZs>JT3Zr7Wr zHLB#~D#pjtWdN%#+P_SV4tCLBeT;(Exdl26#;B3s#c!nEJfO<{Uf%R#_KY{Tbw#Gu zzou=pntLvoL(^TMj4*k(=K*%Mk@qV=e_9e;MhHVqwqM!yl%gR$_3c7?{9-QJ*1^9yQ_vo@>H^>ubjHA4R? zuVWMY2veF7?3>sKDWqA%D75;F*a`Gq5AKBg=%lYgQ)f`G;4M(>CpBtJ_?aF`u{tBE zv5HE-$(A68p|`^}f|?1P_@S1>Nssbv(GZax;?D>KrRMyQjVE=r;XrF?OI@VsoBU8I z^`56mV2yY;)V(J;T9dWgq|Pw1$+%|$iM=9^VvD-*l}8^Ghd86)!o1B)U1C?lj@UZx z)HRQP2_A3P`F%;^6uzF)h-kB4p^K-|;Gd_^R`azef~bHy4Eo%IJyad+=_#dC?@3Sm zNndvT8ejLAp+!2lK`N)gji}F<71C89y*`dW-Y;4%b2F`@Qq4+sT!7F8boLp;8N6II z-cNN2vufhBR6}^M{P5PqMrtFf6|wwWpPn< zi<+Gma9B!&aB`|$iAl`1ffM-;kJn6&F})scvi&-`2DD|rBZ@PAbn$<|Lkc;(QpCd+MsbxNLcYEk zA?T5Z6$_Xtr=}B6@(&2((fq#;)Te*^~u4cDWMn8Y7DZ=jKIIKqeaRRE}4#&hp`6ry~$Gu*f;s9K;fg7!xfX6DQl?&kZTgK~BILB054Y()5L3F)if zm5X0NN2LCp!;EEOwrbf-Ylt-aqP4GUV_MRR zFK@Y%PjVJlF42H?(XFSv5j8MjPDbM1a@kcyYH7LQW1F2t6kt(Q-C)Y52ez#zhPN!H9WOXJWtX1Z>u*C*UKd|b<7J;I!tuP~#yrb5+ zZs4CGv@z3q(UO6m3I)59Nwf^H0F%&$h`pqSkd7#;OLitNyXG|E#kb)mJUM}(6|)RJ z#ff%q*X&FeyFE5`+{hLrY?iE=k5&K3%C8D2W?%7X6b(42vz zw`}a2AmhNZ8EQ1_n>g#uceB!SQ}YA2Oj4->r=%Z%&rYNVDy#w-jf#&Ffdqe=>!xv&&<3SR3wZ9J*lr*V0@M;&`M(v(pd7FM2xa= zH~|0yt;Uj z1m_GTYFJ(V`$3wTZvY`mskvw$@M{J}w=m7nmslK_|85eHNF69r!9a>rV!R9&4UB4h z+1^*7?p}5LY{7tjH5#JP%H~+>Ly*ObS-UVhdiiTImr$zIIkQEEqbT^te=WMn(I{_d zW=&{tG5tMf1_m`qOiA-DF~++N_!JbbFtCe@y)D_U_! ztYC7&Qrx^5H8+ZaUqsFmH}M&~OFw#T;Zx)Z2=gpumq&G{RHEEHDH72&)AQDjn;VRM z;UJc>+}QjS0JgSQvKZj#yDFr}KBr*L!O;Rc+55?VF|xeL-n;g%YWab6FHNvv z6;YdpO$psk1Y_S|-c^6D<3R3wz1G+n4J(o@-t>C3sC&=KFz)FUeCMp|^ZD~K^D*&v zeKRqMx3{nGWBPBJ6JFwz2~PwfVZzq8^u#ABN=wWvD?UrYtcL}5XN@DKh;Vy&b`khru~1(*3Z&ikmQu>wRqL1jUk*N2iD@1 zub+)}cZNISD`A`Xge%7d3j6qPKZU4Ayjv0F$_Gr(p|K=0pE~<^`QGw*Pq{#`$EIIN z*Xlj?N|k#{(5Dww8!7br=ZQW3LgpeH9Kok(E1ze6AO{(DoNeDj4x5xo-~J{f0yJPs zCtm;baXT%aEzyf}kL%bR-I-t>onfAYslEL?IISHQ+a*$xgiURyV5dB5XScPqCYy#> zU0wI`)aS$QLGv|HfYSBcse_NW4z%H)@8_)|ZF`KU|HxeyM0@Y%5vXqDS~EF_Z?n50 z{)}8PTO{(fwyrrfth6YNOp%;rK7z_eEbw-9pSuy%)IW#3Wq-+)m+i>2Y3#4kHbF4w zD`iF2{sd}p%F@nXIO9Ah>jYhh7$(*LN~a3SKkVZAB!ELroyTw!gop5vTWyoV=x-yR zXd~fygxqSY8?Ddb;h#JkI4KeQ*!Mh*kaPnP5$+&{OBl=`9f0Q~y6#u7Ll)Zl74kVj zj4YUSe*0mU<_kTunFF3v;4M~9SFv8x%O`CeX;d*kwLd{L#J+Q-hm z4DXN(NTnu|O=S!cE~`T2=fYI|flR9hoTc{(l4Q|0K5Jh_85mp5BYo9hjJ?|}D=oY^ z08WFiMyG7p8R}et*exhV7l8YnbCYfwwVR$;bd_pk9*7g)X?g2ZbT%}sz2dO0(5pfi zx}*{#^l5>(ZBiDW-Mir;o6c&^IzlHS3Z@$B;tPJsl;DSU6CB-{3lZJ|wEpjFbUYf} zh7M{>WFhHhGtg`S#1o2hb11)-=+!=jD*Slz7Wo$SQ`|b9tG5yDiA^|P1RplkJkphO z-)Rd3sUS0IYieicV~h!z3cM)ob;HKLPNBU5kv~Y%(^S*(5=bdln|lPa9C>#R#Gt-+ zR8SQ>Sx2RvuaH-swPNx9NzzbO7aXIkcskT*0>h(@T%GLDFcIZf&Ya-7c(yN*QUlra zIJ%7~d?jf9a=EqSsq~6Qyb4zkHv$I8vu82SS(^*aydTq*-3jl+857nsx~XDqX&-r`WY4CuP(E-;(5t$fVM64{9;w;& z1BU{{rEmB|02L`&H1=ExzR;SL!Urxs&{H&20qs^}f3Uw!98d=6MC)ycehoRbmR$cz zz%TotUmh`irs)z@?p5k5->SbJ)MIBl;b>kkbnR%TZZ~&4*_V2hzC1yjlTRBbg7a-@ z0A7P$O76S+I%U^(!g$8WXRNM1lf8KrzxNJIcHFn|KXE$h?47ll4JBE-&YFBDs71rUqPog zXj&ZeE8a+4PQ+1`iq_U$kzk^)V+*rIgVQG@g{Y4A`(o7iACnN*@^j$ZrCMsk2yJ^kGX=HK@sUR;#c}HN(nY$ zL}WP_ypzjzLfqg1)v|Fq%zNbxB_ zw~lm$0Q~}`@nMYX-%=r!H*w=s;p*c2lE+}`YLxyiwJU1wZ+Pk$LKILV_Oh1SRI*sEsKjjj_ zQ1&K2We|CqmRwSD&MI>hdcxw~eBz54{JRh>F=iOX^#%8n=Zw^Q4=tHD3+vWq49!R0 zq+G6~UT4(RiQEPEM0?x!W#!v&nM=8SUoS+=Try}ts@yeQJLgvZ_{r$JYl`z>C)#iTb zw3nIx!2sJ!OzMF1Rhk`jgLQUO3$c=0T?amx`%kI}Y1?;P%#?7nF;)&11RPp6% z1QzK&;LRq{DE4vkLJ&+d)R?vYj>2@~q)`DPz2Zj09KuM)}{mJ@FKaxFHg%El8(ge@b$cYdp@L|z0| zkY5C5X0xxY59<{}ipAYe!@2(Qk&&tym?I4R4nvIv!$M#!p-+UMu8p$xKuB=$BJ9TW z>v^DG9)?fUG!QXvm?n$}J)FkP8jFYG zRzku07l`H?wzy)1Xo?vZ><^4*iq*EGAFUX;pGk~D#KP+JFWfnfJP z@sMRMP(3J9yKDJg&P4x&@qVz`%ze_;|NEed{2xi29~ek75$;&zPfiI?B+Fsb8CMpB)F}&c!Jrgx3wl{yh3|c?ZVK#71{1465tcIX0|BM8pmPVdTymD&<4fQRkDVlM?fa`o*)!rjgeXEr=B zqhtEinKLcFrlU6$Xd4elPdYte5c>#N*)PB1RrOCJ1HVZhv<*^-U+~32|Jc07aLcmF zS%$$EWw4JxCgRr@c*bGt3e=XTqw&2VwR<5b6KAh?QI2s9^0lKEqz316S6VR$aoiE;#!j*EonrW3 zkVgK3g8>@}z0ds6nkmkjuk6H%tGOha2i+LZmUqXw@YY)LJ>xG&HP{#VJLA^jK6REK-v3VTP&zO*#4hqiwtlk|DH)428ES_a zaBke*rL1!JOg7IhCAg0-ca?E{IYHYu1!kuvo2MhQW6XTe#g$tx?f{PTqCin2^d}lO z*0yFR;X3v0r`@u2O^wkl>OZ7J;+u8k=z8WV|C!9XcgfAw2&k>b?7Q$pF(l7cGWk8nyB1xH38E#6gr}Vs1>{ZY(Y0=!b zi_m}YRR}UJ0}4X<)S79d^g7D z2*D9E7gTbQd=@tY@_+gvAD93f45K)(K`ogJ$r_m-m>41WHk*`>&WvT zlQaHctS+*kSOrpXw=vNp$=>@VR`2v{W)Zcr(Ly77w^h-rcgn4Z$$8kdN2Rllw$teL zEx^X?w%^$4_oihofg>@}(yiTr!c(5Daw+_FQA~rKcwGi@DMFI`FBJTok_}vcf1PaB zgvTky3K;QdKSP;WA8jAbM4b`wUkdw&`vCVWVO(DXV8jMfe0p!z!_ zXDvjpvDoUpt8f33!J_)aOre!2ZIIq88w(7$M5^+6i; zjt$e|?0`e!`5YK-_2*}~ijgjY7aP$|mn5OeB8(U_#mD0S${r$B#4MC;`Vi^1-zn4& z_IR{StY5SpU2#cYWz3@pg7+`RUqj?IKMDIb73Ub#hV?)F%nvXg+Lo{mBlL$X1dgcx zVPTSUnE$X6;2h;YY(#qw^&fU*I!F2s2e6;Rec~?eqjTZVD3Yg-Os7%Ax4iF zIFxvoDM_D~Oct=~k5>)sz2M-|5Z5A?snVuT*{`!~xh~O2RjI00vW{7XomRyUNS;^RjVD+Fqt6Hjx=T+O<0E7LjYtLp zEjxHw2Zw<)q^H%Ddd%GLF)H=L;-(r$S5McqvqKIPV=dMLkFSA~A`{KF8AgoHtFsKJUez(Z=+wGN*~{;^(BwMgZZ#!`CZS&(EX9olI4DCc!2s7Iw0BGp(@8N?sk zn$Fx1j*;Q7wJFc;yva8nC3P!P<_3XWzPAmhdWJ|XTjb57q2G^xf8`k#U4irS>$GQ|btCCfC1(XGTcnx*m(!&YtW`2|ikeO*US?DGvvJU1%tri;) zO@1jsXaChHAu$WaGgAcGWW=MnRh>p2&g3qdouwi-SOJoXyFBst|2<|b)@uEB6vhvy z0a(-%v`Atj3WFmqsSsaYIu-@M3WMPJ#Ps{Vx_ z0xv&maZGi4YGa7^m#P^cpfonTNpej#YXz|VFsFxvQR0+JY6I+6CrQJ&Qi9bU&V#i; z#X_RRcjwiQY62}~8z+R!KcQ7}oI~ETJQk@6Et)s6)ymf}l884||Cj8^M)1_&j zC9A`-yWPcK*~rtNCD1l`LuL!?3J(t!+=JwAp#Hl{qeun76jNBeqA3SHoaq^!*=Frb+)N+DQ|Q6C`@u2w9;2j zRI3O2T9!Cs&f&MoZfucLfc~u*Xl4w=!*zM+0Uy1MkFyLFu$Mqx}o$jrhfs zxsGJ!vkzpfqYxot0bH~AW?;h(ezI_Y2!EZ_$x_`T)r-*eF3w9LU*PZi3>2RqId?{v zPWcHKqI=I`!#nM`6ff|)B2!cJL<}q;G_Ob?Rh%z|cn7-Ilmg}y!*{-^_luS+lyU77 zTZEa~1!$Itc=%`@>m&#Euz_9`>AY<&>$aMG%t|3FHi0=F$mUxLm&~d^t@|bYyNGFN zX;5+8vUQL6*vB7Grhj%Z^iM^qbDuCL{UceTCJiT0#(iD6-FVVTQVDpC%{EB%>J%Kg4+)#y zXMp}kmC7P*nn|n@U>_?QD;S&6NMDxJex=sa7b_m?UTFWAPEjU6Vq7_$e>0*1tE0 zI10N$_ryW>N0uh+m2je${HZ5(92QZ?;+Z|K7RV-~6+EIMe5hGCKNo~0T8G4wKg>!6 z@y8J{2h?6M5bd{40*h&d)Pf7jW*U?lq6}^49|eDBK?>fnf|AWrO?GUeN z#|J9_QRn2!b|zls@>v)Sy^%KH3O#-4;i3=YG^6`mCKg&Sc57}Lv665=OUv6jQO?7D z2^Y8F2v!phUo?KiL|dRFzy_C$CSzn~YRYP6X5!j$XJ(efgVDpL%QPz3F&BiY*X0yX zx!u#vlz^syDKx;Dmm-O75Nwc0RV~XP+)&wsZp#b;ZoX6<>?qyiZB;m(Q%p)Thvd+| z(7e!ykU#${DER4mho=l)&;C`|$o%?(-;GzZ&jbU-hlmkhlJ*ADwh>mp3;BwkgGrCh3K2Wyu}ns@QtEuwKRP5vW5P81$T5xXt z6jHigHf}bs`G9N;ZkZ11zoZj0QdamCQLZU`Vq6rq2qh^v(iy^nbFDIU(_9PKTmPQDqS;As}5U0Zuz?->l_yu@R)#Me$Jj7oPIl+?fx27yfs_qKt@$gU(c>UkO`?@6p=lJ?#`-J%RF0Evzf4@bL=CA zAs{MqP3QK>ATlivz$dl!uhS;oTuf?yUs87@!e;GDj?r1xlf;C2j-_;x3XZ;Ivj}jP zj(O4g9G34l_VXGKwZdG;4rBzPw`3N~k$8^7?aa1$Ua>R;S^u|n+5P0HMvODHiJ4iF z#Ti5JU8HZARa$a=W;HOsnO!|<*`Qfrhk&4Fbva8s6W>h1Ll%)|*1n~B>&$BgF}()$ zM*p{I86OENU2bM`c+^Y6VS&dupmILlirw&ytRc!Wa!f5J=a-Z}&`AD!eLDY3l{KJj zG{x=bP^FyG5Pf8(k!8Bk>?;Gq9sL-UQmTf*#1CCMvNx}_e@RWM+QKpY&(z0M>54fi zjI(r=WDQK1>l8DJg@3^Aejpy3qOTo5q8QMz%ZiMxVfA9|HIr>e9$5K#X10oNnV!>) z(*tk4t1OdaYZ`JB1t)j~(zqGtuI>v%k$?!ZQ+{+mG05Tmgg%59Yg1Bj{~wPWRzAST zG(4uYPNn+EpipKjEob(-!mr)ap)!b|U@_&dZBzdIEeg;NP=fB16wE>keH zNH&-A+|lnyfYb=SYL`?6M$@k)6>gVBZWP{_C|1!h{@WR7+G3MinBGzcUQBzds3w6_ z6GzIHaefUMiW>ubB9)3L6~Jl$3A7nzj+jBAE@jN_37;qpN#-NXU-@RXO?bL4!}K8; zy1Zb_Zi$a4F2!NqgzEQbI7^fVwwM0B-vu_;&xa-~V4IMb=ktN63Tr3f*vt@N=upaa zP)OGfghPK2FR8%6M$cnvg}!of*+kt)Z;>bQ$+G7y2g4!?!R2Mjb>~&1W! zc{@c2FM-U)?Ht=nbI;k~QF^32b+#3IKS&Q3>v3@ivM z@u98hh7ni^Z<+7oU97E+abaad z`H}dXOUF`=^D%Hc+Dk+*#wO)88Pr7Mfua`kAO|IP)&<8j)KxDga#HW8IL9nSn}LT4 z*KnB)Nv3yB06R5r#4cLlzr?r5EdW$6Zk~i!8%fne=E3N%If~}m@nu`y$?{}afQ21BQzb9aSbp|1pm2rr>`(IEp~%_4dL2XEnTkR+I;N zUd%cQw|0{JBM#gg-{9liip?c{do-H56|Zg^Tu}XU5D>xO;+C2MdaZbVZ{1O&P(PvhxyL^d$)mR@FP%v7sj^^xTbNLqwJ6=jFm z4daw)C1iVykC=kjFs}Jq-&?8GQz8hA7zSg7gcA> zA{r_7cCQ}<8H!A$y~&mmOViYxtJV%hYCs9zIQ#&p7(__2gHNBU_Ts?uj+%Xt+@L-gI+7*%Zr_G#Vb zSDk8RQnI>xE-yga0>!l${!(Uox7ZtqK6h0(ldw zIQ_`|puIsYf|&i_JR7V#c(CaE5gK~|)+q|SoZ5LJM0C+vA`tm5JGhqkS;ewQ3QKGW zY3YjQUEB2Vd5iy+QVF(GxLry7S*_qCbfsmiqWfjo4hihkZAParuNTugDRw!@re1@_ zNi#b4Hc(rKmC4y4d5o3RzsQ7pntmj(rv#fv0R`K1j?=5*M`a=VRsMVC8BP|<>VhRU zddp4?IAd&*lWNZW%kU|E8cS`5`m5R#q3e9;&36Y1IEKYaLlA@DvaV)}o-HIETq`Oy zC~Csh$tWrgl(xJckUaYrESwY&{aU-+#52|f{sZ*a-ph)bu&)xS>Q;$lxC%6v@oB6G zi?V%v5UEDS{c$#+jGf$wPtLP0?Zc&s(c!E47wUEWNLY6D+sF#_ml#tVvJ_gq+@Sa>~9<+Mm~fnIS9RBvA@61SHn~{ zcAyBU!J-UHwvArPeNbNjdaQ@p89a`V~^57ct^jLUuo+BhPc;GZ-oy)P>Zpvq8?Z+wtJD1k|XACRi zV)~>|L(|*f$CgUnE}fLz6F!W)7=qTAId!C6*NN>%j{MBJHUoXLkKGJ_KYj<6ko(7g zyz0GcP5|jM`0l$4zC$}<0E{#s)=Au2tA1ZL=emyw@FGX8s&8w>O*<;GUd43$@gl*#vlH;Z=WQC!x-$QmcVB7phDOv=ZD- zgj=Z%ZjIv0QPt!fOi!bmaLk}n-Y3BvcVY|o)Xm7UTEl#rd+T(kZ{=m69tWVEbbd+r zNU3LW#do-yH*>(~EE+@uI$|s|$J={!OB#bN)43Ee$Pj?+{p1=gS=%@}$bC00^5B$3_*@fLVs%)YcZ%uT?abSYm*Yk7%n%D5Y|o+ft+<=@qNG&8~5Vw`6F7 ziI3Y5XunIAv5t&L#Px;U)7$}*4)}J|ctt=WF?mCcSXp**8NCZL)*&>YZ??4af>$#t zg2TltrMQ+^lP0Xz`l%!|EzIg7mot6?j(!o28e)wmt$neSY~(Nt3$3L%BM~T3vJH(M z@yIf|b7~()oo; zV?Z_wV36e=ofYTjMK6c`gp}BqkhL-KF<6IncX)%`9Zp&`U{#k>HM^J)%)YyM|Im1+ zH+=KZ6_}@3m)L;nO^fs`(N797tTH6=SitN{bg$SiWLX<=N1^*$Pa(I4UR}->C|`(U zNCM+cwi7ay{T~GZJ@MEAQIK9`TB(~bc96B_-xnjaZHiKjJVgbdI;d+v#gwl`X#Vpb z=TYof7tIcnnBME(J?eXr1GpUj4!zg5Gf1bHMiIQLu$m5#5R#ma{*34g{_)PwZpzOf zwMOBvSn+Sm`Nb7&Sot4YA7U+_1{EGZHy)OU(13KSxvf2xXo>{0NkstuD>2H!mNN$r zyj4nrz>d9Fe_ZKq)78Gx&Hc)wYnie#@9QU>fxs`_67fHM^Z68Eq>x-{FJ(F&YL0-1 zNva)a9Aa!2~A?%NuzvJum^fa0@7rc)MS!7j!x z^n)GXIW5mhl$~?#oh2DV{BfpJBd&~3JD$;g$vIso=nF$rseBFtvnPX3#a3s0Ev6Br zyDn2rky(eDrRsy+m4LS{cSgLx7zgXgZrz`gJ2`@Vk<17SX)`f=ab~>e3#2lC zv*q6foR=pSdYzp_42VBMQoozd^z@Jx*ytB$R9cOoJ>%d=ateqp&>lKB0!)$*Nn!~z z^);-+f|>52V;e7L)ey!#*vblu1T~rz$H+`98A=K)&YkK@w+q#a`|XkF3Nb4CU^0ftL)qZ`BAr!d$3lthVwBDM1WjyrFu ztQ7N>xlHyE)j^MQkp@BM$6ILkI6ymwV#(;o^>J)fNY(8PdUu|_LVJsF1scinz#Wwk zW)iIBe%+HY`=sxY;Xga1$B>+O;oRV@LI*~0eOeqD`H8INd^qOHrS^Ov-$;X&Z*)9u^hHaqNk!@F--cv|85R2x`-gojaD4pLxM3mCQ z`RW}GRueZv{CGf~l~bOTM_4FrwP#3P2DfCc8*;3P895UtQdZj^7Wx_Prk$CX1Qg8$ znw8eK1bVV{QlBzflQ`AKyIHeL$@qGN`%IkyYmjZv#_9^vPtfjnCS`nZp;)rKzv5r& z%SV-P5VIX{BIVyjJ=y-Ux?rixb9;n4^y}Ymav#VzXGtd`cYm-PkMMrHbebqs;?!B% z9=)X`#U#tqI5ROGrmXKBraXFvpzsYs?ueF#5rI-G2@E+T8MF{}9Zv|txrgL%gZCy( z`f;Yad3+8z;bY?x zFH|hmhEom}%ddCON6H0}N4a0vkwiCrokI6uSo*~IyN@)kYAc*No;oWpdxZw(TtMq) zx+`Oe^(|uiGO7$i%(Qsk0^IZAyHNph5n#r#P&5R2o7~D z*llba_PY8-XCX*sqY|}NR}jMGN`w;52PU;rT0BnXr(7wB+ct4Ne+j&h%cEN^hS2ct zCsH0FTCA-ktTwDr4`ei0TZqaPml` zLL8&S;nQgztd`I6^8G*(`UxzlB%fhTB(w-oaWjFpQZKwRF=#5e8L47^-3@tN?cY8r z-k5kV+^a>Ql^pPWN#V}Ho$P;|Vhj<4JRz<_cpf|n$B+7skNCYuP@i#baua!f@t0SH z^QF-eOIp6;)dNpR#tM;=`;I}DKi1Li_N({lEPDUSUf}z2mlZ9Q)1LD^l)FJbLlaG) z5jI0x_A9tqBVs$?*;3uYqi6-5V0=eAYv{$rL^CV5sV`|@`%VF4J?H`M()GDG*-aG) zt6=FVEZN3XFemsi_DxaJQFFo8^t@BKD(4b|zdl9?AA3Cxm81Pt;H8V5`R(eX(kPgSqq@XG_zx+quE9|}LCSb<9|91eFVn@utA0i>(_yc(_>48^~Z+jk}%c0-Y*ScI{%Hc~y zyZ5k0-fifzx~{5-+8m+Brhpf<@d&ZEV{M=wLYq>uQFNVp5CDA=v;sl0j_7JOj4eLK5AJ|;6e2cQilJixx= z7;dnlC;>^M^R1Bb%#H)fw_xTaE_W3mjUA*nBaxJV0yrPu<)ZfTzWEG%m~Sete42@M zGpd^-NJ@izI3n@5j~2^~IgvH$|3q62oIjF4Ryw<0dK8Re`%}slbnu|@9$Z~K5xbP^2&Cg zs1EH}@ct$~iQ}~L*}UqeR~G4g!!X1;AVp1hP>uyxta`=lrb*kcn(ma#Ej?Vs0VD=I zox0DX;uNaz7^UCt#)~vi<4C$2&PC-wGgNzZ#uSCqlG`lt((%iK0|aTYv2XaYy5bL~ z8$(y4+xnhqTys^A@9xRzIu!o+PE3NU_ciZEeG65Z{}Ll48ReME>oyM5knkauczBT9 z8f;Km7pC|yzv8+}w7tGh_~b|N<97v3ovO59yL@d@lWL--LPnqA!R7&sYKdTu7#^H3 z7Gk@sS=qY@xeN>KpIkoxyJyrR%mO{dda(3+y9$h=b)v}hFO^l5bFPr9k*(GkOB)It zC_Jz$Re|XjcJnQ6H|}S%9SviA?$;Z3nt$gmob}`#A4k=f+ zM^)`>5Ils+`NKP2&s^2oDfvf`G`zk)8}Y6qhr5=C^r9nzk`Isqqlt#p?6eyqqY|}z zFf>mMPfG|;Y#z+ydw~}H^C9mzX$T2s(P8h96pYh@%uOwdEqUaeUFxYsenF%rQl%E{ z4=iT%SW0f(sBsyGXK6d&(MSRsq60B_4v!@HnI`6@kS>|;tvGMEgH7Yy(ZA4|4ChNS zOD2*l0Y>1kMltHwn3Y2^gx0UyWhGhOs3&hEl-79%DeWc<}XUq>PWO!CNDQPW0Xd3brk;7IFQ=1LYY%d%wkAdZHowN7&%5Id&) zej*^6nZag8?|4m;MUq)9GsIkQ=$|nK(qv`iVc|3#HzuXWr(Zysho%Jhgjx<1#$|9r z@6n~+UpcWVsUMx2D|V;!ctIW01&YLb!k`2}wN!qF%kZbh(~}T19DJrOmE|h{!Dp)J zm4-zxo)66;+s#=smh}kYhid8hi1a7Z74|P@b!Eyo5XqoxykfQ-GGJPw*JB(lY-EdV z_Ui@LP*cxiKpK%xObAlFQm1RmQ86ig!~fh3TsLJ3Tam}nitYdnO4tMCWpunQ{!}+Y z7@BD6mdy6`k5$T8QRf@UYGD-Md!Wnz$xPa?%<}WbER~ZL_Gxy2@+m@A)#{8f0AYBf zdD3whgFzJZV~u5*8_`-`z#*1nH4SaPTQE)wnJa$4ustnX+|kS{9*;$+;P~G<-uFpcXo*KCiyK$BJ{n z%c@XjGn_vf3)(|FK;r5w@s6(8M-Hnhl8^C#{uYNXB=@pJ*7R6n4-vAjDM#K&?yagJkeiPFaouqP6l2H^dq;=p3Q0(py(Q zZ3WHc$6y#WV>6&QwncE6HHIELL-O*F4#+aw{-=TpD`uXaA%?J+ON3RIPu7J=ttk4W zoL%Yd+#FI22WpD8U2H81(pcj+csp1;s#!@~+$*dsLlQ!%z$hl^Ps4?t8NM&Iu=F%U zWAq!&N)ibhc3YVYHeWEuX4Q}dWa)Q_^>Rtm{eRU42*j|3|o7_(|g zL=oi|H9H?)Z0=rEk8ZSF7HjH)KYOAdbFd~N$cQ^?ML6~X%jOLaF!>%=Z4^u z&4b}MskYs~BH@u#F8?UWbbQ9DXH+v-4_t0WA&whFxioA%vvYK|ZpvKUQ<-xBzL}T} z2`SZ@vDx%w?o2xR%ni2{5Lj^mt_3EHs;G)~8~@H&RJe<_PcUpw)5)_z zm2C`&Sv??KAtwU>)=JjrlX_x$F@BI-Hahb^;xN*S0mB51uXr2D7*sFU{$urbC>oPt z`R^2C+;Pts@--CSn}91U2XYE`%^J2|pSL7MG)qEXVNfy@NQraVelBpWneouuSg&YZ z)qdNUJ&9Y_1@o*n?{l*{qZdj_Ooqf*KM>w(GTVh;RD^4(=I6q!p|zl9XyN>_&wPhP zxNYfZdWE5BC<+3XFR_?WcXr5?;8NevOIe9G5AD&btyZSW{jC3dv4cyAC{8akbi(WZ zB~GJbCXq(}>nju}XJn)7)J&#!U}e**komI%ojQwBP`q}8+b-MfXs$JFfRK^_;Tw7Fat%VR>(ywRfKCh{y;77KvHfj2N zZNREfPG{Z3?1eO(ptY4Kn+sc~kh0o&5FeBCL1hvr%h z6I?6;SxYIKx?HY%n{$@5oetu8I4dyWLEwat-N$%nAJ6Gz;M(%*|1lLhW9VFK`>-eTM;fq=Jne>DhP_C-gH) zOB0zGJtpTh{_>K%6b}WpKgM`Se8n)IlC(C-O5moau77wjc43zEbRM}G!SjmPS-}R- zS8MU1gl2(m<_8sGk+UrCJwL7J+qYe#IeIky&Gq&LrFRD+1>-vda@;M1>Y*F^dT(Q) zrHzgaV_=;UrfhAa{6jwGA`}KwU7Fr=Jd6(Lz%p^!;bcq16~GE}a49&!9{Qh8z2mo9 zA?%~9ie(O+8<)@yDZ4pNk3u8-{IsokNsQ9sV*~T#oqrdM_jBM|R4%Ut*?>icsWZm& zDZN5hqdBE0Q4_&GRuo?X!b-p!&ca*mHuMLuHxv@rRz`kUp-|>d^*TO30fi&7#F_3< z&Tf=dU)P!nkGTYz%b8f3d$*uPurVhrT4{?#jQP-SoX`uF$YQ6Es13vZfs^ZRkWR~k zMI1F-<7lRr7sy81K?IB10{SbjiVUhHgcJc|lbOmXj9D6Edc5e>=aNG7w=k$!@2) z68K4xSTy14OsLKPgJ+oJjO~#ru6KyQx$XXDS%Ldj)ER;M#VY6SX_j-l@ag9z0HnFE zvtg|cY+9v66vH$`K0(0WyiWQ0)DdFNakPM++h8dZ0D6rjHn|?iM`kMRjB<-cfw*8R zO$?)nv$O?j2dl(X0@X<0se-?x>iLlxUD*jUeBx$U#9M~Gq)u9lDh@B(4MHFX!L_{k zRfFID)-$lqw5mi^WYIx9nPcKls&=coa=9^6kov2|3@z2Mss1H>*I1*d&E?g(jLV~MRq$G{BJ!3*1 z>yEbCY?u@CZNtNJJ^!y0#mTDB{AjT^nJBcmkxOP#xh0ySeEC5@lLW1?R(b_2Vg4E+ zHQy)6FvF3ncVe}5oqHW-zEnqJTZiRQQ)o9y}97)MbbSg@u{`k!EX><+tejRdhYUK1MerZ!VVqCyf#6`1YrMQcJ% zJ~cv)xl}zAI$KdDgp2c=gZxMhX@r#TWcNhJ^@`N7m{FH;kD9>q)ZdWQ%UhF&3LR;chmfDnz4j*BGUs`rtU2g}$pfIYuhnZga0J$72_o%j>h9G5Fo zow>nd;#0*R?PBvjOho0ojruL+qu7&c<EX7-rKmce+Or+Jh5sora1lAvA7 zFZ31m^nSUd3NZ(P-^e2k+US(=dN!hXQvNpN8;+uVE0IVW^hkVRL9BKL{CSMI@QbflTfKfG7|dmK z;^Kh+V?|DBA9#Hom6R|iW6oMu@g&6EUA*3Gm)twC+nCZyt3z$O1u7XT%7^|cp{$$D z|0_(r$)bXgBFhhHpYLzCvTzl72Ly12-5)-fRt-rRUn<8+hhVLuRiZ=g!NRe+-?ZNs zwbtw*i*X}67nP|&FKe9QD^cBN(BD+ODt+WESY%7_g!dZM5e5!66Q3olKK097H6s%i zAN`9S4Xw6rSuK48EUVk~O*FD8s{T@58qN>=c6#YiHcrA#So{;~^7$co{OEtU7Frg| zTR6h>VorR`CwGDcI+}7B=@O3aQglsV@q`l@a? zXIfhyg%l#dY!LDpX7m;6#8nq=Y0PhP#%x>ReP;UO*3O>a%xcYnkCaz6w^h}v=x3=i zTYLUlgj5?|XAI7!X)9$H!H-zy>kq|rH_lT>#P=_pV3zLqS1zJIL_K$p&%T+#pN|Ix z2X^xV_~^eT4Rz6b{uy7tCiy4+b6eQJ7FZUeG?Fa&enuO->%Swr zQ9ydquL~)yYaG%}BTB-FteH|Z*Z$ckbx^}~wwU!Lv99&5-W|O6I$p^z|JbsSjL)$x zFwid`UGYPC|4Vx6Zn4QSl+q6iUqJc%D`{QaR9)NT&^+zsE8cCnJ7!^eeZ_H|=Nu!Y zXz5GAYV>Q43=U8jBT!cLMl=JLT{3>j8kkL4Iwkfw=WC!*Cd}saV9_m2KNnLmibVPl@8$~7-*{I9f?Rx@iS_aqK4T>2N^R*d zZlhXoGAzs&0&wBmWX1PSI1jMBlJQB8j>*=Nr47s2I|qLbkBetg0a>(zzt!9hM!O!K zSo(dWP}3hc`*p0^S@*XjndU{(h~J|wiklL zg383-xVKjS&XDWHu{15wEhfFNV?TpX!5N6TS<5Jg>3q{zL0X%%Ta|UQ>>=SlN8#K? zGgl`3t*0TxPrQV3IzE2!LCrg)ZNKk$Z0oZuLj1MC3M&&M9Eg%pNBiJ@phN_M0K2uC zsa4SZ1-b${D`3{pYQwr_dRKo@3Euq0bJ|kS z@XfXJ6&--=Dhvu&ptr2*n-{>YOqn=X$!q6bv5f-7?}~0WD`ajsOnSNML{F4QCC(l5 z3N=x7q@x@R{OGX@HfV_2d9MO3>4$W?Yjk4DU`{sqXS>9>45D(ZbDSKTvfg~2S0Pnq7@Kvw<+inlV>F zh>Fr3Q8!kACS=bbdoYH2sEqtw*X3Efo&mzcZqPc|vhuzjsgG|BbFc|SS0OC+OkUH8 zq|X?}4)tG5CQ=5#OpUgJ+ioiZpS7cL25+zx&lF|*kuNXn2aSTejD`-%r9=b zQkmEgU(G5ZWxbL9y2`{DRb~#e-$@P(C1kEvpV_|I{XGc_jB#3mbm_c%(D_sS!(@e6 z$c_~(e!^$oC;8#VL2UHII{5xE0+t7SJ)8x|xTp*Csg1UbP7z~c%Ob)Z2uan5NuHXP zBfkWjQ9m5dup|wpiM16?J)@Cl=}i|nWR_5r1r4r^s?LUmosbzw`zeAopFdHxMXynL zVS>?eD<8{vN10}szGKAeV`Vpmok#Y;OT(LFG_#F7=@Wv$f&UmxkpBAM1qs3vUOV$R zNUaVw!RoGanbF$RAC3gnz|Cm&>hW2Edf%jBK5@p0`51$9TPtB(JVtgi@L7@U3_C3f z?|44Q!nJ*Zu?M^87UEQ*%j-r5*yysCV^l2&MI(_YN#qLkEjt|m@K38_BdbJ_%_AQko2wD&Uyqm&d zS&*r!Q2X;oEjLIIHO0okil-bt2pVKQ2SkBUecnY}Hxf=03lqI74?mtU$#-osb9ONb z!0fqrkMg7w2t)x`%ht!BRs4(Vt|pvAk1wLM4L2_|Mssg=@T&-i(}DK-?f3c+@IU=@ z|HI8F-$c8Md||?TWZqDbUy>icjJK@s?dC6`OJ()3I=Q(R8R&^U7wvq&yZ3FTM*IPuPCedpP-%?}jajPZMRwS0iB zo({cJ#Y0hXH`@SZ7RxqWco?j9-O5t$D#S4O)ovN9))Lrl_t*my_RENTszH*&PA$HcH3e?E#*%>L`IST z72|J%x}HaMp_}#&y4rDlZ?fGlsbJl4bIZo#1G;Fv>5QT|8Bg(yuCRR08w#ab27gpY zT4x|Q^E0Hb?e|Nz>$h{7oVVy1G3-8jQ_(%w<_TUo!vqcAu6X;Bopq!-rBqR*T()@k z;JN6>jV4l<+5!~Z444MN=-QdysTJH9?IF==${KXsqQS0KzY7WBMq{B}Ree3VQp{?) zpEeOXvg?@33e$VdP=&ZU^AFrFtyvE;t=7DMvEtkvzBn)MJnD?YKT-+IfpocWc2Ilu zU2V$EMY?|Jhv0MxwL~(oft-(0BJ`f4Q{sN}2sI*v1N|$L85C3TXC#2uH@5B*c?g3^>%rRZQ<`K1X)g*~3@alC&a!r340sW}c$*2m<}Oo% z^z0foT|CDpPePi}B7)SX@~ol}I%^x^#C;u;fm@<@kDQwg|2?be2>N}b>4@H;fqbuz z1#p=&zxGKZ?<9x~X#gTWeFVWI9Kerr8NkgA=^{&_G>^BaF-Us)_xy5F9di4BI6Hp%=w^)EbeAss%7`1RiysfZq|_>I5DLojY!tbf4D zvv(o1pYa)aUZ#s(7U4dg*KU4C_(5C-r5r?G4$IP9lvf=dDZY@Ii?jsNa|Xk*wavx_ zOlj=!KYF&PJBfHL?@#-=Q{cFL5D;^_u@ez*t)az|H{u-f=~-|}3nJZjAv_LJRKh?K z(oX?$;Q4a#Y<8XPdZ1>UV@npqXIyWT1Y^B-LkjvRDxdQ=48VzejAt#g&8`a7o2?{@P?t3t|_i(T5XW4$pve`JpK*RC2euaRi1HIc`P%FnoE6_sD zIh3#lp=iD4*40r;&$#r$p~*<$mx2aD=185eO5t|!sT#u{W^#^G?kR4}TO$JNr87c{ zd%}2WrnQH@3c=$Mzm(U)R5qI?C-xu{;NYFzfb*!NjuVvEbPNgT8ROE48&UASClr^) zH}g|n91cw-Z@mVc;tXiT%P$|~VIsj6@kW+-rF}^$rBkQ9ilBG`*mbzHqXyITsXD1n zOJ4K%uu0X9vAoMWg1aD#c%3de|Y3nm7s2Tz9jgHkyz36zer?dJ@EZ& z*YI1~qbC<)`Gw9DX3JI*{p9AP7Gz!5( zs8A*<#LyC|<@6!o&?e>DzXalm2aRQEX@`Tsstpk zqEIuDNxu!5x#4&@@Fx51E9<0paCzZ^S$7yZS4(LOr=mx=rEt!LTHqL)Ksvr#*}K7m z0e7~bO(m+e!TCqair&(u4ic?3=`zU6Id(dJN%oan4Vd`(S9TV=V#|0WCwF@YtZS6V=aR%G|&R0tp*T9k&n)4p$OL!NI^i# z;F|TrFy3P+w1RZgHAc(!~DWFI?b^%q_gO8^FTW(p&1SO#ZM1I zklO07^bDcz&{hU|WgI~?ZHvA5Dz=CiPGyF^!j5=BTPR2k23CNaSvYXeqayhdb2z#} zC$!Q75&F8^8M(Z2bao~hhmEdyO|_BNplrPDzK=(4$=bsU{GSj0P=bIj1&{*(r&ME8 zz88pKRzN#Q^)_+a$&H26Vw3u@adir5i%+RaFy$j&f1TTYPCK10%pGt41Po8d?W9qj zz0^kdz0#8fg1-z8Q-K`)DElpe;p~JNa1-AxEI8q60NiTN-^!a5GZgOYpPqJb7Fkjn zHFte`4)48J%bAZ-Vb(jcVR!y6*OM^B;2w)#}sh}||RrN$)LUcpWvz6F)=rkmpM zYCu_~DCZ|W2)dEcZGfRZV|2c0KPuqR+X0siI_(4|f=Zm*MCQslziS_6f6C_|Y8S{o zCqk@C9o(NT(^iaSwcKkW4d7p2$WT(mgh0LG5GM2nVST{IO8HG%xNce0!#%m~D#1Z= zk{uHdW99>M0GWMmNdZ$bhri6gT*N!pnf}VAz+BmAgO7`2EyzZu z;3KxDoibpnCQq*b!!!5EptJqEfDGaDaxEYcDdKquKABT4~fP z;#*e03)HM2v3=&5a-!N0bnlR-OB|batE=}J25=tHpYjD2>7PaCu#Dz}En&(@4rQwt z26BR1TC&omOVOz{Al^{08h9{e784j~6mo)VnM)mun^|-v0|CHhYox%4(C0==F6&a*$6n0h6D1-4N^+;sG6iL!iv>D3#~2;OG&l3H|M zZGR@2<5SFH%eh)slm*+j<@fjZX)$wN*x|Sw-!ao28lrc&~NTs)K&C6&u2Ywtbc3LrF?l43fPsk9n?HORKtTyMX61hLPBCA#`WDr&MOy z86Eu%LR3i*#UV9xZ+5`V2y8r7fIOQ580m8U#iPLq1~DVWzF7@}p_Rl?&nIPrksIYo7H@dTffwW(AS^^p^e%YWNT589iBuG zU}(5OC_pB2Bw^sxj)A{SkS`fB65S_AEhummH5VSdPE1-LbJS^R#tci>HjhLbLZ!un zLm!~B7$|WCSCPGE4ST}zvW7*iaWVC=ft0qu%bSlFfB-HdrYos6zamJ69M&Ek$asSl z7KFMRs-77Z9f>19s54T_w*pC=eB6FL>5&bGp9~gQd(4*D3;a_a`rb&m{R&*oeGX0N zy;_ypQ-Yl$n0#AT&u93qbDAd5Yh$laPH-}-(jPAT)Em(HYgO6FhQsEeHFvQjp_kAA z6?=twmP}+ZaKHZ+6xCIIu4{0KY@_sp*0e!2<$&$AWieHaMx`KH#yxxM;3ioIMO}G4 zop&bIgQWP1j+ZfLDCjUHs7khyml4s^aC!LsK&?0fn%&a>jxMdUo}bIjfFbZ;QcYFv z1%$^D%QCHKl#>aNl%Trk3%v}RnmC6er};+^fkeeL;lkdaqa!pSZ4L1PgDEwl<7dY` z%>51v=L)eeSjg5A?c~t2fWbU0mFT?CZt)EW6f};Mz_(ij*_9)M7RimkP7p0|C72F! z0naPVqoQOTh3xtUuLP@ABn3=9R|UpPlLSg8_I#S(!ZJO91ch5ulihbNeF;&Ba_lfo zl#HyTgL3S*W2|y}_b$cHpzC0x<5@J)%L;myXdRj=asGGhY@`X~I&RsF9*I*znOe&4 z5MCJ+k=pe?0;iMI%#?&X!HuD`LOpL5df141DU52QZRua2ym--Cyruv4>VQg>4*_Ua zvjs_1oG~14>hO0R@;WOrrbRHhecX82F(C}+|1 zlvJ}(tV0)BAh=MtF{pTgRfJ^FPL+2DTAj_&WN-7vr3mJqTtxu+@~kS;bT_^~Be|kg-E|mB(rIpyrB{6R=7XhaWggx<;(yKu zsqvgZ1K@}uv1n7w#-A4B5~U4?ie4aCyu~alSPl^{)OL!nI%x1lo)&YDw$;C{F9=3i6}KYPB2r8 zjX*?`;6ih=;7Fy~U9`5#&9PG(`_b1AU+!@SO%RfJQ@kCY-+&Tg7 z<0b`-WiF9fi{Lom=hISf^-eJ?HA6IXA=b=QCWW2`#IQuEbUePLd`E#zfkswCiA?Sc z`k61ri2UN#SQ*e#U<#RtgWVG$w>M8l>ySQ+#TSYIkv}~(3M&1fnqlIQ@P_-1aQsWd zc5jhEs|hM7^mZWr2^QcU+o{pp?S0S%0=vb3s|WgW1=Ldg(+U>)m~!3ffg^x*tMVV> zej^x1a@CX}cA?6_GQ#0WjD>56UW9K%mm#H8s(@R_+pG@L0l_E>>#UDEyNnpcxONje zfc5Agb%N~FMQH=u2AVVEi$-IL_e< zvp{^b$|00%E6?PEAd+$aGk(SZeQ#JG2$>Le8xbLaoSi`7x(&m zabG;oFnVC>kKtV22>U1oH|>xsDtV??99#Io1LonrP@X;rE@jG82xi}?HV!PtkE3;+ z&iP`?ejQ!xbjtB1+p#~DTQW}P9LSKf2yK9mFL;*8&z3|bu`xvF#a?+T)3kl^t#B z=)Ch-5r$1y!l36@Vm%OUP?aNal*=6xr$5?0u^{m~+EjnK#oU)NxkWLc_a*Al?xY*G zB};>@z+**xF=~RTI8~89hBGAg$IOMyr`BI#ZIyQ{c+6F`^O~Vlx~JfAl>xReG-+2? zyOiH$U)sElQzSDh^y_ zEgv=oT^%s5?Y2A2@}eeMOMFp|#8nMtW_obPT+ok0tKjGBgS(In6I(qTV_kl4xCkCY zGCotp;=Bq;4Yr_}n@3L^dgc2iK95f_f9CvGsKc{Hh?xP9x7CTosz(VFS1fb4I-$vA zpth$v9Cj`{;h?u?I!*{JM3A@uqrbL~OY$MX?N4;Mu4A@C!0k_UU62|}pqWOqw8oKl3HfZ~I@Q3~yj0#h;u{4EPrANCt6R zT^f|J@SPp*yS*FUScsiH?sNRJP((~_kL9|}bQPf$KkXHn zgow6v{qf-82j7_Lehh}n84?pg1o=MYW(JG>d>}z&fy(y@4X5`EWC74i**kl!lz8>7XNJyDtzd@Ye9vk=PP zk#xe6k9W1dJeemSC0R1w1xu%Y*k7A^tw~~)mvms9zB`E0v7Ts!4YXUQ^)WyuQOPjV z((6k8kQBa35@H~H=PZ>Hk~6tLZw4_2(=C%3`@Kk*>+{hv3^ob6_$dDY)+Q+mS_?JX zG~WH4T#lXG5Xk_&q!aa3$u?O~xCB(zQt6Ek$o5Cib8ttj#3-2EYgY7Wp2{bvna$4- ztfGg=meZX=wl3+6mmZ2dzgd#wNGYB^vdBl1PQJx`pnv@5s1w8)M3Z`;qpQ;Pm}&(A z$bH=?BheW8FlIo+q1|QD>o@ z{^-qr4_S%^7_3(*A7Chov?TK}eofS1#dZzXQ3uWVOou(USH6 z{Jau7aofUID{B0cbBy`a%T_;7I>-9`T&f!tttQePgDwzF`l0NZV{K`8ujf?NhnLpJ z_~DNaO*cJ`kMY>76HRxOm5;I7f)`D<+V?*IkEW~$dux#`0A6!Wg#CoZHlW)rinOlF zZQp(H<~)kTMWIp({gUy<>*kLyB0uF4?_Bzcs!s>S1VOyQP|Jk4KOP&cqI_RVQB-&A zxmFl3s;)P!-xd2>*|VFs;LYpoLCM~Rvhs~}L@^h}AG`XU6?8f7z)amX0Sq<_y6Td$ z;^E@5g+nn`!>T(E`%%Ea0=p7xD}`3|Ncsa-!=DtRlJSk(#g&N#v#+7d`=Y_J+h&WD zhx{&Xe`XaQ>K!an#>7A9w<)A9<(;}YLrMKTr8W8ynKbqqRbI?`qW($`-RL3{qi1}m z5=jltn!W6uhnA424t<|iKT?E2H7>qEs;fm-SZAu&4r=MxnluK9t-L#}E7pQ#d}S_R z<{N2n9tj+8g;)T5Ilml%3|cN1XT$F~hZ9ZMt4q-@$Ea|lsjIR^kDA2+z*gW^Y96hc zEzsk_DDRK>st%-NlQ|O;9YI~2=d#$ej*`rt}gIqLSswjr??&4{7@+8~}oLED>a;s2%Y+ekSoIVX@<;r(=; zdni6&JZfevsODoBoV= z{ELBxYThu{Vxh&tJ`(s;*hhj!cnDCe#y+1=D;5q2)&buhLUdqnC|Eea*GlDKie4FT z<*4k5o&Sw?X@+@eFA6n&>AENaGj`_Unz?Pv5ypr=m~bfjT|}NF9ILU{CzfDCTeYFTYonc{$iwLQR4$eyPCn5o!d zPrE}YKZlTB-JGwMD&5nwK27ufp!o=`=9Q<@3Nw7;CnZg$z7L8k=&(-fuZB7Jv`sLG zB?`w6*)+04y|^iW4%>vV2LiHqvbeWUaBRndI;S8ZIzR|^6L9|d9zxU4^ieLZA z(SKzM?m#xb7wxY$kdzt1%SFou>rNiw6K3qTNNhNd z&vT~$50aRF)fsHGoIe0oN1t+!8d$&ka#jI6TAjk4^+_aRIr?km*Ci-#2uq77elM4~ zy43;+tWa$4dkg;6AcmQfArGW(8(+8ILocnjB2ju@&t$KP3J>b;7%6R~KeL0}8e8tc zjbYy;c_v$VhRDAY5);YNsb7(!K7y4Hu^+vrs2r`L5JZkbYopp%v3Vg?u3=DmXHz{W|N#9;%0e1mc3BXxN4XhpZbrHTQJ!L zEbywWZiS?iY6fxsa2L2a^HgT;sN_k^jwX*@meqt!PEX-~Q znCrqE!`R|ev?b_@%Y)1?|DfPSui{Rk;$B$YncD@C<&zqtToNla!!zdtqK1Z#l1dBY z*7&s7O(BiUWd`GMWS1;Ws_)9n5WqiXcdR&%BsBwL@RL?iz$3Atfy9_Ci7Q6rZb2xH zb+ch7hL&8U6u0;Il?3@8uNp+MzES(J;qf{#Ii#{d;n&>#g}J2?A@!Ef8Y|L`Ds|gp zEd`Td_4OV3Uzq*@$&7P(?92%SS9x=4yY1J%hEjS6wrWLKmKKJ{J-hderDaWujq}i# zoh?Hxt(Y_{9%(d;NquZ5WX+8TrN0xZYxbcKO@)TFbJcy%m>vjufv?mL7-&H|!%Kai zb6W(b+m-gW`MY$(CmnxzDfIw`0eEe~coFp2q@`>ioi;3v~mdqK-;Fra@M)ea|&K2qRh^o0Wek902iKPFFI?1lPB8JTF2uIM*=^4B*3%{bSb%=QXOw}J0~sLqAW?g zM!#u@dL=d81mb}PF0sBjQ^V}&de!-S&dq;_Yuq+dK7K<-HA{^E@7xEh@M z9}=yJIN!tRP{(Z@$4hgcHEH`rC9^beE}OYbT_kmq&JZ(Gl@DrZ5}@M=MAv6#9`^O= zgqMK6tEJCff6GRqgk7}xW~c^p!?H1iowPGqXsC>m#76DBRDM8LBY$?F&WH&gr0>gS zvQj*%(>@klj)kSwdW97aM}q1fOgKtsWB9X&z-1Bf1gq0 z!@9d)!hE`*s@{uv-{GU-DHC2DR7Zh)ua_ktuPRT%A8Z~iz3%gXI2XA)FR<>y2FDS2 z9b4qy-;Xyjvo&Hw>ySl5Q_0@C(ot7Vu|&PHtx{Lxq_x$AsF0GS`FP6V6E#Fbi9EXy z8yqHuC0IsBIhq#Ymq70a3MkoW)w2D3=IGfm;&CXho=VGib$E7&@->f>S|*877vI=v z+0i0HvE@k*`ZIxKIN6Y5!b&!2bB`d=1&x3L&!tF?Aj8DVgR=MQ^deT7{!w3ft{$|E zFhD;W{mC6!Mw~{XR2&28aM`K^6c(QO@8Yr0lfKik>G8a_u+#z0T%OEHqRd+VZ$$s= zC8?JLfS=g)ZzaV~Bh4=IbZ*cXFNH6(U}?7x@U+V`{%DQ8u2e?FOb`<-5>kyso?$Q@ z^NXiF2Mb+l6~Z+p@xs*!+XPg{Oxn&Muua@LA>cZ8#m}t0gbzkIAY2ql&bR zjB*1SUa!lh#=g%3*nZRu1ueD%sZ-RkSwLnjY7UhS|E}NC znp3Ie0#@c{lw{^BHM6tfP%?Rc#yCZMOP;SDdhk2($SV*+otpceW6xSYI*NW2rDxJ8 z#db7Vc;MwFZ=z>dwc9PpRh`tCm|iikzuP3v74Fr3PO2ZJ_a8GOpBN)1iz!SofIM>= zRKqBC++eEySeAU3=CrW9X%rCre>ojp)0XZO^mK?8cCe4{qZ)Y!No(fHWX+UZo zks8kv7ym~Gc?w=w>_m$(FV=r>T2C$}rkln7rYWFHGr>ds(>q=fig}`*muf<1pW3O! zT@@yUp5=@Usfa>Fg|=g(z^^#H8PLYUNV*Op&Yvzp&FuN3xA-3gWxN{at4qjld0l0z zDj&6W7N{Ya4!$lfez=~RRPPmRV}^TN@ad3g?2k^=gkX7l9V{N>!E{651HvkYmSH*j zR*7W^FYDZwyE2I-YhWq549}CzI3KY8LW95)VLW!fO_gmY!)CvQ;xBVIG>XYu3|bTO z=WiHeP@u-hGykKTtWVGPZmvW};GLsz<6`(_wSswP@y-*C%C)y*nFu6)WId#X z`l8h66ciHtfie;X8@5EWX}`DW{_lSCkS;?*X9DlAinxaecQUxWv52SArpu=IkDOls z#HFw5phQcf*Tmfdd7R<-Z#4_wlEt4-#Bg0Qo=Fkf<$RKc71BQQ7G2XV1)toHc;t*M ztB2(b{}sm2??LfXO0uE%I0M+ub3^sq5hZNTRC>j0_(LkVBZ$vx=~GI4MN(01xSSaU z9?}h(kuyZ=szv-}T?&vtZ)jl*+55lq7I?@uXhe>%c>@7>%wENR;Qwj< z1HQwxpRH(X70~8vb;kn95F++4_k88lG=%j>{R4V%GbR#}DcUKfOJIX~678TyHDvst zhdv=`KLU1(Pvh6;Z(#iV^=~qnu7Xth@dcky6{H_H)}#RLebk0Xxo!=K)+UtpYRvtl!Rb_5V>5&baR|@Gvm_ z^a>&W#h0*ZxV5#0PP+Xr3@cKqA!$6yDn&Sx{ba;!{?TF_{SB!5W;}X4msikD{U{6p z6vMK6gjaj;L{NQ6evvHF4$dIIg`cSX?u~Q(eTVXfR#!nDLUK;t<;9$2!j`t=;BlZI z0;5{00Shj@etJswsSE)WB7(-Hl*+uQp=cIqhlCC*7yYO~fe_N?!SnFR)5KBJSf^#^ zj`w&tIy_54`bT;)N6QpWh+U+JxS^~`xpBNqb0T$Q5bOd?q%E}yrhtYEql^u;N;03n z;00-_=Yd z{5g+F3TiIV^`>#v^ck<)gt67O%b-dKx z#_r0GXID&pi+WoGiN8j!l-DXc66!VFffF12+Df-=<48Nz|3v`RhB8w>sN^swG z5FC!WWq8}lOEhmN$Jn$K;jh`raMy1oI~};YBGXe#__Y);*>q@+$N#bYClpcLi)x_1 z=~Ja%>M8B{=S_ZvIGJ>8!S0Z4Tv7oMJun>5`La2YtY@Q(jQh5O93>eT^| zhpI8FX@7p+b`;?RINNMePuy@F+xnJH*J>1jR}=7L9o8`h97Wn|$*A^tI(P0^0}AQQ z88seH*7_YoupT{%O&dC(NE6Z>fxNwtklM%&7(VV=p!O-1?#I9r2YR||-q>jbyRQI+ zOE-7zn=33W_b1@sl$y&E;0CcGt>cR^BPiH6nUVntB^WuZ50s{i4tijf$1Wg;OP zv-Bl3jFRXh`eXznmBD9{vBGYG$_1x%Hx-yIf&=JZL6y3V{bmDR;N{xmB&r6c*q;v6 zH#;!=$4NqlBfJ`kT1s{+YlwN)+fqsw$WQ^$7?mP|BVGDoV19q{+oF*tpPyV8z^4xN z6!*NQ6|9OvC#`p+4DaF~0-)7KMVKi4cfHZ+?Irn2zfj@CHjHG=uXSApUuIc%To2Z~X7hjzGn&WAuZ%|b|V)6|b0&n~B=I;B*} zk&6%v>CcIFlO0!ZyJWf-6*?|IZk&}z*V8_@i}xhItL4bqm3s( zH#~IC94mS6iwK_~9))K_A1=5ZI_7BQ^Sq9d2Wm|>vca_fZ&hq_Zd zq3HJqj|eu1-Y^hGYc^t``jy1p(I$>EFD*SkKZ1 z4%x8Nx%D4jXY9m!c&l6v2(gFqvOK5lH$q1~_O+;V@C!Q+fj_FA-0+uLVlN$ZU3L42 zcp7?E0Y2-X4>IN4>@<+jsEw_8MoIAaEQ724uIct?lC0$__`{svS=`Sg35is*865~T z?5f~QNs+|4SdB!JFyPklQHa&=s*IHw%>nDT4ycQC^8AmIg+%-Zt*?KLDOO$oYV^(B zpJ4ZJKEj+X4wvj)DMl0Ras90F>|95`HIbA)CCmjoF4~_+()+K1`d!WOT%*&Sj78@n z3yOzbnK9wIUDzUjqd9v2?DP3`WEff#*=zQ{$biOO3=vEJ=DuHiCb!O)qu?f@yW_K9 z7pt+=(m~1bl_P=rJs6y&{SBF}OBtYX4`w~LGAwX4nwciZwWp$->9waB%?buv5CB!R z#&KU3FP7#s>N_<*t0Zz+98$o$k1cRcU_QmbQ;3bg3jPtYn>oEanqa{1$QVTO8f?Qy zL7rr(JDW3H-}5CQ6z>4P0ktSlOfX3uEgjNR z`|*cM6m7P1z_ZHG0XXU!TuLd-i(0-e@WM-c>=8psX8LUMCSe^OEBmRri(m8}3t^1K zA~^Fi-WZD}_Wh5W!doffs+9bqjpp7ZwJ+l1ZAIr1pq}uR&v>%vyX&tJtq5oq@IG=j zYsmp?)u9s2A^fP}xg=aOF5h-gpk6NYq~KZeOYX}BIEjQXpPHgT`gUzvav<*+nTYfz z<=$*ea2UH!MEP5Jeq{(Vk4e%zXfg2GEZ!BjRiAcMZl=QpAYu1l7k@3z`d)|i8}?6L zYZ7zevEhaA!fYvZ-KO|Os_2%8)~qd+EKNGk>AL#4IXm5tKfk0L3xO%6s^&Z6yn#Px zz7?ePn|&V=TLFxWLaOkF1N=gsD<_Sl?82FWCN6?kk|4eIm3fuCiXhHHwE0B&&wDtK zQJo>BPbLlV2juDpvoWV~kR0)kCO$`bhoyqbMU+gV*hJF_1sM_hleC(DcXbLCNOo~_ zFpf{T1#fT+Ha9hYXaX7!R?=cHY9eL6Ep~knTEOAl$Cc;XV%%@O=XI{`eCUKr)!|Z5 zq7i6fbE>EYp_qm9zY>a`Z8%d{Aa?(L;>Zcl>P z(Y|?ip#`Y|qs}ts_eO|(vXQ9*6V2Yip3~@+;0%q$@D#gzb*Jb~pilIi)lOV8K7)U3 z+xA#~cmRI;bg_ay*`XN-1F|0g5|4J7VV7FB%E;;WfZ>@$-(pPil3>iiptw~&LwQ3K zeter=4Jg36g(%-<2sX^~H&b^s{2cpA%kybOp166Ekvx91n?Ll^AK4>De+&eY@TFO$ zYVK6tu}|TYcw>gkxdSqJJiT{+K4n|E#zAeO!Wa`+22-F4M^f9iP?_D2d#8n5s@xU{ z=#1usT-!xHzPPEi!vfadu4GJ2$djkTR7*>!QyVb+zWtI$6?40cAnJ(>|H8u-eghcc z-~`d%=(xB{#RtQC;iAqEP5{W1cRIuV&+!cvxOie=n54-R2(E6 z+sy)sX5xx$Q)>9Ok3%_p$|^cL&B`kU4+Wh`1>o(z1$9DO*0hHd+Gnz)p5G4k;{0lm zYQ@oKx#m%0_(40XniD-bnDL7i1+Ly|%DN59$8GO%M+Uq8F2$;z6Ss8RR8wWx-v?bfNUj2- z)7m;M(OSiLNcPccBTEkE`G^6rcENakDOCpXOm`E43XL#2E9fwCW~uW2;n-tt#@T|6 z&T9?!e(j6cmDCwAEtMna3qd|eW0^a{IfyHk5=Uk%PeN@Q_1QlM3X_3VJ|80)b>fd0*cv zvo*U)#z;#!{4^wggL8<>ux6(h)F;WVR>oM(FW2vyx1i9ymGjm*9}OeW%y!p!GB&CL z4?u-OM@p{!>*}ge7&o*}A5j_>yq(IHbU>P?mHDvhv3*{1kQVyBd6u))O6E{&*f5+7 zJSTV!t(h}n?BT=x8oVSzLluS%<8ejcx`d=_YnS)j0=typXxUX>YjqK`D1JzrGb76@ zyjOb@Sh|C9WAn>Y7+xJA9#?rOu24PhGm%~@f6fpU9@P-3+BfgCgx^e8XldMTXG z65BUe({rWhSV}`#Mu+P34q7224ZY|=nVvZ$wQ~=tpF<*_7nai4QDew!l{TQr= zng;TsniSb#xVn_v=*k#Ol2@g7z58oS-~A-t_Co80i-FF&7p_1LWnvIajX%Q@BVb0I z>5ffgb|$ct6~vO5i&p@|?C&UIsUw)I;V1A#c zeh1NI*xk^8sm|>|Mfyr;BOp>HFdgR-s3!>VSB<@{G;>4 zt>?Ynt9h#kvk(ST8M;Mj4s@XBxdx@)e(;XMeg+H2ia(^sZB(pZp{d3ZZ^XYm*pzhf zb~4KX8{1(e3z>hd|8Wp4cE!tg{tPLFpqvW`b%PF~lnF3US*i&Td9s)iOg`w^Y#sqiLW)olgGb@C4$J zLN&4dNCk>V_m*4s%i$)Tp0_xrd0SaN6!XH(@(S!Jb$$UWRfSoHq65CGEBR5{uR2D6 zVw_8$0O>^L@3!BLe2Y9KC-KI&-i9(+dh;e)F$#aMcq;0XO#-SlyL5p z@vzDTXENumqsa>Dyzas+)qW;TlDGPo5o=QYY$^(8becP#;m9rR!s{f6L~Zr2j16Sc zZ+r&#z9acF^m4v=;IrDp+tYTEFD6;##D4&W6%zHWF9D}aa>|!BsY8$MMlNE)Up4Pe zo&wD4zSZurH)haSs02{1EINex3WePm(;r0zX#Qr|RB9uC5w*J))u%eFc{sAru$oHi zYJB^`qlaRKkn*eQ)vtU2DNDM-6rTS4&YBW7jTCY}Hhmz?`1>Q)9^c#Iw>A7+JSpqG zbsdj;z5|XS_jXm#GQQp^ld0*_UvHy%h1$F88Q`RRbNWd~9h^e-A$eU-Z_e-fEb*^w zIXa~w{?>ep#{L+oW=rBihj5yvXlNVlxPaCjtK~mtm@eK3s4K&gMzYRjtf`AQb zQreV0e(i1aLOwX0g7DnE1&v?in-7s8lS<1kBO#Mf%X(B*XGGQO-&o5u#I9s0h{rL{IiF|Dv+Z!O`t&>^g9ykG`MQ zIS`Vre!Cg6&n`QCM$i}4{q+q7X%$mW&;zP-vQ<5QwcL(`j@KosZ4hrh!yZ}MWVk?~ zg{w(E`x*K<}TG0b-L?Z6~57ZH~x%3f~8&WQ2CQu zU{4NC!}vEAmGbB&LV>6k-qYijeyTL8hUi%u{G}<8Z&R!S;U)bMVf0UAFerZKVl%pP{gp$Z0q#g&e zTH*oFzd*GeW5UbIQS~f-%8^siiRnJj9i9E9i4p$nnIziV2&tRT?1@vqI%M1aC!{Aj z>>2z<_}m}{S=CEu(fC^)DK&~m=@*EE_Ri;b2-XbhW5vMmCdpm8={E4$ zL8KSy`d*m+Ru2a}@iL~lP7T@kgL$=!MF>70NZIQw@?QrBtsZz9KeUA{^x8Y6bWZIm zDna=8Mh(NC=nAWsNyf^Yy6r7od(;!`!Z6&o^GGWf{zSmC(C{(6TMHC&_u1;E5UwW0 ze>-<*jO0|KNrpw6Mt5w*4czv#3Y=fGeOL8eKG3P`ezyV}El4LKb5!vFU|1}%1fVE^ zb=z8rL_e15Y|b85)ojjX7{Er&ttY)gJ;C0y5v7mPvl)en(z6ZL(Vm?sXfjIx8;?AA zz71V^61RZ`h+2RcdsWns(s}x_?Df|59^JdyCdiLf{+i3m^kOud!IO!o$Z$)C6j@~bf zMAm=SG)o&fjb?yG<-#xwO+Dfj?08oH!8q4vM&nNo05wQ5|D&9;@6390xS>x$g(yWa zN;lW=$)9fy&=yKyl~dYu+25gjx}6=v_W!k6e#eeaA{( zjF{ffUUVxrsTm%Dax>8lv1WrMf7krS81H1NfH37=tCaZ{B7GwqRxB89V@j*bqE`EC zAYQ2d{g88MMm1*vk@#H(o6Oeec*_GI#l~D=UT*F|O1Hg)b$Hyz`B^^o5{Dy%vsni3 zKT3OzaLWHs+F6wYx{2$Rvxkg-W7k304)12yhWF5qt-O-<#C~B8BV062c+eL8v`J0w ztE+!PvxLpvRbH0L1tiU|e=%YKzgMppzUE`VD_rl5rEC6DHKtLxE18A4j*zOtZO*Co~4 zaUa*C2#p;`qzbuGzwQIsp|%-&`$Eo#fi?F@L*7o(qO1kE>)QKO{+sUFJgw2Q{*n;l zrLujGZEn!2c~JunO(q*(M93y@{d%IR?oERNB_G$C<5Ehq*KNm{D8Yd6lA?R z6ZQdX2z!VabYa9PE!^Co>X%{6G!jd`mMKiZtJaWh*hWogqJj`tJ%WY%%{T@lj=)=8 z(dD9VxKez-Gm8&hALnmv*+HP8LwX*5B*jv6yP~Kx-`xKEaC(l`aG_P0A=9*>@L7Zn zhRl%pRpHM@2wU@MAFq-mduvJ1aeI&Uni6ffxiqT-h-C$uGE;Xo$-oIjq`AaP^h~Yl zxO0OT0Nr+vd;6h|VkE%1*iL*m5U0!z9izG-d1`#IwipF277fMq_Sp9pXD`JV^%IBt zq+=W7s7qdZ7qn<~3BKTw+xKMoVfOIJe|ClYkyfABmLr3sh+F>n5TPWEjjfr+#msxf zQa3jD_+UC8Y@IR*<}A0IweaPVww#5v?v+(g}CU$Abt1nKEWt*9Rl`0YSk z#*;$Fy|B)b@D@MvyHNNSf80ze$U*6U6y!1XdK0m+WM77*Z~qd9la$L0I3TPM^mz76 zRo)J6>LoCqm|_4PA*hh;Kb~-fOb@h1Ds6D2f~Jw=IpXf6s_!4R@I5SUT2<+6Y$xhe zT*1>9BqWo(zT4kwd2y@f^m03WCGVtl8dOtSUYeC&SjhKg?hwVzX5 zVvpeE<%FXUqAx(Np^$^#B-@rrBFvj@H1$g8O}SGxM=tITl}UG@X=lH+3GjdZM4Jv^eUq9cAxW4yn+g>Jz`$^Y3^d8_tfa2u|oA1J)6^bpQfqHr3y_d6jMCu+= z=5*M*fJwDH1N>(U^@jw;N+#H&cf9Ny4&(*o|4zYH7SlNMs*F+{g3$ZqQC_2&Zvz&l zB&DMGWP+n7ZWMkfE7f7RO4zQH$O2&xSoA5Zm~m}|ISLU=wWXNI=1KM%>BIoH z|55Ihah=GOYgsPDLq~Z!AAq!+@V&2OSf6>gq=W}$-voMo3@xwvT}?A-mw>0^q7jo(4A0$IDkM}+1Qe1pI!>PdcB{8DlkMh~J*4%N zRSF;+4UvkVABE5AiC87AA3DXk6j{pIiOeS87mZ&N6z{(aAenJV5R=*Xx$cC0m6~)- zCoBG2S!~%vG}e2mSWEvE>y0*B9Yg>5N^Ms;A(Zr=5TF`>ffPB37d7 zhXNz}I^(%wvEIKgz2;mFV71lxQrzsMiXGQutDXb4+4e`XEwS(DN@0HhW-f7cuQHx0 zHlFd6eVuWCH7XH+v*vijnmy1`%oUJzld*eM{?7#>miNNP|Jv$^j(h)pf;=lY-qR9jvrwyo2u2HrTeNDq=|5Xp+*=bw{{&_tpat2J0;)h=K3d5|+`6@hN-E zy0dhu?uR|>9wK^82e9#*brXW)bfGAdl-3S`ku4JgV%MZTnmyJ?*-@Q0u_<+|SscE5 zeLbp^8(i!Z|C;}9^X$#=x_~;BJKQEwkP*>4aQuUU4nt8gO<6PD8I3H0#Qne40>fL@ zSj5hWeO!Btk(Q(CZ^l#dSt-EYJAKoag4ctQmY6Ah9w{{JSzuX1VN)`j8FKm;%70}K z0UXbr#wU!C1CZ)`R+wH#*fgfrv!BfTB1+(L%c~%!&9gsH$M-AjgxF=LkES2ZW`;c~ zis&Wa--cbkb}hVybhT;kpx|qzP-f(zkNa#*ZWf&*Kp8BPx+Usj{PvN(8)IynPsI-m z(RQ&=MGQR3P=yUWs!;vfe9KS;K7DnZ$aig`I$&Kz?DfHY2p{#4K1dqM1X}VQfAz%zo`e@!BVeM?2JybWB6H--}?n&S~F?cN_}!ELtW^UKaa>I>SN(AV zbJYr2k@NJ>rr?e8jt~C=OEzWw16+PEQ6Vd>@T=nFp}#gN=kf9bG0hQkB6P(*K<48H z$_rPXNpFb1YdIyQ)IrD7%r9sQIvvR93qQ@9xmW<~#qKFaa?5jKXe$%@iZ=?WCAR75 z2pg+^VsVxwI8dBskUFthV2}!dGCV{5upWbp@qv#dx6);@kPbmk8sKB_6Iu=RmV_9# zgVd42XOJ~8A<19%Khm2;c_t9jzN?VPm@H-V#Hr36Uh`z0N8Ow6?^-}v1r-D$Qg<|w z(CwAcaN%Jb4$weodK3J~8V&7+LI&fh$-Xm0Mi}FUSNVqh(bl;U)F?V0Gn6HP3Lhu} z9`THHqypu9Vf3oY^Qb|D$4j_HD!j9iw);ILw$3|TCHnQyzT{X#1(B~9*L0D(7dMj0 zw@T^<7^JZDl?$FZMAy5quvIsB32#n5$obv;2_0SV1(-(=t41CYsHa!8D}k~6Z1x0y zR-aj}UfY7N<+F;^=PV<{v(X<0e+JdQzD&9-?YsQ^(>(xTS^v8Gzy`Vn)|5X&eqE}r zU{*dC9F4n}5~)46$m`>$8}da34OXQOi1&(GU#mND$*F%J-ooNap&vD`;s%+<-jNgO3Kb=wLK|CyAvZe)Z z)$W*^GE%zR-|ZqIi*6D>KT?b*^Ji;LKw6EUrJQ+^^5;ZgJthBC;5FsX>A)yT{@K7$ zm-!a@T#q8yB!Ner&9|xMIxO0kpb;#&`=D(sx#yrqEV-VHogDvJ^__}VE8}8)J@kXy zUxLaQbwVRHBlBU~owrS*CQ%%b^-o!7<3#75?Q`s+_LNDF2O3q{Q>u*}OH=vVreEQUCb1 zKiNqst){jM?0qbu(n!vcOaCp|7DE;r)E0w@>ot*#cDs8fml=l)azl$aN&ag2{!Ngd zSD+bg_+RrOd(v!Jgux@qf{On*SBp`eOwgHK#;HOYU=__k9aR+#Z1{O?9_)87q`_bo zBxeu*DF{9$Ppkhi@C?@d2-xhBp6U7T(XLF*agT4>ih)PFtp43Y` z8RS9o8yW<}c>ve=`{L%}`zeP4?SKj=TCx@(PLpR(akD7sUz(8@+Jw8jNPzB`H|fCD zRlP-siiil~RZqLcR~5l<_RMTyrLY+V^zB116*|=f4jZ2g@=F!E;6alDS zpqd*6?5bcL@#es4O8IZZ`+<1-FkMW+VAllqT9FdZ^hdm=&159MN}%@%Wx+mw>;MtqS$j8&uq;xqHgW>ibfxtO$H$IRi7thgmTy9>GCj#dIu zG&=2N=B4uIqphhfkLh`EcjufYbh+E5S9L>(EzBhAvs0FSK^4Q;@7;4Pt~LInKaqo} zA(s#v5Y6P?UwquQ2!+*8i`owf+C5mp`p?GTP|inSEqF(w^{bt(?*C;pfv&vAlQhHR z>Kll)Zip{i5Nvm^&JzJ#gsG*2Lh<2!!qaXMNbKtH2`-VT0Q*@J8p^5bXm3>SiYy|}15xY>gErLb9vPJ{M z4O(_E!0Q-}vL87Z+)DI9p?bSQ8uSHNBID*$9T`48K3Q!l5SFfo$zd8;V8iDFmHe>Dp3n_qO#D>7SDOBa!7ZwsJ8uRd~Nz$ zPB5f=)VNfI=86qimQqY-O=yLoH`>j%u&O7Qyx-|LGBwO$nPdrG*f}*<{r|2 z;)19Hw5->mx5%kfQ%MYNpXEO3y@o}p{&SbD!lDjLK6G#ztWgGRK84$2-p?cpsoHeM z0s0m&K^LEG;p068cz?l{sU(?M9%YYgf@)2C&{d|C{n)mBy2#!?0<&4_syaSfwTC{ z%#5te3#_(9c;#93=4m9OglTL-w7MeychHLkC}XgRSL1IkZv8`2i6kOyQM*e)VnA3a zM0Lx(|E>AUQ1yF?sP6pZhm!iDiBJ6dYa*eLI2ERs>v~?^k8lm)q0z}x)#UcPyy0cSY>T{3M150#lXGe{dJ!F>ISElN8o-y@lZ~ zl+(+xXi-D8JtTW@F?ZL|fMq~~(cIuD8^)x`7A5A~T8wjlq@*9+TS7CQezL`c=5K3U zJ8IZfP28(;3YVx&HQo*!;Yl41vsrfFRY8&Wxd)pabn)D)kb<`;*YXDwH_Rzf6#zVi zE7^ePMXepIAr8C=$(VTGi_AhIxuq^ADTOH7vQu3x?PEAR&(@&ZJkpOq3s!nXaZ{%L z6*zSUqG7AWr2G`>6=%$CDrH3WP6@RQ9>`xlMUGD|<5kOCpQz8M2Cjq#+aw`I{z2;# zW=GbuH23uFwC**+`#wo)_0b|>Z$rn$*F(LAeFTFP5SFU^Z03>-0+oFHWd zdCn1XXa11EVdgm%JCf(Z`iLK2ri3cIWy@{y)TIS=626MkMtn@=lXjWIUYLl=Y4;XW z1OsIv2)k?Pz%obX9%)Ev0>E#O0)5|kLEDPpxVYqW!hp^1sar)=u^ih*Ck?wTh=jMJ z*y|;x-B~V%83dV7rHN@l3tb`fPVZn7TJ(CwwZ@}NM*YLsmExOs0=4ZTC8FUGf2=8S zu>|p*-n*W|^}ut6eT`u1pCs;0>T{^)mHn7fB+IL>`Zp9-Jf$#&O# zM{S7Q^12mI#(qGu`@5mW?;J!~aT;Flr!-03>o=eF^DK{7W8F}X0c@m6ZkKT0C6^*R5fdwc#8)U%&?aHwLe{9(wYl4-8N7pAI?4n zh1`X57@R#hz5D*_f9JBpFa#xG6kHw&>e4^|d z;d)MS*Fd8whr(z4syj0E(Nc6v!^wGg^NmZ)sZ+7Mia?{eR%86t?FCzm=Gw-={6-8{ zAluFu`Zyv)P0@4raKX^a`D+2l{Rx{qv1n+8xTQyUXoN8w0m$Hyq6oT^a73p~BL1CqXO7C3NP}waq8YJmvlXpKYYEJT~qtZ0Xu9RUMnz zC+R=nI({$h!jn5Sr#z)s6`Z7g6>eV!yAV^d&%|_KDz>IL?aC6Cw8K96qF#jov%wRQ zLgUOji5W>qqEyJq+WUt&A`oPFBD%i`E80VL4tj0=U+6~PHe<(36>~2$~C4DOv&zJL2yfuv54~$7fisC8t zVSx%nF+t!ysyuh0v>9V^iNclR*3~CkB^lejpt&^#@RLURJEb%=YB<1u!xV$+O(C%& z_x3715P+w&WZS0e2-Zgyj=SULa|QPd$#h}Of44sXuI8`4smlngp{IACP!-#Ri8c{$ z=I#Y1EA|8=a1Phv1?xozfh7>-L|c*Xk`ryX{&hS+!DrX1|PvFhO?${{7bUcx1p(tXQ6$d-?& zffFh}%k z3a458?RwRr(z*!z7&~NY#!8bbla2wX5IoVmSQt_Yz)uJ<%Jk9C@YE0LZaZ6y<3YWW zf}6ovDHV@K1hA{6G>HOqvATu-QY3yEJLa2KbrSWiQSxWJ*4NVqbN1<<95oSf+&o!) zR^YgL+EVoHu&>TS4-iD zXz)CHWC;Z;W_{8T{ef)L_nxHOgUjHW#nfwCnzCB*{`mW~1Y0`aVUV?E8ukBs7zP&3fnQcRw{_AB1xEgI&mVc<^^)f2M~kQu^!?E{6nNi&U) zj=O5%A@S__7VBnR-CiGb9I^CEuqypnE>`~BHUmhBeA{;egS5BjY9_vu=z>S}jLJQf zY8tZdU7L-=*xs`^%?LR}!EM*^roGd&;}tjUcLf^5^O{p*pU&GyId;p$+`BFpW4~#5 z)IfY%dVF=7MF?;C^K|u$0^v@SY8LzBYJDTYn5ZD z$6+jhEt7|3Ww{U_iBhkpbmt7CiUTr);tj@Ee#?q`| zJ3(QY*PH@;!Zw-;`tx*FhWeR9rlsP!$Y~=48EyH(h8LwX%7n;?8&NE3Go?Yi_2z~t zyF4TgoD)Ky`gQWxRi%QU7QmsYlwlQGg;+F{a(YE&h(2c@dVOhiYv{II^7)>AA0Q^= z(JJiJih$g*;djj;;ejOQwW0SR5lHUo6@*}L%X?{s)WR;_U24UtZaPvGkXX##9U{X^ z2W8I4g>_iKcavC13g1^EY4 z+mtV{=78&F-52SPXEf1M0VGo=bzkCnHN(O6MNS78{MbP&D6(g7@X`bge-&45lHz=@ zG{L$^ozx}H9FSv*v(n8T*5e)JjE0GR_nP{!fHcH(b*ANTKT33?e*eo>A5KVFH(=YMQ-qy1J=3D*TSKs~Yx zXHyrMYGx+OFp$57ds{pwY9DE@4xJb)<^buS;LTSgOb%+*O`n?(T6-u zsh!Ab7n)JQOX;|1KDY8?@9IdtwCG5CA?H4aw`aLe*LQy}EIXesj*U8>FV6y=o*sE}OE@@) ziK&f?wVC-l7gt;K|B=GO5y3fAR|eh+EyDkg+5flu-{_n$bd4nmQnjD(a5qj^{||Z- jtj_<1?)bmaCl3C2{QsjPqx@490&Hu8?ZFTF_)?TsJMP$ee0aqir?3+D#EDd{*p7Zyb2pF4*( zBs)j=)Y{eA$(_g6$=wR(YUXZb$?N9+(r?iH+Vw)mJu3lBV%Gp6`#Y$ThW*v# zM(M-(VRe~+Ev(q7*I}<1w&5@ZChNB|>gn7lb27Ws7`U^FnGCEu#Ua!i_P5m2j(^LZ z?)R$C1|BY^&90vA56U(kAN+)M23kXnPfmvK^2r|VBLeG3@1Gu(?9MW~)tzq5&iWlM zfZdyGV!bB^CC(>D7+vSaG8Ry>vESy()+meY>HKI~pt$%a?cr;oS7SeAL>BK(%D%<1+5HZAaEefA{r zSYS{$@NhNRBGdU~=ioRn=60atLHuFCu5KpPOO(mcK~-oEh2gh5ZX|kusOTCR= zC*uV%71!Ej1ME)G5wiiChb%W$ADnE}_sL0Q`q{`X2kzI#$Q=IDic*&iI3_&z_wXe$ zfdPH8kmLZ2_UJ})8)hy3_!K$mL zBl`1qbKYvBloYv@my=gZO5yZy{(BCPHpo!wol&!irmuaTiJtsimm%>G?u!<0Hc>G$ zCuqgA;{)%zCAx}RR1K$SmYd}3F)^VyuNHJ{w4x02f>#GFR~8w6w0Cb8_otohW{mvA zwX_(;ezrdkkn6%;{}eYK;dA&vo4DBR{hT!Yc=x?eF^b~Mu2QQw8y5Jiby|$yI7`e+ zsd=1IJ6p2sCXb(Z+k)2++NH3n8a>A{)7$XMLW()YU1}3|uU(#5hTBiNEylYQLKP_0 zjC)JP0^?hu?`_YzNhQvV_o{fKjworb8~#r~^pvylo@*oum)nlk({*bH@00v5wR=f1 zuXz1~ejeRkV*=gtiDcRGSrYc5eDt$ssiwW%^hK=54a&?6y9b^#w6Y5#p^(>b`Uw{s z^31?>*_vT>8XE9jUnN;i6CiElK!9HBF{QHnh=yp^@xSZj5x=6Z z&s{K<@4G5;hZ3GjN2sNbd!A6C{7|1R2lTYc=;mYj;dEI|kcidhE#rqUu(fnedALs( zezRQhEFPiS{!s=BowQC3y%Pm{L)F*9v!9>y!Ly);|#^K`7Pb{|Qd_}CsiNUfMG zTr;;hkiBvA(rSen^X%uZ0cnYkZwgd*@0l|c^GsVbW(l?O7_Ajwsd7+po35N|9`JT+ zqNGdUbzgd;s!CUT>E}YW>U8T_2?L;n>{=;9BZ>Z>=^ln;PO657kAy_ooL2NbU8=P; zGmTa=*M3?3E^TR0{~Q*fO7|W0Gdnxt^G^SU#7pD(_LUc5T&fARq1_z=G^&#ytAf|4 zRnum8GrwW*OsE$rTreC6Vyhc-4c)3%syq5`O(4Cc`dRE2)D8tGEk`Qe5E`mlt z-eq+_*;C_-mFD_=F&Q0+D-nzF)p+HfFHt=tqeeG*xu>&)JOCCkJr#2U1Nhs`2vwA7 z!uPG8aoMQprU0uI70=RHD@|tg{+CfUsBcoKPuoT0oQdK~J@n4;N^Vw%M_o5@W{>al z)Fa~c-K>^~L_nRTp!4NhkZX~KRfPIK8K=Syi%r6{tC{+CEZAFlyKlOWBO#0 zdgMw*<_wS7VAsGFc^^t4yFE{nD2#m@A{yjEfte1O*i!7X%{#nQF@J86T@B(BWJSSJ zq<#)Or9029QOkrw&mq~@YulJft6m*THRr#v@^zJsDP3jdHUs}ev-1A^hsSK4|6G@9 zqD16b9oHX1n+MFu^b#~AxX+!{Ak@!ewpM!H5dN+D3e%6$SM@^k=i1mWgM_ven2V#| zucU9ikbQRZl@*2Cn``OZ8OC!T2LFsPohTWdyme0mH55YR);=0EkLV_!<7Hwmmj5Ea zoq;Vq7pY1waRbC)p{u&c&o`H)NNEafF4U$vQ~2(Ox$jo{KeOcxcgqc8b}#*T|J0G9 zU@=hbQf-%0o-gXpxn5Mf^o-yS3&}U^+n-Ne97OtD@_c9i*mR>Bq-R8aWQi=XR~$^T z`f@Y6LstVr=E_p6C{*8&ni@4LW|5d0$k}VHU3z^$S2c7%J&zmGBwn_vn#eMsG1Y4h z2rK*_GCP&(+2PYN2BJMas%ij zwH=DNw}>X11d3e8F%#?9?{mnz#vm^OykZV?0bz%>ud@>>UL997o2wW%w-+=0D1UW4 zFnW^!cLq5D?#qAS{yhxf<|i_QFXB$*Q0IP9A6&Wgqxw~bJW*miKU|N9z_lpgx=5(K zpG+gZ)P0#~g#FVM;vdLYmGaAKZmMGvYUdJC%6iGlji`X1nC9dd--{UhEkZ*1ym2#q z%Q{hvdkODPL~3f-+?R1qO_g4<@Z1*lH^6QAtNPd(qEGDHfLjlW?4RdKdCZ*u@%m^Y zOQ|nsFF)}9ug&&7cVVmx`?DOQ&W|m}9velXyZwU9DE!}?=jWY6>qCjYvHKZvG5xS& zV{tYWCNJeS+vp=EL?t6cm0#~IkB!;oZDZGv%>=42BdcETLOVw2oFi!aBB9lv7x{rI zONqKv$4cUQh`3b~CAWdDRo@Vq8p*Bj11T=zCh*@$Cde~Dw_TuH?>Yx}Qd2#-*^Dz; z6`mWUZo85p)GkRYadM!`clu|%{f)%cjdZoFJ;bKF`xN6^o_N&!vx&ieT&G&XgQ$y< z2RT_@J#G9^*7Q;83W%Tm!cn61-Rg?OCk{ypIM~99P0R6!?Ty{Z)M#_M555xNMoIyU zPx%>Bqc29c*$V%(`K)j$a?w`H)IDDt&(Aq{Z?S0bo{mL6jjb>6Mze}%Srp)_Igb}p!uqB|>RIQr%ovOK4|0c5vUNTu`}`E69JY>5 z_8s=xu)B=>3^V~d4FA6Y6UcLT9%e*w~YtNr9kGekg zZ$UT^CYTVWMjV7Y$8r67(+zWKdRDSs<9FBiqv&&EJX?hM*Cb#|KS<1_5|z}>eSG`Q zR8W9IjrCj5HFFX*b~5|1kv4h%5VkgulmrC3z(M`-#~pLQL^U-c&9~S1<Zeg`qgqF5v-73y;&v`M_;JUMz;F#rT|6cU5-!+&_itE zMUHEOKi*5+CI5C6-E=`fFHJ>_Wbkb;qqU+M8T#FQ)AIu7IjA+8?wB*uzgSxTaRX#v z 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

    3^|3}a>9Re$su`3Bo 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 diff --git a/build_pcb/front_thin_lfo.zip b/build_pcb/front_thin_lfo.zip deleted file mode 100644 index de3d33ec1dd1ebb01bd3fd56ed1926a787cd974f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 476070 zcmb4pbySsI_pJ&jp@ft)2olnbq#)9zARP)vI;0z7QmqOY_3=Kxed_>*dFugq zYG`9+X~%4CXvJb{_hDUUG<;ng+g);wq7eBZMmHu|E^gqxraNllI21*wage*1GK!k_+w))u~Z< zoNWh0c)A>q)hT+^9L+nXUhS{7iwM>ptvJqH?(eA0cpPjH9!j|GP&hJ@?TrSSm^?6<%4yM+hZfX%Y?MJC? zHdyccSqM4ObvY82O(}`(BfmUe!P0XVS)LMboeQGl?LJ;j+G_AP?s*|(^jGMZcnKqn zuF3W?h%U7zf2V+Oy0$oXJ9Fsx{N9CfU&G~j4PAaNh`u=ML*aRPoU~PNhj6Y6W2vy7 zViMLVlGHTVE3!73cDd6h;(juPrPjAtLs5TxJW=Fv<>ZnwbG5yFMp1vZKN}(9an$Ui zM}E0IpSFX{vfCO!XjOaB+gfwvv7>pWG^nQMc2Jsbn-%R z{jy-IZhyQriFHx{RPeQO#%19$4@;%?YIDNsPwBMhK>=Ng?`EqOYlGv?LyWrfrZd*% zMuTagt7$XVTHBpJQz4GibxvDz1xI=xQ9ji-`W)%jT=gcTcwZi==Q1-^N2fquHB{sj z4a@j1={e7S4Y|i!f6=JLnkrQ9oL^NvR^L$G{XKQ1Ii4Y=ThK7;qWe!j{ zXKO@)y$I(9q(a)Ty8FH*>!3ho%vyGpefNVH?FMBY1>3H8#+XU$_DQau9s|pizY-#g zu_l&}Y}dFPm-5HC9M4_n_cb@P7nifE-gQ41)F!f>=i&{k;sB>N_ccF5XL<%F`M@ii zy&A*tKgvxuomA(ts@``W3{LVd`kPpi*k+IBR5cdv?uvJ}h~^4_*t7lXa#qGQCl5s`#WW7VNUS%-uVvi+(vi71L%?@3M24M7Y)9 zdiC{Ur|aT~b-HE2BW~Z1mt3y!Y%F2Ma+^Y-PD1E&?C=j3nod~I>0Vt+OwzC)Yl!eS zBW}mi2(#1h)Of;9P1ao(UL=f?hbEp|fhnkaq7oNLlz!iW;)DFugDgh0EN2jz#?93fYLw z{VJ|+A0mr;6pECkzVUNch}e*%jdZ-BGZu_%|IyxtEU!~Gif&^f2UKaA`~te3EC zFO^15UxZp@(uaf89tDZXwaB$-h^dxJ6a@t>#L(US4+I)IV`S|x!&CC2o(&#;=|U4p zwSnq%$AJM;38t*ZnSt5$C%(l63o>HUPdnvR`hsZ1L!DT06$WrN!uW@j5}i(FR7C&E zINEhRwH#$AANGh_VSI)SFdzTMDH4OPPj>EGuNnTAIWzUQmw8?y=ji%@2VTUC`NYFK z2}=9koaX%ah{@&dM`@OY(!K!&jKysqhYNVp?*9H5Mc;DG_rwBzPW=N&@f`>auKr^~ zeJa(*UA&U}EpP41ok-Q=LOS=9vJH$?qjrg^FJTsybqn=OqHQn!Q5x0f_4Qgm@wmM`ffUsX&)W%|=urzRcRQbDAi&0H^XhK54i%yB`m%y5eke&X-Tb=VAmL`vj3p6l5R?_J@A)fxtf4F#kr;wt5QR3A*aRkrHx4 zevL)ym5KjS$q$7vVayEc=j%3*~8JaW(qy-ELXQK zJzFgnE%_?@hz9<{Z_^F8RrQg0Zql6tU_gM->2;vgF8Y*B+L2_hD&wymmc}N0-5*0 ziM(sZ!}BhFJmJvu{R>e%hZ)M?W*lDd6-{5raTHnuu}Y# z>)z|gTIv>rHv@kOe2>&2rW(WqO&T4cn(@4v?Q2Z-WdC~|`GLg9*i3>DmwV}YDg|Y4 zQu}f2(Tw@gl}Tea_p9)WOx=QKWqt-d=6<7yD`do6ZR~O&A?uVP*OP<8-F|m*yt~V0 zkho~tc+joj(0`_OigkKd*vyQOGj~uIS*k(dAKw!9eMpI+@ubww0l|xwA#9GQ_m5?5 z?J=SkLg4KA57x1=Op%vEM`QJhSaqrjE{rOZq{A9Tt(#IcF4@6e4C5acgQr!k+Cp{L zOoK;!xyt<@`HbzpHjSm*vIJv-$xBxcckS>A;l0E-bVLf4nS&?>r%A5UwyX>m1Km?pr}FQqCyRpe7e>?BoefBr%JWaqU z&=GS)XeI(;*=y7UT{>eQ*nH6L5m`K8Vwx;Y=uaXpwA!R|0N9r_5PJXI2zgU~z%tU@4_IoX)2(4P{S?7Ip z!F%vK@a(&ZGN*6KooW*3tF`2piv9+K?jOm8-|Wbdwv*y87HKF7nR0Fu9!I$3@-r1C zk9O6krtzDjju^8JyYEMFk5}&eEH`6XB}))~9r#%)BG*UqjUqwdvKFP^x>Vy4qfnqr zASO;?VJTJC7tZm>S@k!B$ot{;ZjqFk+tO?0>VP6Y$3|?hI60@)w zqZZAti4zwlC;Jz^Kn3oOA$lb^m2{umYWR;XvA(&fM;Yx)q0CQ@xJap;I3CQ)gz3#& z(1#^1b7m*baeYX8X9?9>#g{Y|aJHw@wT%V`u!l@<-;+r$k(XZ60sEm@wr!zUMzr>FlD~=$u}DU#jXVyf+juafve3lZqvB z89e)Q9RF^e+-Hf|DGD$!tlg=oiR3#=C?T{09g(9Vm6--8I$l!hw=kZ;ILFsm6xbxS zr%O{S7}d#!+IH`=!AGmh3_BRDk1g+Y+;zw&M3F!u=SV+}&>X56-ccsA7!-t0dte1$ z&_bxk({Lrd1aHQ{=Z@WBXrbdws*rKP;7K#H5tifBnb?vRnRPztff=qS*e=E6kfqyA z!UOkwzf6#=U3k?bG#wmjlfB8Wjz>mBZA>9O=3NRbri0uP=-j&~HX6FrsX;2@2`kGk ztPfP{4`As@9)HXIpjsg8<4@1Z$|Fnb?cyY5BN;AvFkYYh3Y~^~ro|`*DVp=mEWZcL z2zS#Zo$;qun8F&8J@KGjGyfa&>ayhGxv#c;{%UIFHT_SX3*qZHHa6q)tNd1-JgvS< zd-@6E^_(h2`^Rh*otkF@)N(E{eEDhbYi$d8JGp~SCqnE~C-ZYo2P9+H3J)7wsd{B8 zhQ@BOAr`-=6g)5|nLmbQO0nE*8L@`pTRNBg}`)mlBU zmgFl|^HH{>S7N?B3Z)^NS$&#lY=fb0$E=|z)OIQRY7Lz#x$PcdD3NLy^(9Vo%&?an z)AAiKhPNplaJ!2j`&7b>cUL-_(5hj3q1jLE^K+F+EPRKuOO}c3pbBL|rl-9)DeeXz zf6lUZf5D|9djZXm&C7tk?~fy9a~VAO!yUBUYmYLLU}w(;TM7A9%J2y^qRCL8<(~l(EU4uCFK3PvXKp9;NSi;pl8$BrJAG=Qgexg- z%;RURJ3RxhhTZU{3TUohc6L|%>={-!jdy@4pA?GLmi|H zyFdQPNBHpBSM{GIXUWo^Odn?c;{2}jX?2LaoB}`b%b&S|!3JHeJk9KeRGW!HBkNnoE=u6Z)c3}{3k4+H`AJkFMv+4L+ERKTVui8pLYS` zH3}QTXRq?4(YtFEu2lVXN%~aIme+*w^dBd5(DpBGrx9EEMA<|Ao09k}Au&aFpiqOS zUqzC)J#7x6c4UIZ0kCIoXP4sFJ z=ZKQW!yOjqEnrDjx<3_E(a@HO#vUaH!EF`i9x#jc@$ZTG8Z*Ex)@YW1$?9jiJ(9VA zCO_ddMPu=!f_o)CTc!7CKVnou)b%lR-I^8k;;eGr?*CUNv}6Erv4rOsZxnkeR(Mt|W1lVrn@ z4-B&G`V{7p@RQ8Bc=dkPRnjmx@l$Y*D?pRw@T*}tH{!?HL6WkYwn3ruz5y& z4z2&&Pzh^Zyg=z4%105jm@c-5mKkOJ-$R;hGOg{~p5MS)*z3YjZT*6cTt2z!`_(5e zi?Qw}m=)S;Z=uYi0fpj5Wq4EO{Fz_3q4(xXY>C#1lodO(Uhx;TxrXU;2Lm=$8tFLG z$3|C6@aXba5@Ss~-(OXQJze6-nVv`?_FQ|#lcPF1l&e6bGBIQ35?xB7a;98mJZ#!f zKjAmqG{-i%T*gn5sYF5?(e`x@B8ZjD$w5Ap@++q?d&KFQctAOoT^-H(4CQ9(VP8kp zYj=E_+%b}Qwgi~((n+2acIj=DS#U}}>o9o_{!AP!#9|HZm7$LgLV(a6@I3(^t9EDe zGdD3IZl^fUD>)ThRpmAAa_Y?x`=iC*A{zti#eDqFD$;x0(2^cJQf#wbYIWLh3slLj z|LMmnt3*24G$k|w>;4%s9~-CIMkqr6Wr7KanQ*>*&+`3DK|YK#xZjzJ1xhzxwWmMH zf{sO^j5$%}TwqZrS>c7WQxwg;EGx%-Aw2R=l2D*OvSaFGn>{SI@OT*cGk18nI1DXCI> zN!yF1f$w&f+?a}zyZzw5vlJ!$S9r6t^|I=x9CNNrDaNm2_i0cFZK0R11TC#Ux$W~o zmtQTna*~I(_qIB%lJfFk$tZry8n|1CD~vwl41B4QIADpyIiC5eU6`p`4o*$ztK(ju zopgyaVH&L0|1xaabiaP@t)OsF4FB)7qsO#YDMil7hZ2cyoCYH4So}s-H7o5XvOQEd4T4E@Fq}TX0SO3_Y*iwOoHhD*yfF4nZgRZNi+_`E zPD%hNb;ROghA<&~Elzp6l__{!ezfCR;9oCZa{dS(&V5lD&3nO<&H&d+V%s8i*ZIRC zCalb_QlnDWJef3Qs%!JU8+|W5TYNAQK2WaD<_YM8T(X{wx0+amcgE2l;#!&yX3ylt zf0_K9rRX@D3jWSjLO_E&V3VT?;=Y1pZV zT{CRwhlO1sU&~H?^6`wle`^R`oSE~>8tZF!0*dge3A;D!RO!HDW@Pm^K9Ck+x%-K` zqK#f=y7)?+&LQmzLZVA7E)P##r3MqAm&ylN^Jb=vR^_rog*XKvD!uP>51sf&@dU@| zrMyZwRBdW2#82=To#XVp8*b#;zaQxmtXcT9VhRjXgn`|;w) ziR0=wxp`9wljF@V+dI9jQ?RG44MJFFr+Cpf@_qmL2bQhv_#d*ESDkln3w&{2r}7u- zwMXxb*yAQM|CYk@LQ3kCr|4~-0F?Zt{7V^Qr^(k8@3-lkCT*ta#?9x%0uou>v;s66 z@?YmVzgRPfTtp1C6;dP<^1mss<>u3PmL8?Dm)u_36v0;%NNK^b9JtNwax7jxwJG8O zOD*nw0@*2Te^26Lb@&NJm0UZg6F{<8z5^8?fI=i;^^IN)r}{omNESf;?LC)7v8Nh|v_C{9`>3F&Vdy@;EW% zY-91&jk*qIM`#UYg*O_JtOV`I!(^AHQW%at=@Z}6u%nxF={a0I+ZsE^k9bN-peQu1 z#bsjMZC92jWNR?P_XnYOFoG;clU;+y4vMRm>vgh|3b!oc&*B8VOMfVM2I-96W7guS zAwV?FWkRdPsnVpgttTTu=$m_w#NC(+I-aF75|Z=w2Ggh!$@|s`l)0R<@(98#SLB1d z6ncD2CrwRz;rRp7XN(T*TA#ly^_-a=ado@>dgkqfbkONv%xQc}H)`!G9qDN&G-}_3`xFiRV~p9<|dy#~Q)02jG}FHaG@-uV^_oydx-1*UdldtHHyMJ5|d5 zXe%~MUohc2Y`v4YhW|^JA%h{*w26taSG+PGd48(&aa&A~vbuw3KttH(x6A-?3Q5rq z_y#3ujnSb-1pB^rA~jbZ1ZfJwExu`Vm!6v88IJvxv+K%wTdTzrv;&#Li>*u2``S8C zFpx-`l#xT*oj8`TJkkwPG9-X!p6|>{K3#6EOEwdHYHJ7`4>PVHn?`Ns<|OCe8e#sW z9BuNqH)LnLYFOPhY?!37a>VHo^UG=pjuZjbHmu;v?v3n<2CW$h++9^6G^|Illr;mNX3%x@;-g z)%YVOw(ZhXVfrB+%#4(n;$qZk8UF32pzWQ38aaXNH=SnFPr8}cS&eoKzem_!rh_GS zmaf4rVz?)-*KJ+6bM6~O64-P4kC)`9d*G{RM0lZVl_I) z4EDX7?@sV_izium!|0oj>3{88wJDnpQxgy0eb+f?Yvm;_XUOffRGSVsB@a+;{egFY zRp)w8Wd$96KUt`zTt++Hhxz_@9dPGOOftWC8Z@T!-cL+8Lm(4 zjABBKS_BN&CuP)*)gO1GC6X{;zumQb9NKIxd^3)rN0#{uDf%8BzcZ^`x7ZY#>X$eb zWvd$b)Gnhux3xmrNnR90Y`Z3Tpe)Hb;Wi?(2w}DGg?9Ux*D8@7UUXN{&2BzEKa16& zn8o6GFv9W!ZV7f>F6`6HYcOlrdPz!7J#78p`g4-u1su3J4=|Ge%Q5e03keeFN|`L( zIN{ZETDxSlYDjl*KMOl!6>)mil_Ip$iG|hR`6pG0bI35Ubt;W0ZEP}a#i~DaXy3>1 zyQp#w(cK;=AHxhoQm%!&J#zBke|#P!`X!q5ck>#nnl6gMCey}pH177e41RW0Dezeh zlh{=u%U79_&t;1_%<#!=kmi0pjFme}`zGD=k;=S$ZcwhZ(&r=<&NuIs)XC9J*t4eUhQ`W6=IN7Tr$ zDzb3Sv|CSaz0XB*dVWj%U;|znjy<`x{Jzr}zoMc^<6K#ZN0za;F z3%?()cI`mkUCCBR&}GQuJ+%3ibMGkx#Q!VoLegRWIvFKEi)g_so(l` z^H(~lwBB(02^xtDh+w*po z`1H!xnA~LY@!{}oczuj{-t*TNelqzF4)nJKIJ+fU|0^)K`AIF3(=8dczhA{ZBqOT% z$kB+1agEVOPGv8Sf&Y4-beo^vh zKgHcz?|%A|>)!UqTY%Y6cgq9iaMX$n9^!-HQ{?vRR?*J`GCaFs6+}pT{%-@FioV_2Gej)Sb8LD<#N)GfrRaM>>2!5wpG8-@$ zKAtaM3Oj8I&**;Yq8us^Y@*5@KesuPY=oc5u$f|z@CHx0TOin8l|4a!>=hy{$8}PW zR^yv)0aFiEi(;9HSNCDTWin&0lFHHP#2m;DKB&ZMypP~_y!ynI*XH{E=)O^bewX3l zpoe5t_tRz$&ux3Fn%FgQJpa^tWxne+Z>mo|Lqehn1k=0zjQIhyIZ?30~=rG zW`%9O&*r>%-Y&iu{yu4B>61!mr#Rsx#Es6rP7Qn|^V-{<{vH%3SAPWOFz$x+Pee_{ zoKXCZ!1gS&nWtouJYTbm{$s*Fy}1IR&XN3W^&4#*=jQ{zG>X~pvy^-hN>(|@^QasC z5^NFJu%K2$fl}uShT*y_+)YWhMk#$8h;tDy8abWM*5ixd6PbfRPbj99m1N+Gu^I9O zYWo8LkcG<&sz;K>yrjr`s2Bd#Z_B8YdAYpX$KD2>hX#;pOs_p_oHze6_2J*iPv(MwIO)2)|dOxDwn;ihPFC_TY0G>AUHERB}3l z4Sxlth~k+K58?OT1@~GvBVG;VLG()j^vg;rCJNp!pSL1nwFXXgpcw^G4n^O5BVaoi zv{nU@{#*W2X2kCV^sCZw_o-{MV%);^Iy|5~G@$5F7dLljhzGl#c^P%{(adIn&j*pY zW0VLIx_8g!kjp^&&@s#3XsbB7uukdja5)x&mh+Bn_XbxpD#3_j?}V1Qj_s*B*B(*6 zh~HK@7^~J2$FPsn#8n=4)~v?J5t)s=hud}aXDAA+eBtySWCJvy{np>0$z;$UXwO8d z&7?+^kJg&;_Pw3my!2;9S;99*8J;u>inV)JCzof|^!*}f^zijU2}>r`nZ|JNZl8tJ zq+`RINQ%6Hy0yXwV%+BK?8&SNc=&g2c{}X4p2xXMy4$j|+wFRx(=IHxiCvGV0zzkj z`sGpSXCT(mm*`~DsiK%fWW|`ojZtY7Q6aI~Fc)egNxBcvWQwVexHfys9zxAO9B{acxw9lY$;O;>F5_zt10Q`eTo)17BS%vU-hk_7LCX>bESHfFP|qIFi3*5Sy~Ez8CUyFGY_~YTKuVziino;pOh3}L zk=N7`5Ie8)A#rTF2;AZgixvpKn=0$f`qVdKe!%}_STeaz10ft}6byclxixDJ@)FMU zU;;q;K1;{Kzy&|47J{{QKrK6j{FZ`f6xn-nv~c1cL86n%0nYD?CFu#vMgZ&Q+&O>u zWDWuV*+BaAK&fN`gWkWwF+CXB}vs)Iywgy>e3zxDzr^J2!jhQ9k-17+@322 zZWZsa;YK9~h<{}6LJe2km)TG_^TmKuO@6@sMBPpDv~eC{Sd)$er-&T_IO+a~4?uNr ztyIjo`FpiXGftXj~BWF;Yyaq z2#bNjU1An+;&{#6`z`rw5iH$AOP~pjj~GzOy7?bU#B}7A)D*65iU;^(%v?{M{o0S1TnKJff>2@9-CD*ocEuhh_M#W zWBdhf4UkKJ2uF?!VO4b3AzlhJIX5F{6OSB$+ob1J0hF`5#CFW;HL8}YcPV7maK7Ad z9;xRMs^_uHD&k>1>SuEt~RNTI)T&m;2ubI?dM*bj1&3J zMcX`8%fMJ&8csL09g|e^PY1gO@@U+3$w%sJo$v<#p>ZM|I9O_iO~tb+M?CTj&kai^ zn<^Td?E*|yFOEr)%vS%f+iUIXkKzXeGJ{bFEg++_y|8Xt=OqACWhW#1`*(R)H*(gR zf4n#?dNA|s0G((Y2c3Y+#=~wNJQozZSaAE>rob0|oPt>+Sgn`MNw~g&N=E=0jbPbC z@d5s-FY3_V_**ERCR=ip)d(a21>*CtLsIDI$yELhoT&HDC%8JtY<`7XHa!E528^b2 z;E8smKyNdNHn_A|ur>;oiTholH^TA z#)CJvIw91?4GoujSLYWqSEutLS3Xxo(R%BwDjiPm?j~qFdV*`TClZik)VyR`z!oFN zDi;~mM3Z36GuC1Jj-QAzG;*iuJ_n3Vh8EobQp#2zTG=GWQO71KfgS_tT}m#98fdcP zP<=!-??(hNeD_HXudM^}&MjdKowIYliH7J|(sV~CIH4IY+J>G9sb!NeBruE)YC=w6 zl4HT$F#i&>;)lcWI$qQePomTKU1%tNTc^`I+60YwN?gBL&TbfyMS{8C3dH4|Zz!H& zB$3}M4$Vi@27cBYy782p7%`AJ^G|(j7_i=UEyixjL5xhu7jOk$8;C_q#3%=nr%7<; z8R-yzcYGhlW{@xql5lyK3}QtS`JsWdXbg+o zfka-#Q)c=}b2#w8qIN(XFg7t-bWTvBUBUnWar;+E|4i#EMq3pBn+e?t)&k@QaQlFy;d3D|9f@fb{PI zSW}f%I|zTNrb~k&QKbj);O<(7+VUK~T(YZ>Oh3bGF|$2O@~mq7m1ujW{V4jooXov} zinWg&dE@<;#xrH;h@*Wv0xjZ5J$WPj;GUE>hf6>3nv^7$GHpk1N2%4Nli}N?1z)-> zj2&h-UdKEd>pQe9&-4xlx8Ng=w!+3$0@-Gh>z&dK^DJ!ZSlZ;v(AchkQPz$l;Z~W9!_b<#}3I*`Td*lYd7I7Kqe8} z@=~A@3U)^-#0z9M81>3W9NHd?>5Q`=>kDRViBa9Rw-eTMAj5WkLo!ZL*C&CZpB6k0 zs>fs>c)mAqW}bhcy^)hPKTvPx$2K%@vRnnnW4ixx+1-!@5gB?NSYMfvew57uLr;-iK(3kV65sKR-W3K@DbLZQ_HCi0P%oJM2m?H$ZGqW_%55 z;Q7}PVu1d=+~t}+9s{%M9I95PJqjIE`j@!MH{hVS6C$4Ha+PIz*PnG%1k)pE5utNW zT$c=l9g)ZKdX$rKXgpE=LJp)*W~DiClY!%P24wIIOc5EF!ZS#%DXV~|unbbDU3~!R zMS8P8Wt5tS=(OaPEp%fEPQr*0KtZ7>+qm|re(4{?w1 zxWhHMu3I&)VdjacjVRt_lb>>T)!f)~|B_S=!GYyT1P5yEtt>pTGp_4ja9={#2hv_B z-MiJ9H`af-d!Zq9n+Pz*W~#~uFvdP_qBgTUHE->X8{HiarI({9-B5uJaU>l=Y?7^w zrPb<>lR+QhvURc&aEt`b!@5Nhcdfy=u3r2W;09goy+|}g;r@qlYi$AG?0|hlJh4tEwqvW8 zUuY0=NA=iMYM%C$<2^Wx)rG&SydSMDgC076{5uSc?1L4_7W|S8zza+cK;VT^YZC$V=@J-xdc-%K;#-7KM*{1(9 z?wJZupbjCM!(+<%C)Kzp8l&$)mM0Hqq(A0&P0?`zm$I)a!M&{!mn85C+f}Lz%Gcp0 z4Lf;&Hut z`FvhDqt}#{ddVOFqAr8^8}%<#*`lxmBi}X`z>0)-6_A(kn*C!pl>2>bd|iLlCZc&$ zxf^hL@*v8^N7Qe>32*dr^{{*H2!dGldDn55R9(&Bfq{#%&SbCNbPr@u(=EJl&B2}B z5=092iq&ud4)ohAo|RqmXYyZIH_WeDj}OYVS1e)0r96@S$_*SJQ{~l*BF~Z4gT0ob zJ36CPLcG69jJI;q`lLK|1k|uyrDuYCy5l+&?$8v;yg2J>Z+rQC#C}Bq526#d(Sji7 zB(E^S+^SjLUe^a?cwHa#hwu}4eWqA(K&=VJX(zkx`q%aC*o+}~<971f`C~rD@9ZVu z=$=6v;&9%l1BFbZxar+85+WIY<$NOC_YB@AJ#v9mN_wDlb0% z0Vn5~XDpOAXA$jVr2uEw?%2_dqJ$zg3&46E0SitF3vc8^HCNXvt6E2F(R+rM2K!l`(X+XcV=Lv^% z{0IsG*HW{X8WgrzqeMUoUzJW+Dnu}@XYJ1J4NZ1IxqpYRO)?%q=h+blIQO~q>P0XH z5WW8&*!&#^!accU`trZI-uc(@o6$aQl2ptCM|Vx>A6Bj@*$i8p}4)4VL# z>M6bHM9I!Sw@qCu_{{`dX%;}0GvCpHr2wV`-L2j`eEE z|Li(4YP=Vi;eXm}G=cCr;Gq{9@rcfJy!)O)r--B@m@Nq zG-vM7g3UfL2Y3%GuX_Lht2a*CIEYIs0^7;X?&LK=oXVj0q~Nn12((hOZ6>02CJRCM-v&q*?pdQK>w|kY6KDc4fkx4e;S;FW zzffx`n->L412`C9ZMAl%SUatnSNpf?PWC)ynKnhAkQ!biX6-V6-$qdN<zM; z9p)(ao*2;Gj%FPQGe+zMV7;rpHKDf(XHk(R*rK-X)HA4>fe zA2Ox9iO{Vs6tS2M8^>C@G=0K zHK0S+XB~hWY0w7E^N}7)#UJK~T})?`+p&-mzOp#!;hlx-KCY{y;r%5Ln1(bQAp2h` z1sZ$hTxG6(7fu{7*5O>RF9Ty;@*a*|+M22bf;UJ#M=#G*%E5vGrZ5iNLRceic821< z!JA!5c>HELID@yw1-R3Zb2VbxgFypdJZkwT&NAF{VLlzQ=5%oKT`bfiG#zGt`%Lg! z)6O@V7IX~9=flKqn*;$4~?f^2R7IM8`Tun$Q~D`x11V-Zls zK=4&8ZVg_DCeX;HGB;x0s9w)d_=AK0G)CtL?~DUPHF_~Bv@w`+Z6nkF*odOQH9op5 zz`sEkffa%Q0=^)C0fHF+a0$Yv7@%^N`$eWUTyFMx*Ny?t8$@;mIV`r-Aiz8}|Nq;{ z;7+7^^vx8(&C!BhL~VsyVQ?9jBlL4U$7dVP87610PU1u^H}o3LsY{ARFLtA6E_aK% z{`PHM?$-ny1UnnhK3VIQsQSh^SY&oK+LaH9Nr(f#7Pi8az#d{V_(vY5Eg$rraqO+C zqG){QXfXkao?~^qhxP=2WLfkx&MOzOk*qzl^47UEr_rnfyhZ)Ya@ND5xPzjBqT#=5 zCEDwIb;Uf)*=zzuhEH$}bxRw~W91TFc7|%ib_X4}pf~1wl6LS{>NXHYkI}2mzdNu& zXOACNHm>~^mxl(^DD7pEITT46QT~GzrCJJdc*hY_)NWIkAIt^)3ii#tpd#K==&#wJ3wn%( zkl)o9mx!vCoL1-Yi#KZw$ebtoW`jEiM5U^OMSYd6`H(A^3A^7w;*Kc{0@Zltr($@3 z7ad=2!~JeVmM31?9;1$v1m7$s0S<;PESlR;mm|fyCmIDtZ{;Ovr9mEuz2}17o1fy% z9usYEmgJW6>kzvy8Jf@0pLGR4#91U32EJ*R@ICEpom)|hUGUL8F zEz>sl5ULA#Sv7v8trZ(8nRSm3B$@t(?c?}-K$65ds%yH&k6Eo zFdCUeEZ>z(*M~cnxS$_Da*KBh^C;Ol*e{enSaTwT6(MOPosKROB2w#OxIa6*%CPMv z#i({hG14`hobV}cr>c`)EvdUq+hRLQwG^PTX=kAchyd@*vq+|dha?Ad4;x?-SNxH! zs|;L*^J@eIgGKW?-Sw95roMTC+fLxOtufGp?uPLUA9A0z)=y)YDKlrMUBOo9HH@+V zR%6l-)CA-*?ezerBbq&`83`sJ2#X0zOeyqyjCD2Uqfy80%%~<$IEK=!5obkY;KZ00Ayp zSeWYNF@s}HgBpdj-E(VHdP$4zrXlZzP&`;6LVk^M^}omM+=S}P%0bBq?sd@7tOdN+ zPT;4X`N>V^sb*c#2d(+#(P%IrH948AZi&v&gxKzc;Vr)_jSXA$M+E9ZC`Q-K*5F7H zv!dYCNjf~O!v;CYO_wE$(Zf#Hn*PdffFAGJltWY%s4k7l=@ZzxqV4s6fto-dL>Xa4 z@0hdntd?5W&9XvHfD{L0g-{F#^irwJ2G7+kN(O|(9WD4>suDT#ve}#lcYqd8ueB%# zWb}y_3hE@#!#Wu+OSu!FyT-6xT;>VX=~kx*w~^?vrBT1~YrVP;<;!<5KtODBi$n?v zA2V(Tnst{#pz)Re zCmedvE2HuvhWvNV{|!e|e)f;8{L`aeqJQ8}Gt{)?cUC@wQ}8M)vD?tu;tHnuNiP0< zCx40Y6EmO)F^;@!?Cv&Tje|v%d-{jmgRSTD<0H$NK=>g=eUarR9{CmOBU>n!yHR!8 zJwQv3YFCamE!Z#M-g$sW3)uTJskdmDAfzb3%|cVrOJb`a<&OVB@wI^o>j3|gGECJY z9LYKaFkT+Kf&oXR4AXEc0kPfg7Y@6eo&M0vj|&YLURVnm(4SvJ^0dg+)1xPZMKf4w zdfH#60+k?xdpen9vs%8mYfn_8tUTc~T)>l1pUT3(=) zlO5S&$f!1-(5qY8DJL`HH28`Gq|gX7r(}4^o!`1R3S}YC8?C^kk!|A)b3s23!n**o z3&_z*Q;{lRg-|PL9A3~Ryr2_MP^|KHV;;~oRi7${!HDc4s4HfSUW08g`Uxlr#ttNM z^$rF(R|gK>o1c8gbH=$swG;^CHgHhsDor+$C&1t!h#{~S%>V{kBNMRE`mADgD?O`( z)>FWmm=oHPE#?RbM47I(l^ho9O&QD|TO(6OijEP7j_FxM- z@2SqJHqQ|MDGvn@>Rdgx!7+9bE`!}H-9p1|!_H3{pUi<>ps`zl#loeN7>XD2-+6EYv^yXiWaPH%HYLj}XravIy#$DLyAj2v|+x>lbc zFCAz&V=MG)I`#>Onc^S;=CWSTdrLVF8C_oYVnvANgWsDl$8+sKVf7RjF08XT9tVWZS zMlz`<2EXShz{`_&z*{pkk*(+`)L-%*i_Y(?fCO~YFml8(b?y@cGvU{OCig=mJr0uc z4-~n^-sC4Nx?r4_x-pJOWK|Yxtn!C3?XPMi2A9WtmIF0F!P9=GVJ+0+eyz7A=I|ds zXygK#xL`E?8Zv=A8Pi{h%J0xDZTI&{LpJl)x|&_qFi14kTTjOXH~nZ=Y&3 z(O|g8>(W^B7@gMWQ7ze$F01qk{i+1RXlBr7N{mj-zS!V5(JRbcvJsG%BLD=Z&ssT1 z4zY6c2jo?LuAOpOCPSWBuj)?$Qfk?-{3jC-wOAIxZ_J%{Oe)@+L?%EK z7E6bmdEo7oiG>6B?UEoF-bj}x0&nYS=FL{L{ugm?9uM{Y{tutiq6O)kLQ-k5gh2?& z)~1rJWE*=7VrB^0w^Nc6iAEuF{P*q%rSJ{Y3`l`(tdWE@uxUK0VXWfh^)<{ zNgmWZVk#p7XM;eOLZJ6+-lPbM)1dar9dNl2rkEY31S5)eqB5h17{7rw?l9pMTXvK- z)$nPwbxHjb%z4Nq)bzMjf#7gO2M^PWK$G|++#V=-2%_TU98Gyfx|T{6ZZ|!e8DsAT zX<~19;ik^cABK-%~NU#T29rxni1A?j70n6RHNkPY8>tKm2^B!o~RLna`!G2 zWG5P;v}yNA`VMS>8;dN!G$VWlftpTmruxV>3z}lGjn8UcBztTYuFMIgC?T|_M}0PC zJCCN!)agPXKxiLTFBV5Y1a6(OoubD)3tT==kK*f&Mpe6N7-CE*!m_j8a(%@ zCh(5(#QqxFaVgWIShOQlS=ZG}q4pmSKS`Nd#nbZNosK2ZE>MnYQWu29i7}WfX-KUc zFN-qI&BLTW#nbLXd{L9dm;{ud5^ToPevN`*Ak`>simAf=ZjY_lE}2<`(Y6aE5=t=8 zM_kZJp;^M>)yk}Q>+hbRMtDlMD+LfefOnpvJgbR0z4y&!2qg4`&phUNml)+!3J01d zB1bvVeH@z0?1gL#xjhiWw_$s#!=0^L#oS=<8Le*QC(?#Hv4mWXm{S z7RqPn>`ObXI^G|e)qI-Z&~kcBVq5!#G@*7qNpTR*`tJitnLvd*&0xdoKu~MR`Euu@oMZ_1uN*0KHSOrh}BGB8(3FUJB&*D0{WvcFmiwpGIS- zZ6~^qVVi*k*jLo3$Ii|;s_Rpt)mR|0@$?CHi1WI7sb5=^Lv{WMA`}s=P25tj@=FQk zpizn`1rra+$u>TtInNXCAc{VfC0GW!T#S(zDAM+@6-AG4C`9CpNNr3pF|O;n%g3OHoF*%h6g4+FJDL&T0vDX z-E=3E(2s}t8axlZ>3@U)g^>j^~b0-6~`ohM2T z6mlMWpftFGNDJou~<=fkxUHv}4MNoKDc?qXg4pFA0CC ziktAR#--XaC){X>sXpx5(95hHG=NnUD~HJrVC|jxLO~_q=!JBmwK+!8IGfrQnHq}{ z!p6i{Ct5US1Bk@F@lkS8jnwgA^!`GDalxGgqwkQLzKCU5l)H{ ziGvZ~vSE}WhyWa4uq=w(Sb`?m4RTAwgeS#l8e*QuA@fieXfoyd)fh}xoT6q9hRq`e zvzi#ue<6}+4K@X~roK-|Y=exWB&h3ix`LKk8(CTKk|^f2 zhxx`o^DaYRMwM8Tp+RZK06S=t+E6#gu;@_BSH?!u`*Bjl+Q~js%5hnkz074!uv1;h z`p{LPL1|8O3uCEmz}+6JLP67$auwTUWT`U76H$ujt9BsRtI(a$a0yTx9=L>eP)YxV zm!FC@8+%NtbwK?EGKdLvc5}0ralCL>j1hUTf~rT7?~ZvqaN(;2PA0Yqv_udlKeUDi z?MdZciXkeLdCj9*&$&7`xHn3Xi0}~|6^v1jfq?=BhbNd=61P$q6B(KWdoZRl?{peL z1|`vy(=ZM`Yl1Q04(*AS5()-A=CzoUDwJKF2?v8%U>l$l40`GZ3mb%B&2kP>t z#7VYagQoEW=1ruUh=F-#(9L_Is8!vk2ppNMBS^&PAcb&ALkJijn%xkKg!w*82>tS| zGw1*<4^a*%UX5&iO1~ zl`sGC)=`6wF^zF$w}o=i97S=`LLGeAwZtoe-{o5tzRize%CN)=mu!=ueJmtPpkr;IHnqE*+>mA$0xev2HzS z&$MWiIp)f#Djj;%;bc~WURs|}J5RSEDG7%8Sa-7)>waY|^h!YGnpnR3sKCaHE% znX=ICCA)$ct#>PiSWUW?EY%P?4h$Gp%BEsG2@XO7k#hnIx30*Xz|tgJ)2g0F1`}3Of4paT4wVghj0bjmdz|r!L_uP-3(P-Y^qdf{_ zIcZm}ph+!{GmMg;yo}>Ui}Qrp6HITXEk!x_=?#Rknor+M<<@emeuAe&I$w=Uy*77T zoO*m|=d$TZnC`Sawuc#8kp;2JuroZN$jTU@!tB{;iJ)}Qvr&{2#HR(A^BzLtpiOdc zabBXRVTe`$J0FO@=hIXx2Miio`ldQTFP1Zwp!xxyA2$iILl^}pk&Va2OM-X8R@=Ha zCu8BV(D^M&nldMPK%t@0NTLbB*7k%{>&3`uOf2(j;L1@fEs@#K_FH?Pr~LZ)Zd1xp zSvVPY*hQXDzSxfRI3#^QdML**Z4V*0+%iE;iUgWKw6Yf=_TE=QpEL}&?bA>7fCmaZ zGDTqENdr}p@u~XBdYRi1N|x~fqK3S{U|^gk9dis?4)kmxG>pX1x!57Z2fHlpCz)VO z(>el)Nm=l8Ac?kSSArgxZY->+`5J(ssaeL7(7j@9;jj3$%IBZ7$i0|sK4_SU4x&Vu zC&y7L_mglGo+dn$+w_%M%F_Wcy(rswdBPB6GJMc-DK?pn23_AO)X`nQ9_zII$L`*rPxz_8}qd{A0=Nu4GtJEj+be! zzm_-M)?ekvt_3X7a<0DNs7Wq`6T~*{7w=Cf!Gxgp_k^V)NwAu#ZF||JlU9IoM~14U zDEr|FfAPW~2Vu>yCIb^b&5OvB%Ncm&80mh3;!G=m!9-{{?A68;?sB26$@9}%l#8RG zBeo9pc|zz0c=|^gg>^Ry?_DTNFg?SbT7t9zvhqpoeas)iZZNTOLe+3LT07A4Ag!s@ zZJVDF(0J2hlzWc#+z%$_YsrYXQR&CnsW_NQ&To$PylwEji|X%*PW5Zc1ClM94r&H` z;ZY`zMjcK=y3g!|#8jbn$?h8{c}-J_y2nU&@v=pf`Kx(DlmZNe2Q|%4S+<-m39i)A zq)yqHKzDiKr)T599`hNVDlUziLn`{WSk7Ya8yqBR(ovjfA7V_D99q;cAr;Y|>Ip$; z@WuUQF(^)ogz>k|S;>-MEJm{1F1_~xD7ig*OoIeT6UI*XXu#L(#$o6Eo0!J&Ds-2!ENZ19wqG` zfGt(HdoZ`b2N~v27dUv1&v}S~#XgRRJcf=;t=t zuN8ROMQAg;NLfVbLfD1B)#LVLfxKG;o-t>Vg0_*uZ`|P;DDnMh;lgESQ?)pXm2l@$ zrQe2=jCMLtq!x72o93i^=`Y-EZCVENXBdgzwQP8?9vcE&NwvMR>xBxuk!Lc#eZj`R zxz{FqVcp85e`{G_SI=6*;huccF8?|U6JOHwv}YYpRu$cjuAI;hIl@?D$ja8rXH^us^lMHwEZ0q` z^XF8^x-rw5>uTfqY{CmI%IxXJuT{i4M+1TiEwQq0u0abKvOm5ElX5zjA^aL;mi*uh zqdzkznC7oD5*=)~@a2Vf`qQ*+7rQhe$+BxU_>ak*3-+U({d@52{GK>SO+T%f%qvf~ zaa$8nY35}iDXVod@y$Z6Nw=IFXdTtz&j}~0%0pZgWow1;6&}ZmZnt6;T)FU>zV&2n z;9ClMF1h<*vk)$sRslq@cXe|Or(5)FXy}HiPr@yHnQ7s5^n<>22l15%?~)2Fumg*G z&-+?T%Hn~!K!^zVA~QxJpA8poEw`waFW#eSVTdD^9#A|mE&Jt#yL*+Q2SjvIR%x`) zh2h6qYPw0l<_o!I)|~~S1lo-y9=i>1Jet(|Peo1zVbW&b0;w)}K3cU9lDya?xA1|1 z#g888$zL}~aR5G)%iFc&bpUZkn+}vYOcuz=)*WPdOL*MS>48k!<32!Oh$`~8d{qiN zyOe&t35(0ubYSrg4?bg&ROiIdo9;f0&A(D^Ur~D&UnO5VMLzFqnP7v*)%4FZ4o=#H zEre81n-2Nj*6zw!lF%>-#6N**<^pjJGJnA&p`?xtNN3OJf-yoLqAw1r+CME^8%nb9 z4wrgDPG51zMbjL)-iz(YooA;$L!O4K76-8(`#VRC`O9v>{Mb5 z0z{;;s^sey>Xu)Gchc>rJN{h0p z6ucB;4Y>-!z1Dp4<&}5vFCu|@6(CLf7jyk_ZFH=S9nj<@?uknN8e>(f$0h+Oq1rBX z{>cJ+JAaY{6j8D_!d_Mq5!fq$#WD|1LOH9rg+n1O-l+rjE*veo9Z|fa2Z}?Dj4O&gojm%;}!wTxw{jl1|ET9Brl-9CyCof9(L@|djQYhfzu zh66EZZ93?Cdm8II%GZ-?U$M{v+4oSBUoR^<yw^77}8A>@TzCAz~(!Ggd2;rzt{RgVbmt_ll&C?-gd@DvlOncb5P zA}1?fX90YbFR^d&@la@r;*K$7(GY0akE~lH+?{fk1W17D6+dCw8jZ zcLD7d2*n=SQ_t~FdsIpg{;SQ68V5B)v!8q74*XXdTPqDoE7%~vv~EG}IZ)BZnUFsN zl{Ll@D{ndJ7M0lhBJ1ZpTcHoFCXc*ebxMAbXBjN+wUNSQbut#8;33L%Editq?Crwk zK&o2T0!C@tP>oPiq>pL!=2+;H^Hm<7?5C7U^4;I_(UW`sVJUb9rm<+8j1`lWro)5; zU^A%F7h#w|npPR6ACZo)}} z#zWfpkXBVuXy31R@k27WdkB+oA|)jYo1g_%I=xB7zTSBfyLNl6UkT~EWom99<=CA0 zK1&~o2=D{9hj6hmVB@||aO4#Ob)TQlvWD;Z>o4;l}NtUNOOebJv{c&%n=1o%g zYzQ7z@}Sr+3ZSq-64naj<{rb0h2Ow3vY_59ed}8C<{^2>L};igIp!&Rkc$PI;l?Sl zj<0}{WA|bHT95gOMZ=ZKJ@_ z^$n7P@X%#jjbB%QN>|pgk)&pl)nT3zSXh`}A7vKbW{r9JQx5qO69Ppchj-@Qm>RBgL$aX)q5wH1n(}aCTSbCl<1RqCJ7yG*_`siSYEY|Pod4U zjv%>gxlgUnAJ7=IhNR$=JR*}KnN$<<>FzUVarn6)ZItFi)+ce$2Qe>=Pa2AZiL5Lq zKDNeF?&j{H+L2Y!{bTp5rh<{<8BbE<`3W6sjJM>`Weh7(Q!W|ZWzf+enGgez` zdton>0oB@#;z!Yop2pQ+MldB}++l6T(N*zSY6E5%W82h08;zEg zqO&F3895d@PaC4u#_9QOHeo}CN!1C;BKVOV%8ih z^hjFrIx#yk3C-;G>C`9w`~DK=G9>Bp=+cp+n3ELByAn|Xxc4F0i*ckxH%qh>kBBdm zf6M*^Y8!@yNuQXUGZLN@5jQ9?PQo3+-6(K0_yU2qhU~M2HCEa}0(4-ruwW$aR7Z%q z#j0U}wGG9Ua<(gxWMOW~lCFk`Pa3>5P9&w^^i!=JC@#4>AwkOBnf@0~8nS8Lp`Z;y zJ7|(CJaW8Y1+=yji-RQH7%rY-V=;MQ@v&ZOY{&2N=)TUk^$ z31rV`<)I!L&aJ3lCA1Xa{aIw+?AS2Yut$7X9ALOjE*{V9!= z>IM*jNh7zCu0-ZYWrq*9aDtKVE$WaJ=bo776O$HSFf)+%4zqZKR3p~jKq|9>0JgnQ zLxvfS&C#?8nxlcZp$HZ(_niJ0VV*FbaRUyNy?QyT8ur3|v-Z#3Ba#3&8Hx@;$%|<2 z5dU^hE)HeM3_eFbgH{|HvhmrgYbezcWCiSJD8{lO9G4Z<2U@k1C<7-fdUeE849>uVRmaM$&_X$rzrBG?L)dvmyE2R7=-V`$fM@dee&zRH< z;1HG2kzq*Eih&ySA)iI7qH_+yp++z-9TD{-H2b=rlo$48n%=m7nL3JD!;mMEL zt;icE;w(tjWaERVYTB%oH^pn@URX4(P0@%glQ0riaYvMnB>ym+3L=dqOQV&>7*=kS z02krDDO3$+IB_xvbeQV@*#gBG^BL|oLK~u1jNgE>w3H|sC!s8r1(cz58Wdw83)U2$ z+}{m0l@8beS(qoJW|%>Z=)`0;Bnidgl1cg<)-JhQL^2JsjN?(sB!hY2&RvQHcW5+7 zN^Mz#U;(cpTCp2tIE{LTnTHF~58kDCb}q9IO8 zzO_WP>kz4$I(KXhiioGR1ai71F{jO zBx66Eh7g@$0z2s%W}1){jY9|pAtP3aa5E!+TL%j7iXkb!2D6k1B@QZ-h}#n*oN07~ zVw_AmjH&@n1(11nLWvJ2h6NQsoW0MX=sWoDw4_$o!gq6O9p_FUq`FB4T5$?D@-A+7 z-7Jg-D+h{?i}Q>9jf4WX>^+9Ulf11vK3Tg{T(Xa`VF}Ga>X{SnmfyrpaWyobjyEN$ zXyxuV@er|b%p_wcw7VlKhMy)gIt~eoi-Z}Z!?BK_7_g@YnXLwr5kOHkCgRMz2VqC= zmgwpyD)N7YRU8$ii-ZADa9S~vEn6KxcT~sPYsoIU0_>}ElVB^$$qt7SOo!eJtspy?^7!>A=I8;alO$LS!~hfr99lDu8O<@pRl zln#Bf8J$L}q0=WI1;e4?AYa}E{V2m7AllN#2`Gy*`%cnDG|n7NwZ2G24bpYw`NEc46d%gcElH4R$BOIF9&=iV&}PGfY!6@~AyYnlVI9@GnXRfj zCFsBv{!8ZkZe-PNw}DR?7odz((Qm|{5=SsI@67Il7`6?I-**S~F^hJT)S>IbIhqTQ zYTq9w7b~1F)_Vv$SS^-_(;wNCX$zz)wbAHf+4U0)KZ;*LorN2o;#%)w z=*(-)RN6%K+5MVwM#5O+?LW|#X_pN^4){eT-{t5oxDJ$e9U#5y=sn4G8eMMUOz%xZ znS0%NQ=*KnoHZRYvVuNqyy)`Dj7XY7?d>#6BqfoIkQN(2(eHo}sg^bi|MgfiREJq- zS`gB7tR#nf9I?NZ#~o^rbW*g zwe$W4mFlw2ZlX6l#`9t7R};%)}t8L>06?#}P)WgdGX`q))wM=RJ2QXXufjt-;o;mV;U`d*mq@ zykUfj-XbV}ab7p9(DT#i3S(z$cmqao$g6nhK;l(5+-xZ>6f^rZ_iQbBPo5jt>^+D| zPl#g))THe#CP6weI)>Ava*8~VAal92P8Hpa9z@De1znZ58|sj?scP1g$~-GHWYC4; z4G%|Fr@Czh4*VlVKR9Z3KWTedd>9;zY63rBgfEXz&6t1e8i$%j#dVq`lM+##2j3VI z;gcH>34A&2EuMl;a4 zolq;P-6XkBK8JWSZOkhEiTk$0^Y5myQ`7`A~988#2^>9P5q(&z#7ds2yF z_n9uPzz~h&Ruu1Cb?IAKw^|Ik&_~nZO_kwIz2HsHqBBhFWvnRWd2jUHyn$h6C|+^U z1dv$lTN`x#>gHCxs+Xl*RD!c!NRbB?t10ss`WR5IEaewKi2$^`lu}I^WjB(|yv%6F+&` z(|^*=bNK7o-|i|DNmhDnwVKrPbeVMZ9A~~L->Ce(++AS6sBmg{WrFVSXW3KQW8Ggd?=H!< zE~yc7s4#K=M0>Q^_^@*0(6yH;nofNSq=ZbIQE5qoN9zCE2ov`$Zlgx4n2irL99gWC z%x1bw_iUOH|6it*g z=s)IvIQMy|hl$sCsF%XayW!@9KXr%(w^a6lS7pWS0+yO^W?49MQ@+ zO?hr8R3O>gh04`hUOW_HZ(%m`E)SP|B-z$&{u?Sm9A`u+sqql{ABH1%UU&$FiF17Flg$3|8O>`n`;COa=$o+7iO*;SBd*p$c(rYU zxTDc8jA9u_qft0`_fSKzIoheuV+4X7Jq*{;0k0xlas<*C4QYhz4IycC0wW4B93W{? zNE&}>6gPPJWjXiNb=E@SovCnTNCr?PS8kQaHzi) z$GoV!-OpH!lfbS>n{|3jZ|i1EWgWHbso>p@EmH_`#Vu^ zR0&J}8ew1*+y>9D3?5{O3`_qSjfjB*&##OaWT^y}ei~?-+gMR-SypN`t1zapu*YPX z;e_P_hix`%k-pao?_1=8zf$CYw=Xin?(DP3I_BY9@bD9>4mi{$* zz$ivMzcO-QX$D#PX=pRRcmwh-Z_gob?;&rINZzKv zkqVAa;P}7gZZn(zYwnP={?FVYN&H`Phb;Y%+-)Wi$z3y&&GKIuG$d#wSfbfAA8D2A zCUp;&2vZ7s;=h8dSc9xQ%3&1>lfm%?9J>cL`f>ukB`jB^eyIO?z&^2CI{eJ#Fk@iNnCIp8zLX~*$Vy5$GC`?72RjxzIDAOR~gT$dIP zE}|W{UMzvjUK(8JmIEtdhwUB%{6L;fy!81xWt*BOwzZcIPdj0%RNokQV`23rH}V zkKLUl%QMwwhiW6Y8s`tkk&WvVZDu-+f3riurpB--`2uW8g-x%)rqQrzCTwa5o04Et z;}x+#>_`X_4oXH2`VNqn0T~X+1VG9I5(mhxWwBj$I6!tGdm;y|1EdZhlK@!;NDn|V z5#)*(pB)oH!k#YY>Xe7y0`fc{g8&%<$UT5O1jsYXV%zNw0rCv&=>q2*eh)|uKoS7? z8jw1GOhk|?V%&C#2r_TjC7SIwxc%>N`>k+$Hn=?p-2MREUK+Xm*UZy#(w87k^$@3> zfcyiHCjfaFkdF~$0U%8P$;`YPCw&=^O@Q16$X$Tk2S{N+Y5_71*%J-OiA;_-X>~w0 z0Fncce1Mb%q#Yoe5G1mvDIljZwf@hu^!xuGSt`z%l`DMWR@-kxJ7p8`#HBX*aQow} z!2TV;{yo6{L%{wszf;lnhubL6Q#c!9Bex9!X{A~Q+L|t z0U-Yd@{q!Vu&O@%P9#^PD%*&_m3Rf30AabN$m{Wvm%yiN zqcj0RK#9!CfyZ@fi~_Rp=eX!|zA(SenEl~)IU zV)7Qx<{@j2@R$90WANwc^5P1Mi@vwwDmt;wQjhbDu+AP-wb>YMHu`x9(?IJ{%*9VOPS3(Q| zcQ`MKpw8U)KKd}7&K0}TiF#SNCh06OTh8+$)^{XhR4suxS3l>D+@$4NZef7rbm3`vUCqQ1ZIYd^i!Wd>8k`;s5MGwfQ1A1!1zpRn&6p@Wsm34KN1uBP->`vvUK z##)j#_x9WadmD_j<_3AQ%SGwSpRo5oUzKWmAuU8^z%!B=BX%ol^!Ibn)G+L z1^iKRkFxE~<+FiA{y&^VKfisvZSY*cz&^v^{pW6}ztb(>9`XC?Y{bB&lrGG@F@^4| z!j{Zh{s5+5g!9Qa8fm1bi=Jhc@0VY+q$sW2Z^b@3+jq}ke9mEJHPj;6FN59xKCkEr zlMdCC*ta=f)sw%^?sC5OBKgrSgBebX!G&2ayD#DnpZ)Y2=bZ29PhZd{PnbHL@EaTH z3!E1(@mi*Pulq-2#B9%;FnHoRwr@S}*=3D+fGmCqjW@c4ZeRNCh@yZ(ywSpS98o?)I9U1Uxze(+%sy)($f-Xm! zIp)sR9*Wu$N^F^qkS=Dw@0-@A>r!mHZHs+Fr;otuyw1$rblqvPM^J{VLHfVhTk2k5 zZA7Hl3?~Qj+ntkIY%oa8FkCaT45)D89F>p}66)soXtC4jJ?Yr1j3<6vpL!EJ)cGcq z{nGI}FOyFTvXz=D*SzkSm~#%`&=fQ=*x+@qRPCM@j*^t*;qVD;Xq31z+Y#_|?Ms-c z|9W%eja|oc4jRl^ELpDIx(feQTHZN9n^$QATl3Cw+30Gm`-HRVI;A+KdbkB<D-mk^}Q>3`JA8H)BmvLcv`$qnRrQ+3vT{*RROhJPYg)=_>x1Q}kxyLH`+jdJ{^?yok zKTLS7yi{7R`nki?WYw z5|c*UKUQ67BS;-#Eg5y~G4v^)NYH7UDXn+@I`}yzG1BrIFJ9WY$X+ePrnRcZgG6|s zKQAFN?q@EzaYUn4m5>}5%(|Ug2WJ+<=Y;L$*lKW8tMW_hYT!8W`>HtZ^;wNe1_O7a zT6ix5e)-j_G0R&@=y5olqDBw5}VW*LQ+;y<>95Trxfc-MwCX!|b=|9w3*R>E&~!F%0Y^RL+YH}Q+1*SRzG z46?-x=4E?TecA;%-K=--D&3$5Yi-lkIDUVsh^sFu{C%9(pKHN0c6$dO?vD&DP)yzx z|14%^`v8y1O#Vu*?%T0}o7*qrweUwawWB0MzawM8yYSSRV~G#slBTQ7?{czTzI&-? zrDIZph%!I+u45|j7F+c(>3fgS)6N^B*K1Bj@2mPUjh8(}?L9#K%`%y5y3Ff+tJCn@ z^vZq5t$Z2Q$Spwt3NqHcRmnm{x%=5KK3v8odAmKqh{(JeWN4HO_-;9v823slPQitX z_r~!8sUMA5uT>N09n`9myNkyLUa(!kU%{uGL)7i(2{*!5toeCct3vk7FrK_I>3RKM zq1fPG9Fd<|QdoL!*z*}g5uft!#a07{D|>5IHcbCMmBq?M+82F6akG8NuBHAR_=CS~ z$#vCrEMXur;e^X2wmW}Q!}?AhxX5=%Wj@e(IC(>bHqfoa`4u$Eub%o1* zpDx_iyB@_>EOdRn{f*A;*7`y_RAcnRJ7*49-QRxPPyJ}n?C##VEk%|`()Av^JGW!2 zR_?h6IlI0X4JPvz^E)1q*co!4?JNRbc%(gWceq*nPA8ymI9NZpcy2rA-BWM3v9G2n zIa>q~u=jd$UY>40Q~%FjyAOV~`fC?m{7x%-Z@|baz8&X|MV|ki`}BwE-z=jEB5Y1o zu5EfdchtPzCUf#1*#AdHqO#PT3QI)??FTQtF=511YNKH0nXkk+;wjWi+0zT}~Ir_@c$jNhNMIiRcJY@9dwAoFIMnO3rV&>xmY zbX+lYmbLqG6t`Azx6aX^En>I-2^x^u_ocv@bPjKXirR8(*Uw1L6*#XZjr0^e{6ccc z<>I;L_ibwANG#P^CcVL+xHnj_j$c=Xu+x!tbo%^U`W)MdHkvr9o>&)MThV<@qlf#i zFM4tI5XgRC%^&VcQoY|T>zY~l%E7k}L2^`n3~uXeb)x6=Di#q&_PfUM0z>-C)>qw? zR`QZ&B1)J3Ca&xvZNoj@#?B1V*gU4ljy>voXV+~TG4&xchn(6I#FV%;>OQ_0lX$%` zmfq~@`eDh?j!>K$ReJFWPx$!!7*CQNAKvc#Liuk2e&*s=ztlx!cZw~%C{3BVCj8>& z(IND<{<3)1l~=0K0ku8q?q6AMyT-krIMeSh^!DlMrE*wo^0sDLIPyGtMN8bGFYr?! zOSWiAc7-qN?(wt0=xf_57l=84wut@@+F3ZVx}f!>xP^ba>fBg>|M$C(G*+*$FYrA@ z^JyhYjMf<*YG<}e1bjSxla?4?F!AV*@=DDv-xVYN+s@OnE5vNdiL(fAhD4FvX1@vj z99{KdIYQlCoM?B+V9Uo6sZPSNNyeYeA~D|b>(>3Po(8)ET?F*E@cHHX-EmQ5vF5mo zM8@_Hc;=3+Juou3m3(hcZFQN^)wO#bQzGTHGJBAOZ_;~z%?N-2#`oHrcEXq3XQ@_h`ckfL3T=9z90q5BOHr$!egrCI*qaML5W~hgO>UCKc8?Zd*uQp7XIi?QH*YX^uzD zx#U3e%G~iEMZS$4oTm#HiEB+g_y0KjlYskBxkmc?DvnL(1eCw`9a<9nwAtcF_ZssyTs$A=q+ z-Je*F&%ML2%?Y|2;b#qL)dAf{Q(_zGbKCtRBAUlH-skQ4=05MD+8LR{xPQ)U0r)#{^n zpL5iT|68>0S32V=m={vEo_*iKzxuWRbz0NVX=kC>V=n8)YAweUiO2sY$d+MFTFRfq z>YTRk`Kc;1@a_MGDfKDlMM`z&OyDMe=g`MOD_G5fsC4bf+FlTha z80{78$%}~TKldUmmi^pGratvImFNKyX?s`2kQVS(wF^%C)wmuUdhn@xLf9?5$}=L5C6VuFMEsdnyaqrwcC>KN`aMg~2F@8(p_=PYKiCLABtpMm)8 zVT-d;F&lLwnxy_Y+AN`{Y`<3W+%8ceab4hEs6tU#v8VDH8*9fkzfyCwgmfJK-*7h0 zR^|DXWtfCoWWU(lWJlHWSbX%oU)-0&lxU^#k|fMTR&XrY;;^R zy6)eS6sR&^47|1CF`upFfavk|>6FQhcVn|(J$7X_4QB3wlP&TldvtOvt2gyZ_B>N8 z&5+&fv{3x>oZ?cSaCm8UT|=3REsa_ZqtT)18-L!s7O!<*|7HjSSET=PP`<|I?+Y~- z#XqsGs9Y6uFLTx7*=c+L>FPXPI|%0jg6|Zup6+$xm1>~uJ+Li(=a(QZGqKuT7uR;) zbSV;1pYS4_xp4i~Ve}={{xkMh6x{7g9M=!lo$1jTXl(dw3%mRnG@n=N>Ra1JH>o}U z?;ye4m-Ll?k6KG!kfvy9#hEJ~I68K^T1&=8UlT2n6Wx`qfoW;cKPKEBb3^)Fd{#nv zPm28V>fP0U4y}ZD?m71?;YM%kqon<0X&5trMl&{Bs)hw;Lx*(sFSg@&`F0@l$BJgB z8h-R8>vgN-uDRXJplgF`Mp1j9z4aQ0e2>lbP*eAiJ1}nb*Qu4M9U)R!sg|PQEW6kO zQzOkw<2mg&7u~FlzU!O-zD`$Ve;a1@wuZj@nE=b}@P#9Ny2d94u{$C9Ia^xFh%4zf zf~AiCMPBf!JzZM~2sjx0SM(-x?)m5LT75!Z6n_xNU$Z87MzppX>6d;Ri3I`{*5B5? zoF;xwg=y+X*REmK5N+YkBC~t()Z*&W58Xt+`K-~YvB$LS;w%5`-B~7JY&QJbvu|y` z4E1Mxy;w6L9(`+qGTc|T8GP8B?B1&09=PFy`A9^CObZFB8ao;WyE~XCYHJ&1B4m3MEAQ>k|HTj4(H+BTJaGn)V5QPBKhk@U{btjVvo%&}2) zXxxFXM~4;$hqtUZh7=tzI_R0z*GdetIfN+PNv_c*wXfC&Oc9z8$J{pk4|`N|_p@{> zjk#AuT{WufRo`r@VP5IHzINWo$XZQA(g2x?T)usj(+`YFT0!68^LZr=r4?a8TGm(l zE9s-P#!w&k(qvaj%99wyCUy`w0aDkhpi;deqSF&CZv@2Szz|dkrWH^A}3GdwPZ#T~)FR-n;hEO4qk( zk+Udv#4v5qDWdw%9b3ztzmzj?WzasqI1(i!^C7ZI;cH-Zau$x&mwaEy|J2U%XwYQghUth_5h*vl06YunMwds8lP zOPHtk&NqF&v>rh-9kej z9`wAf;=SvkifY^y7V`d2M@c<$A8FI=w{-##;?)G4IolV7?f}kGQ{i3T4Ij8Np2vT&SLqS`Xu2OHmbt}BICil{Ro(FM>zoE%JVnJK_O?`h1Z~M{R zSbc#I6#Yo-P`mW0*2~ca?47k}x3lOgSKJ@&DU3^e+D9kN#UvVA0 z$D!(Rd8OL3ro+&K-SeIIA*6#(HyX6ovP+kho>b9l5@VZWGOg@IGuI7j*-iOAmk}WX zR(tCQZOq+?#LJ&Pw>Su%Y7Z@r*2wz7EA1v8sN94J{rh*CP{FHX8b*gy(7CK}Q!UXE z*VHe#R+}e=l-mZp4(Lx_?X=qdKeH{8*23b-lY9@SG&ky^UufbURcWm^eCcnY#l6@W zz$5iksPz32IkcDKRnezJX{y(7oM6rI?2Kprj?ekre`p=QupTB@SrMJ-AIEHLHICAB z)KGJrZ9OdU-LQ7i$#vf<&f>V{UD`X9r5y?7(Fy_oLD4cr0%1sPE6~z;@%v{X%B5K4 zUP9ovN6t#_N{_#f*rPU&uchhrC{gRJ!eX@Y_tom+colJN*{dDzbYkqah31*Bu9{i- z-;5PC?A2*D31BohTu$?_jay7V@5-3w)GgaPCwkn%QtdZ0_}KyHl83YXgOGXoqm_a& zU!r_ie3tR$NuozC%dhS?snNtdQoSv6xUYslxhO=*@>zY6+#h)=?L9>*_EXfulM=}J z1|sCSP+@Cl8D?y(hucoe?RXV)`u*))YQ-m3dtYjQTUP8@Z1J2DQ&=$!2oAMP< zNuOUg{%LNlc|!hsI6@S=xOYBm~@=|Ws0|ELvO7~H+M z#pL`}I(pxOTntPPjt+r7yP_@0pl}`A-B(^;ZNVdnu;ZwD%0@DIZfGpH;noNi;80 zq`#Dbm8*>uY#xh3+F2C!a3u{Z#vv1=_I?`5=MbbWMeS2G4((Gifa(Ax$tk# z`=*yRh6=TmAbMLkUp}Vdf=BPRXg6-gNk<8rVr|48 zq)C&{vuZjLuj6GkVir4MjCtCwx3gvOE8i|oV737z!-bZ54CCk52m6{v)kT#)=KG=W zbTlFh*n!wh)GzaVlr8?LvH@f@QDa$NkX-jSvhwD7n5f(Q^97QpBkjU2<+cfdk$fJl z`>sSFI<~&h4%VCUXX&@c_%m4aNt8BC#E!c~kIf`TP<4(?J@3ARrEwSrYuD{okl)*x z#%M&&`9fjb5xw+2-xx%*Oa7D28_4!W!jkRHeDAxZ@U)LlSETi!1|V*j5EzR`@Cz3k z888?CDc}ICF8ZDa;0x@n|1#03w4?}bNE2p(M})gSld%_IHSmG9;J)tu>30&yx*}1> zwWL7Q`e(pmUkeg6Ri5#;)oGQ}W=`7;l*-v1I3T*3GacX#`CUJILQ!Fq#u!9i3pHW0 zp04!KgEU|I=1+1W`~5gZ`JG^9b1?^n1cw3}yan1^b0wExn2m^dk?f52{dUJ)mdGtp zsqC|UT(jebC?$c)@ZrT5Z5`Jga5;yMA9#|P!81mle_l6eOCbGf$s#McK(gRrGq6&G zxwT5sUQWs5Y->|Whn)XIC{Nuut9Zn-Y8UN26B zKl=Ugi_iCe^> zepxIJe9QepiM}r>_7L^nuQ77X1D<5zol{d`&EIdoY!^$BD$>zBT7+m?&69EZizMfm z+bu=pHU_`;M}N%?MJzs`wf%n7>0#9TrgfZ+2o4YJk2t8hC^IfHP|3 z01~M0|9awpUV_O1C#bd}DjzPbDk#iYG2;b`82_LY`s_EbJpaYFLlu8N1$bKrovLKd zqX9(gI*T&HX5>~nZlbF8xOT9XqV$zx{0+~>c^`SdSm}gI5Zws*{fPV0*6tDdHd}_; z<2f3y23R`xxA)eAD5=pJ5l&2$ixfzIL=JcWzzP810-U(8?Ff#yG7oiA&uw_{GSw9+ zdi2eRzqo?y3fWx?S3fjcB1gRmmRg@|;bN=&A{jokAESFQ1KH}KH6O7Y>2<;|iCsUM z2$vFY>-kRjd+K0LQzgf+5S&q{8iNqXQ1)QvK0juECFT6*nAu6v3#y`JoY@Lp;1NH7 zU+b)na(i*!z)Tqx*bd>0>{~^0MwDjMPIQYej5vX(IOYBYiO$p4q(9%<%|$Npt2^Mm9ftQT8V?OEwD+j}>ETvpbJ?QPO5(p>Y&G#cKN_?Y#bsWImbkjXho@J#{>)=Qo^^Z7!Q8Y?({rC6- z!B*I3QGj7`!}q~J+)p-%Nrw6!aZ?Af#%IF>eU>#>MEN#Y(5992J?X`7ws@=Xw~=b|NJ)MOBU)iaA}L?ei! zs?oIQx!2)!9d@$x<0`|*el}_God&B|2}}BeGu2#qg@3sy9rXWSDX`%w1g7S9?2+u_ z%M)nuJM53*O8HWhSq_i`*@+Yo-rw4cku;S(uC>mlxGu-soMhS^?>6~3y(661Cz+zi zB0exGfO8i)au*u))yc!ZwThMx@eAQ|vbQf{_FNi& zJ|SiglBE;Uvh{X(T(z+=o?4FJ(8<-t@b;=H_0BQMw#f}u9?W34g>FVRK*9hfp)V(4 ztUC=nouL)<91*P=_@PYt2wxa>cHNgqkT*2&Jo>qnuf0!@Z~3bgSwWF@+4h`$N(4SN zxKLTh>9Rc0F)JmD%J}6c%BlD7uPw=cFd&NYg0mz*Mcp70Ga(cmoL%qg7X*m0PthJL zk|YbWKmYyXoxdbz8^=rG=jCumyBA~r1Y_Dl^IS`|j}48P2DBin+O#EezifWNz-S(Y4 zSBC6Brb53*v?};T`id&Ef@&m!E4vv&v%P+VJ3+kacM&_k!SrOe(3NB31(yZ}8>3)J zMnVO}QiUviXtpZ#BW`*gMt09oRKrlz)2!6Ra$y3pT#8c|gOS(C?E4?K1!V|?uL2+( zu_r?Be*}t+(yfqCkCM==o|m<1c+NTwc% zB?^9vf~hdF*y?(Cv2FnofSLI4a_cb~p=4y%yFaosApY)OO1gstUpfMS!1h~`xhjxx zq3fYw43IRjPO|87Uw9eZ)|FwRzFME)eJrXbB3cm$%93CVJ%jBZg9xC%|3Xhji1&dE zIwLFK+{cP+>5lyNv3mC_&cVobQN=9L_p73jBJW;#kDV;W+(3j6=bmc}ie)f|}0+!V4xo%`0lgcH6-%pGu`I~j_R+6>wigPWT>}`hTr+R-ySy!mewZ+v367J5X}ksP(+xj-2{C)zey+1 zdF@w!EfJjcnS{>G!MYZcoGf$MgT@w9vl?18v?FEJGNji@lS~=`K2q7s%=dw`X-ng&JYc3zoVbvrT zx9RSR@3c~}!HJ^+JN|HD1#tF`s9_--vqPa(Z!|(BNzE{ABhk0Ml4rVE3z)TGR;|QnVzLVDZ z9;1*k@L*5j#vIU9v9Y;B$mlXM5>7Ar&PsGe*mYt)GQW-|B8lh)7Nr&Dh>L{Uo}|~0 zxl@QRK(F~MGz-{f#Z$=iHWu`=Unm)4FeS+&DmMp9$6Kdwg}X`1OYt5ROGh@&pWt@F zE8sqhgVD_*G5B}~uNb$g1O`byOTdz#^EuCs9b67~6{;QtU5`zs3!HqnnIz;vAqppZ zIGqwC61{N|tB-;8PN&^pNa;e>>E(ZIA#6RrI7x7S`eI}~2hLQm|5_yv_oQT~+j?-A z-FxTkCxch&?!g}6;Wd`bUen_ajkX$fM45Xl08E<#z)u^;>1fZ zwAAi-XTM@Bkz-G@S=1QqA$+%%kF81>&wiXgxcd{q>uydV_FRdJ4FfWeuz&u}OH1m9 zJsGg8fOf!vhu1PB;RNSxmSKaM31KfdY(INZB6VA@e7>Q8{`!%2Q8&F5{?wfjNrVH* z#UhZm(A)0;8elRtI=;8gzy4m{?RTNqwe2H=^HFR4mK2G@^RCBN0|_&sPmktU8aaR7 zG6{H(NI?CmXn0uWU13yDgTNi-8(c{pbV($jE5CS2i8YTql3$qejlC>|fe6B5(#yDp zp6=_~M^82)$)HXXAbl(J$h#9zjBCZ!YK=zH29j7-R^1&W+X6_J|ZN> zZ$8`U4i@VLJMmLII9x6%PGQczw43tKN&bybNkw~_p7v=c4NKO8^!p);^Sx78U{wiz zFf&FTqvhk~GiOas3lZbl>vjK=W(mmXYM)eou6es7jEbIpDFeSxp;l=B3fc1*EN zsx7T}*1r`k($$uQkU`^nFqt>75@_BqjOw4i%Crb%3O%x?@lRc?%hKcy-_9Vb^ecFO)Bk4G zz1_=hu6+nvSDO$!5mp9>hu@v3qAl#>dNi z&3N0n_w96ZS>?gBBwvMh7GtI%uF4AL3Uxae44o?_5NXP61U4VSGPt+5ybKa`AdrN{ ztJA|*TB-z9N84vFet3miX2uNgG~jIg033fthBzgv4$oOy)?5H@Lj+vga3o-i(N>f$ z`>*gJuCEx$TH$OSQVMa(*LNm-01fG3B)TM=sM_hKVH>0VmG}EjI`;A10zbW>T5qx{&bl>O2o%^vT!?c zo&L5d`s1=xa|{F-M*_JWwOPqBdR9JV*d|A+$7n1ifl{?Vsr+J=OEpJc(jMzoXJEbW zY_k$&ETRfn2-Z=%r1UD@dgf(*4$x<4@0!Xo^1cG*!qwnA(Ym472<*N;CHZL!U5Mx> zzykF4CzOTvS15}oM@l?Jz`(`*0A5`xFawTnck&d~Y5Ln1`3)eLbh}=478VTWZtSVg z=YR#U4)SKH=IF~-UTDXU`wpbWL!kQ<+U;_Es1LPS2{Tu?c)m!6)YAbO9UGxaLC>Y92;Cox5&gyUi{dNZw zRX8vq6qzheKu>0{akoVd%Vg+v_+C}?^yY0#k!z3RNUw!x`WW?+LxUKZXM0#wxZ zn6FVn`N;7BtF_Vy%-k~;Z3GDNumpB7&+MiUIHSUCV9g)bPae z>Sdu@bAINv{i=A)IWl}hkGh%mLaF%!eKSbw3SF)D;6=IaZtQV=(F?5l?3-eut_~~e z=Dq@#GR?k&47@X~-h*-)?cK@adMa_gIDm|s(MkGJTaatJHhRfOrD>WTV7`{Oq3;P4 z`&LIUVMJ%9f-bcuKnseVs_(+w7}lN7T<$PW>K!iZnVO{obb+OO>@JM{+lHbEuLquh(y*rkrNm7h>uf=z&d8)}A!f%5x-c16#)7^D}K(_2Qs3PV8I#A_+T>{w8rdI&tJAgSsyM{M_nG;C$9XI>(ORoT>-t(je zJbVCME&wY+hr>3knVPSoilM4I@m50z92x=c-!pHanh0#UK^GCfhQi=Ax?z1%&)CeV zGZ;i;ATC=eA|FDD@L5DAOV!+X$X5F9R`Yp(Loynf&vstu_y{)P0>Zm!i`~FK+e@|m7*D?x?3`p;rL4*o7G*qTYPqRE5 zeNGdd{vhxL?GkM&wua7bP#GztmrIJ$Kg5-Zd{9I#T12+89dy8D%@`5bOtUJIO&pCi z^w14RMcjSKvpOf9qmYK-Qz0=|SBRe0H=k3MLfdKuJM+V|DS?vkkLEyX~_T%?IFI9H~ zBLahokh`nUGIq91mqPYp}5mPx3!~9bY-HH$^dkv>sL7ke}zeYN93=oe)AB-$S1m$O4GjN#VV^17Z| zg$K=-%R7wCw^#Ly%h`0T$Lp7PJC(faB9h}*HHwgxpt4LM5{gl)0dN;fIQ_^80%dQW z@x)CZR9RMu_V$J}SN+{hsL=AMSN+YL_qzj(Apk)1S}$MrE>qoUi^o6)M(Jk^*IoNv zldI_+IaiN56vAA?P)$fErF7O@i(K(|NXTQyh{9|62@LMYdF-^agVtv2s>$8->zIg8 z(8d(xc~2PccM57SB2a??aC4=E>1k#ifyyFs4}4IvTH2~zZlB3fdu8#EsN*a7{u3Bi zf)h@U)luE9XYfUyfv=gUkQMUT)+=G@WTfDe4CY{ zgB;&r4gKo=)g4UI%u- zQkQx8_sQ5?y1hntJ9(>kbJ7T$FE4GqZX3^=E{@~vAeZ%o&6ks1CC!l2i{_InaciA{ z_a!b7xZ|65QBvHk!eRB>78@)(x_B3cMImpTp!OKlTwQlFmRJp8M(l^=FS26QFuiJ> z_URIt&v}(vc55s7H7P}-@tKh%FI9kFFUy?&24iJ-c;dzB!`>DJ&Q~fA!{4*& zDQPu6>VsJRa8f+nMc*~(s?oLaY(Ltb5Er-}o~P3Mu5-t$|6MS34aCUdo>U;4F4he%G@D3E)hE&tu?SS?3{ek z%Gg&9hLnJ3F>Xqc#d!s53rhPwu@>z|_a6}`eFvh|3}DKK`%~c9&331we%RqAg~9u$OrHH7Udgs`Df_2AtSLr6@G?SvMu(NVx9L3nOuQ)$_1Op z?({I$%yX(vB(#(BBvrFiF5sChL=WIOr7oG`(!mNSMU|Kovh&JK(T4Ja?RFuPyJrjs zJWJIUbBDaab0;5++)8fYjoN2KM@Pd~F5GR+oc1)|PXYeJEd(~MgccaVGzPO>!tM)=qI)3KoUIKSW#_c2qLn;7o0e##Xw^QtKdso;ucFeGNi4{~s4xD6ey!Q2cog_~-Gv_Lo zRZ(T-ODBrQvxs$7=x{rtOFo}G5}$)&_fwJ$=Sapj4FAC5R;6-ao&p7iL^wn>vij#6 z_V;NvSKVwvDeKc>JO)WSLS2OtxFqS36{RieY&d%I)PzBU5?vg~EW`@Nr~>nnRw#^l)Z1~*4xo;2gD-A@P3*ae74`AwP(*rlmjGCb@Mbje%{Hjjn3U6*SptV z%>{s$9h!u&G?+XCZ@{uPw>f)7QO^-$gDR6sl1{niM1nO`X7GztCx$CRGiFnSdGOWJ zraQ5&st|{P;&Vsg5Ld+@IlQP-kz8FTmG!SP1tOHel5Rr#pM2IG$qnsO(&5m?dF5zE zg7gwoO>Zh~wb#Fzs$`%Iv+|`Q%D1bKQ&=qvg^k7Mq`^h;5D$)`rFhP-OR>Bgw|z1+ zU%G^zOj*~dj=myy%7V?a2=Sis(uN;IgmiqFmx=cQxWfAx8+3_rysSDj3-r!=%n20{ zMzYT;wz^JTHD>rDH!^HSKz*8W1{xE7S6C<`=^Qc)MI?~8-V3UK1>F;hBS28Jw<90O z_2PijOp?$E_I;4f1Cl1!q|ccwpn!Q(c+;IFv<5Rtlx@H=%%AwrCb zRYsoGv%$?+To5OH_zj=nIp0x#m=CK^x`JB<6N2kQzn!msBTBFs449~08PAlGl+;W_ zAn9^hvl)KciFAQ9l*%OGX|)(qGW$CRQsG3_T%dy_*)*Pm!AxfHNpKjRA8r|MofcZjLQVNVMcv;i z!@7d#!7TC_l@tjq8%ZvN^6^C~06qe_-%Nb0SeO30rVm4H|>IkZkau70JWtoky`b{$^>kTgvG7VqBC&T(~ z9?wsn0NDaY78aYQ3THLWXwbXLwO#qi6W=i@R-c^AFiK0ACfBoq;U-2LJ>Xr0uyaRS z6^hV83hqJ?QcM5i>7zUQ7jtiy9(_je@sQ)h?$9KC=fCaJ+8GWO#65bOmXzAPgu}$d z9EBb#qj=}wwK6%bg+#xG8|(`#ep4#dG3$pxelCQ)6-=m@~){AI6w^$ zStr`|E$bKy+lX4khp+spr6VAhVv2oO&Zl1hzDS++Y_>d-QBgF&_win9o7^-3G%DNv@k3D@p#KKO*+D?y?HJuupQj4K*?ED$i!rjP2qlU5 z@y>-;kF@#7+_As2kmE{vTutBu6}OYS1kSh`(+4VG@uOc}2W@OmUeJU9PIq-e+WK$; zukOY(C=__3Sqgwu!}V-*+2gG9O%RUsQv^2AvDX{10?y6BmfQ4yd!2soRdUgcCHGf7Y z$s=Lu3EtlxBF@IQLv%eJyRUhGOg;zOJ}Px~&Ks66Tj*w6fGZz{g9e4wDLE*a%9-|v z#?pn|42%K+#EzZy8gXAM+hkJ(j>v5c#QQ)AD715jr z?5(o5uDQwtJV07MyP#;z?qLw~8Rg2Qb75gvaw^J4PA0d?wo5 zi3RD8z-$+s#+g)I+(@x<%{lc{ryV^@nJkVn^Z^4iO!NL&j-&D3FJ`fw(Jo5yfPnB< zn&fQjjY-Dm@;q~PGIJMLg;Zt@+>T?qsh79rtj0}A#!K&TqwsXsmfp9qTPbIvd}giB zo=spOvS$fHCXbxII#JnI$wY}}tuOk9Vbz*+Q-IT)KYgH@$pl$oG-PU|K zcIaF_HL>HM&||fzo1n~}d>?^xmZBaRj3tCpVA5oZ5bol0>5`NTo!QG_`92=s{|P`H-KlSlbW)xFm}ZLt4`E$s_4TK9D`8@eck73)8MB>a zPJPeFCe`2C?L6f$E=X$GpB-%V2Gq>SO!5YtmnFe(_bK)juy;76(NCOWonkp*y;|?3*_-is$z!~4A$$^f14DIr3udB>C?c!`+RgE+u_-a z6I#1tJd?IXH|v5?`#TR&nCRVK z^0%>Pi7^Xn5BbG`aSg?}G)Y0KaxAUZlef#7=J)l4X}=yvX0&Opz{xyp6%%NI?wTcK zf_2FA1MbQ602TS{))4Qx_s4!iC{d=s$qj53ny86X<;aZd-P5_C3>Na)O?W<}1C6rXWhqi-&wn0e+(Vuog*+EfV9bnGEwQHj^J9OWmZL7=h)f6-EE;ovp>JOnn zJKytr6ri(2Dp zJEB8NsnSxA25gYasioHVCwqkh>CBi+FJkJ8n~&ckR4`k%XKM1!*E0s~zSqVmRCTzr z@5m0RwU?RDUj1AL4?3BNWf`m2r-XlVJMpk2nb#cQQJu1{YtPPRm7qT3)i_(}O!Ke3!n(rlE4amVG}SP}abrvj^tpK}1S zbFw9V6%O0Oz0G9Mvn6O-@EF>T*c`GVWrw!C1wwomVS1`F)96=3_zTU@$dW3O{rPzECgT@z5NjU~fV}ELZQnR+mkhz7Rw1euZ_kO+wZbzk0Jm61&?c z+E51<$VgGYb3G%ERu}k%F{j2t}A zx)4-zt}mvmep7sSrlFzTUWdiP-M50}+d-`D+knM#)xT2h1GGh&fc}9MRqp}fTQ@^$ zOozmd8;Hrq(u&G?htJ}11+1qwOcmD4x}Ftp=oXjlbogghyS`I{;oDxx{@vlu2t2oKF<6y8tqo9VnIO%aG&{Qv|;VDjv>^xYkP_MX{>8S}+WDKhxvy7$j zd_P7a)yTQuRIZ+Jp)L#hdAia*qA8N^=^f^%=`9o3PPmj7kR%GBU7xUl!$v zD!aj_iW(l#k$8|xJ7GuSW%ogjN;n#gP(pQlD5D0zEkk$1qCZ^W2_)Hfo8*0hJ`?9@cE>6VgTKlD=55(ve^DJ!rVqGXqV&`f#zniw}i=a-_ zqkvRN5_Ixs_EuKEITCzxvnQ>EV`5Zj#w~LtN7W`P#((zPwQ_r)`#anl#t{+HCQp=z z-{gciN0t+59Qr6aIvJbsza6`jA#DjZ`xNvVrP#X&jdo>JN?XD&Z~9p5Q9wE?uU})n zl3U_s!P46%cZmjfWR7zT^^3xMf=?|rJaRZ20H~UEd^YISd96K8`n7zk;(o%*V9I}h zPEj}@_YSLd;k+J9sD*Q3gg@==5T0xHGPdgMdh2zwY|Q{t`wf1Zdkt;boPpmCT|rxc zr(ltD^`h!q0LWoi$&4hr$rlB5}zfj)lLUo)i~18Ojz<8bOWje{3A&0iWRseG*d;!mGg_IhM|L=?+8&5NaZ zKEx-AR(p>Z=l6cG1)#z9W(Mebs99a>G#z`$ztOA{(D0u4>kYHEw2KK@9uC%>q`IVk2*{wC6)Sz2>JwGQ0tDYA89J10y0pj=uvX zM|X#kTbVTTS)v8`G@+P}1Nv{h25 zeV4UX+jUgsmEE4kVSuu$?XP(_z;i595^*^E!jXl)PmIo=%pUJ-0CY&`nA%n5%5qW{ z_=NGL7->`L6Ucs~8iJv}bkgnNXcZhXqjbH+)lBvP=HnHkpwznx=_L9m?R`=QiI^o` z&=dOEMSVqFH-3)Ok+&dmUJ{ zvJ37;a&DiUDR@n~rgp6l;g-Q$gzK}e>=ceWhqvqFfnouFf!r{3wL~$@hy1B}rt1!> z#{S6WmcYw8mSx5zBi#|d#4D^QxEnXdXN~b&X^>@3x3U}BmTlQDt2@uh;c?Qxdg~q( ze#N>i6Lck@cOPqJ7d#5$@gFGc;=g8KFFT}mv%1?Qa7KF)Ud=MGz9(bpgzbo4PwR?T z)u8yDc7En;z-Yu)xp*g12 zNLf{pLW*)^Ydn^5v_QiSg?$yHqX~f;ho%xz401*)*2OJJ5;v`EHJCd+&2xbrF3L3* zQ~Hs$+BjY{ljmi9ckzeDFAUL|b;p*1FnVANXB+vm^z)BwF* z{g?>Gsnz^jzR_U+5~cg=S2E&`=0DY5R`&&(mDE9zNznTNRx$tZ3Za&a(0n0cMgC{0 zM`%UVl96){)%y>HVmi6hJ&|+&E`506hjIUujdn&Gc7J?EQvIh$7kW`a^lCRgQ1A-9ir~Jq-?}Nxg~a)vDzk2&BKd-Q z#c$r|zVe#Lj^q9&f}KDPJLk{vm@XUaf5qln5exFd2%MMsQVJ8E1Qu2T6IWy37gq+(Kh*Rqfk~@jfdaRGw5Uqx_@A^Z1`Tfs}TC z%6RXK;kxHaNEf>o{sQtdWe$LABanys?yuY|_mgEML+0_I*FXFtmyD#(ydseu?LWLf z$Vvv!i~Xwv(J{BIWY|2zKL|MkRWmz*uyz3tb$Hz=_wbdFrgo>?gZ)=707znI01(-K zcmaxRnnA0%|KY_rgz`$v3KOW-fm-L2NKL?ia>xX&{#0hw#@ugu4wte9%b$yyeZ&pFspgR{^!mq;|YUrQ)si(yMH^Bu_eRh6M{ zXPlo!puZ@qq7ZjK&;HOYsk=^jMKUY50$68$aeyKr<8DXE&ap~D!apBZk-1$mP=gbO z+Dbd!V@mX5NaKvf- z+P+%fXr%Ed@q&*ps##$k=*xQZd%v!ZoWIRe8S-y-#9JUD``xBE9YX}(!z8QQp2^3-!G&NuM- z1l1!@I}`38vm4FBE|~RqVy|ik$xoEyBCG$B zmbm!+G?Q=LLPCes_K=|(%F%u zV)VqWvQ@>NFBP?@UfYNRkAm7^+P-dZluH zug&&C!H3^?I1B7r-Dy|_07+a&Z*pcTNQ1r4Qu zx3%=ORInv%t&pOaCF!%MsN-;zG)cW_IvVP;72mOH#}r|LQ_`LGqiw2Rm>`}@w!{%G zXkbbpj}(xcM5l%$WAH>qcZdA;Fap&UXzVZ=%zX>l9d$y?NQ_%zi4%Wb9OV2W3HDR8 zn_p(v#DtXcgl(K-_1FC{9CVo+twCog&e{*Vzh&GzmFa6)SSvnCp(4GE?Cmf8LGWl{ zk{Fes)ic*HC^tAhr+kr`fPj80k=}j@9H$YJB;}iUdQ1JDSl(i!{~7^QI1^LDIy$o= z7sOCvn#^ZMsb*W@VmyVQZ7X@PFvTTQb9#rYF1m0#^u#1tH@kI|4s$)hS*jG)BKTJE z=gqNnz4}-OdEx3EdK_7#|5Cu3YT@2C9JwC*j()S!Xq_xcMjyUGs&+9>>&LB+hUdBH zQ@?V++k-rQLHTXjirWMQX9eZv3`psTz~l?L|}(#@^x^I19v=hPUPRApVJv=S^6OMS!$iTdF43xUH} z>io5Rwpz8K8mq>SI3>_eofe;Mxk%vu%R8N|s7gkw8`9CWyF;9mhrMf1mA8AwMKK z_eIzD+0OsvUwcz1)~i;3FHJcd)D|K7V&4uzhcN%ik`n$zKrt)mg&Fq&@;+OGMoDVq zKLPT-pc@(`q1O}K-?ao>g5a8xLndy8^-pZ&fincwe_H$Js;7svuw@EGesvIfXTm>u zp{{sCMEwhq{rk)hdT$e&JHG8{CB?s4Hv4v-T3y}SsTBY{bQgyQRs?v48gNR371KEulUJ-W3o;{N(T zCV^~$qGi%ddidxy)x!f{Q}!T(i)is z3Ha5YY`Jn?sxR=_I0n&nu(X1x>37>FIx#xY)1_>W^%+Tyttz5<1jjfV$JC2%R@Y=_ z+Y`hD&*znOL{V}=E?>qeVZo<@SY+~!$H`|=UFvd6d0OU$Q+nQe+nV0499P;n zO$N7lVh3SIib=4b*0oYe2UYCDSod8cn+E+v>sVbLSIKe5!o})Yu%P#uUA58D&q$0J zN%f?RkBe5oag)-Dq!`IY&A52WCaGDkN!wJ~5HHk7o=LWAqeG)ly!^4#ld|T0grlZe zXG%m^n6RRtE2RUoLSVV9>659BnAaw42{$&{V%x+D$yVphU+U}BX)_PJ;{3DJ$uAdz zu1VtZXxNEazcU6Iqm6tBYY@<1OMjozyXGtewh^JUs91m>h|xf?H1_aic&|!HECsH& zhS%N}YG3P3aP;cT%=mu5OW-WzpypCm*`1W1+)-~*|C9q>!2Jg4>guSzO+g8G5{fIk z2sgurCr%D0>6FYNQL%2V!79n$Lz=%`9Wqv4*~x}m=*g3WI-f&F-8kS`XPVVR;LMVyzf__65}dR5C&dP!l1Mx`bPsrV7g96KEXd4j0B1^ zkE+@l!~W4A8LC0pu1fN?_q_(_4;qkqVPM&Q1vE&{`lA7rPKOZzpaI5T4VZdWZB<~+ z^ZwN!Y+GeMWKif2hkFUPspaC4{!#HB!a~mFr~jx3h46+(Ztd+~74IQz2xj4n2zCDt zge5EUNUNEz{{vxR&EeB~4E{oRN5k;zEfj-)AZ!ROd35!J{{{dMk zc{IB1|3p@`75YDrCAL(OkN*p@7yz=#e?Ydo2f6kiklz7j0tH#`FUa6OAZuMcfUNuv z$f^$@=llz@BLK2TU*P==OQ_1|Cd#npf&Ygxo;;V(e^kiy#K?6Z`qyqU{X=v*unGUQ z8@5%}6;)dX*wM&8pr(IaN)v8QK3=>#XM}u*-@EmKIFm07orc5VAqs?3;osCiLa}G_Xi@T4M*by>GxO%=+auZ=bx}=}q!UkU6I~SiGCoPv6>^h|734ipB zJN$L=b=D^sx0%b=h?pBFjO!cW#74618z_!W;Ru9Z#)Jk*J?V$KkU7Rq0)6^Un3Nd~ ziVvAmi&xzdYSH+^^BVZWyBm4Kr<*>h-MoIZ>BQd&7n~NZ=c}$~%{@?L+g6#XnS~ zgpbU55F9PI5)l7%B2ZX4pE-o1C^-q_7&?KItUiI$*f(_sA2!yXghxF3*wD^ec@Up6nJ8rE_CEdXY}(#?Z5`> zS`8g#qs&TZ$iPfArRxgB8BUIKUV34R4}0QTbQ*D@hJd=_(Ir*&Nw@Q0JDxe@GC-neV^I>ue8 z?Vinx4AeKOjpCcX zjo*A^+DIz`{#vWPX|T4Lq+5=ega-Ua!4PY9gp1Q^y6fZWqI%SOZvxpLaxK~`zvVjE zd1OWb;vJr{olPU~Rm1lc)0QM9fcNz#gmnG&GJo7$Va@S_m-*}F?r4hdz08tb#@{oW z!is>)=z8R_oQQKqjyK^b!)R@@)dP*Icx>$^<93NvIMMtc^f*`}Ck^pN28VZR@ zA0K_&pUa`-7)9gCl9Qwe4)LYI?K&h8qyxhxnSbcaA1kly<$cB?CuqE7C1fUEA~8Zj zX_n+$Amz+HT8!FHz{Dkl*QE;`rZJ@68BSk23!GT^o_N=5^FS}og( z-Bk>!b)0BN$ib?L%f2bt$l$ZKEdU zll3Qmhy5Nq=o^h~M2oVZyCTDp9baEwPNI~ZljEQ;A>zO;8J(Tz+;6B9&2G$BXd=`r zI#5>ts(7T4=*rDrZAf(MVgt5kSvspyyF=)JSS?`^Y04Sp zz?QRS8XbGAad7-%#q^u%OJ<%{kFzAB3J_n`K|xLw-S5tcPpo+cvs3k|HjKYP#=*(J z<(fagU6ylr{nXdotWVss0o_V(d?2_4F-!{(%Z z*TB%WhUI#HG)1088TFlsBfXPl6Rp|!cTMTrs^X5Sei<%dgZ=kP&EG7_&Y6|`Gm5p} zp3l``;?l9K@zPp3EnO59cVPB8laFyY@hCI_R6WPqJ;}QDjZ{mM-=~c)iw&H!oB;N@h5dPy5j2BnYPzn~ zH9lTW9Bgh*&8%Fi{MM{v))IZ6d!3$PsyBac%X~F!0g?J-|EX%aDS_JLiAhCv-xAqv zt7d60!>6%jEL<*@wSG6?9|m5kBvdHZYRh#HVNMq8>B?&ij zxZ&wpCzjW7dqe=k<*@deY@hoCGc>n;teZw7fFqg0PHF~^ z4>&9hPZh7%tn^f=q-Muy)s|)7S(SR+RX_os2UOQU+Bpg4>lqyNy>w!VxdRd!im>Jq zW~ZSb_58-cSdIa8#9|s~PSdowcXUo%WW-g&{q4DG=))@FX*zc9WrA!<*!ZT7Y2s7$ zsm(b2vQU3|d%g4)!bhi=Wz%NI-AIay$urtdLDk8{wAyzG zhwIk5mihzA{Cppn;LT~`#5F{*bB~xhhL9jKE@L4j&i;)%anJ_@UFWcY4zjr=*1er) zKV;URX`QLPr>Euf+(YXrFo(8j88*Apn!7Uy_Ocm%CZ=VyD0%hH^_9+UgvS)m(#*=t zo%M=C0;J51xSf$)CAzW$xKyZ29GKz|*YO1+F!VpR-a06*<_R0c-QC^Y-CcqP50J$P zlHhKOLvVL@3+@^uz~b%>A-KET<^6qCU)@{x531%2)7?)$(>-VQoZX(Ujy+QE`mdR2 z^-HABHSR*grfdLb*Zp}whHGAEq}*nE`+^(C{;$o2KU%c^aUz!ZzNZgNokW_bBwmR8 z;3O0Ku>rZd>bpYb$Bz7UmA~kH;hwgVcqZqE^>xzg!Jen{8JpWy_wfgVd4tgRn>p}( zZ+nad8%9ZZnU3IZn6@=7QQWRVXW4x>&fJp_;0nyz!=s&2}7+<&=H%$AYk#p7-tj#>BR+ zga0##$LccfdE};!o$u1prV0ABwq{&!nF#*rNlCn?zuCzC>qZ&7+j%#0wzF;B*UE2( z8Sm{H?N+$ln{Uq+5gi9H;+!`Bj`TpvF@x>0_PnW99mNPuvm~uNG_sETWqjlx2?eV&! za@|z=qQg&`8?PZf_jTl_Z_l~Xj)eF#6aK3AX7U`6&+4KD?c6lzhh>5sx63W|)3dlI zr!^-d`Qh;(s$a+p_`uD%`IW25mhB!-1A~(d-^E{GpB8U>rU%1n#DCe<0q>1|7S_ui z4!XY|3{ni5J9DuQjZStS48CoQ?RkNhs&nva#COrndmgogTNiR~q)2vnY{7`D ztJmO~=-!ciR4LswF0J3W$z#T=@R(J1c}w^_ZpqR-)_RH>mGuja zt@!Y6hri|a=PS?IQ)vUMltuSy)cjORs3i+sb`g7JUXhN~(a=nnI8EoHCLXc<+AVxW zT`Rulf>$FOS0{bz>gSC$LiXlmK*<#tkWPlt?|H^=Y;=x>Y$G4_#jp73PfQD=JKn%M zEc%m%g$}|t@KP^gegGa^;=?D$dbi!mJPp1O@-bKh_uoPLzOwq?Uwj{uJ^+hsURn7& z*};h($QfPTE*xniUNpZ4#no)RyGUcak4xc)8Dq6q|m~(~2!<-Otv}TakaN~wLMl58LXJUnD zZLR4w>R9DZMZ#B2f#vKk<&QzKR30_ta>c`-vLJwf`pJLYf2e2g`^}2)GbJcsOf)uF zGi|PlG>vmp^ULOAI;6y4S?$y}X{r!>2+hx403qM1=5Fm7<(Hq5zl*Z-Ba#du6jY9Y zZFj6qZ#%X{ro40^POS1ih$(RQ<6WJBKP^q% zx6w~=O$t^O#N}iE^%LH+Hm&l*TFNp}WB{?;19>$YA=B(GEy<`0vn+srU?56%+9~GY zY=Y`&Z~Hr5N1-ZlHR*!0fL_P^@iS-=6#Vw4M5ca^;iat|81A$`ZgK6y|1{e$rurY0`(kF#M1d5fNagjZ_ z>=>;m2-E0_-umNZ`V|FIM2h)1e{CQo(pCY>5g=e7z)6H=(5A zVZ0v)8m@OV4Z&E1^KsAhEo(|eQZRA0TCy9?-e)-Cn!Hd9BdCaLQy#glDr1U$6q!?Z zgA?_mZ(oH%gX^>Mh_M(R-J0Y>i<)Y&I50Khb13s!=sP{Qds@4S-P+Wexo9Y6&@~%==qAA-`0x0uw7?x2Zv@$zZq@}GbwonLJ9SgwHFJ-)X)UF5eHZ7q= z$r_*GOf?TldE=3=B&z#}$~bz87tp`L?ogp*6lXR_jeNGPg+rSBQC{t7ZWAu2qyV9f z|D%epjqh4GQ;1j1=|W!AUcV?9X3Ay?=KC{gk!!S841_`S&tB1PX`}q$Zzt_gn`K$V zK^anrvqw|#-Jc1;lweoG>Eu=1uc73{Yhv^o7BcBvt)9CuobD580~0o#uYbugi9>L+ zZ;VNQpZllK2M<^n%=FaC_P(1{7=Z^&fWtJ7*p*1Ct)l3^e&Ks{1loE{X*Tsf5%6@f zLD$ZeMXqW39*n6`;}QkP;{Q0H{FrA1=-R#i37jt|2*Rl=ftnH5nnX`rXyP@PYLE|f z^;Rp%SbK-`KXFy&)~jP%LiTATxS~YRa6vgpLv0FdY923UWe`%(CuczjhsxBGK(dj!(8sMeG0y?7-_4R`U@g6N47>G zA>8!LRiw;R|6=ptYyc|P3jf@a;~O!omwohRCN8nc%OHLemBjB)m^FcXzaU#k^xN4~ zbZJDG%YnOr`x9SmQlDGtLhP&qf@QjZ5k)F9L}Xv@_RI!{b%~025m>-E;e4P=)Jlbm z#S+4iY^*0!K_3tWj>1At7b%9%87v!P*S{5Xi_oBk!RaK{Y8B>PqyRO1H2n8*TO7=j z0u)34j>;B+IQzWJ5p4h$>xPg1C)rWz0H^5k-t`}U_a78oVbp7;@me44=XMnk!EH$G z14!4iWnL{ZNm#IG1Q**dX;= z7~EI^)$4F#S0OE`KE(eeN~4&TcwYp#O&MmvE5V%pS;~L<&sj^%qI5ELmN_^jZQz;k z6WSo-i-tzl0(x1=Y2e|Ka5c)T?wP`;ey*3+5ZF;%V7MDVC)9^fwm z>bxb#+yjc?2C1zPjBZ9IX2m!_lb_n*^FIdRP$Z7D`s1g1VR>FHi@q#F-Mot%!~4(~ zio(oGi$N_SreeUsVCLh|b~=z0+^)gI^zakx5muLKH7bFt^9zweXvu?(Ph1h?^Zc-(*GO&^)2?l;nkS94}R}i%gSW~ zflYD-Ta~XG{?e{ERlHeHn;ZUjE}UA1eHGx0As}|;(~|7V04D?RW;yX%T^}|R%;7%m zwstFy29C*i?Hay;{W&|STJR{-QY0~!p0QI?SZHna7_BXzw(8oYLRnQHcPnLlQ|U)o zA`xOSRc?Lyt^m0Gmtyc=B1%UX? zr7Tp5v30KX;kQMBdJ_!3lTo}yL4z4b60$Ps6T2a}VB{)P>s)Un3wCxUq|`j7VQR!4 za%u#)mC)-dn-VcG-jhFrsJIsjlM*49JrV!B1LJTRYSZ78F8=f6K{4CmnOAT)La0R6 zDLa5|L(jgRA4soBz6{CqCwB6@W-Kg{8Dde8qf)a)N!CNy0r$-4l8ZIZ zSv|XI!I5dg2X=Z;H%)_&isBx2vTVPNYoBm6D!Y;5053=MHiiAvT1J#f;A!>{+IdhI z#g@_~EXzle(Pg;A>=c_4E=0>pr+mBpTt^~rSLte z-0TZO8z%rmeHN8lx1DE-Gbj#X)+cqj?2vR(4HN7_D z3c6(zl8vG20BuXJIlV~3gvbR6#Hw+M3nVy3#?%73!h1x6GE2!uIaPqs!R#{(q8;o+ zaa@rM1L;1{3MI(exRY^1uR?{Vx&>NWt=Lsg#Qw`3FCj(fPkt@p8WoP}>o;XgnAF|b zxa?*YEm%sOFcx)K%ZxFmaYYmqYnau8Ic9K~JmNH^8Pu&f#BHRKQ8jJy zU@A~C9AxKTJ5`yRWHuG+^9$e^c|)O^;9#0ly5_nul6VnSoP5jnB$c8oB?zIU3>48P zoNDWj28i=*5LCV`^8u+~0_!dFMSlPcevVD}RWYw z27CySD=bZOv%)I5gLUJ5LkGABZ?`e0B(YsFF!y;p@4FRIc(1=M6V zK^c-ZD+4ardcBOA_8u!*UR4cKZ6}6Ef)t^$-6h>($x9L?$*6^aeD49Z!&yGrs52bc zn_m($254`~P_|a#U{yAI6=t&3T?8n}JY^A;k@Hb7rW{&*c{*ks7q@Te(j-jZr?T*W zMDo+V28T(No%LxNG^+q=c)^I4gJ@l}fsb<%+GX{9SREC;S>N)Qw3YyhM)RrTKc$M1 zQ|c?9Y_1E`F@q!>tJ7?t#Z3^xB8j7VS&>B&kH@4%weA60^7IZ?>{YKfq)hf4sx{0G z;Bs?^QnDyRhZUyo=Wu~+T5W)_8eRwT^ENXgC4H)&{079&jAr6VhjVM-cfEG(7+^ak zgW9lkD$v^bS1{ZT+W8S0y4qzheNl$^^b=#8>OO3oB1mtc47qa zx|XrsSjfqYdsQ{e7pFVmEXJZt1@EG)cKTK&Sheibk8HdzUh9pF^1TA3v~{)dSR* zTw%{n3I0W{(Z;5^fLYhximw?qx}re=HAj$sZ>2h4XIV`*lRZnOH!KW4T6>ruI;(cI;@c>CoHPa6kPD1x)tI{o?=O^ISWUIBHw zx1(o*G)V%ECZ4DO$nQUxD7`o2g;lLV=rO-&WsOEFQw=2WX!&2Wasv$~dNG*6J5m^t z)9F}Lv1S4dCnBsPi@Ieiaqs9vLffMeBVFlq+!6fjV!yGaGKd>=g#CSHR!vRM+v@Qhww_@kxW3`$Xt%jcgz z*uILkznsp`R;KDs=5%}cJ&s?4@Ke>k8r%7IwG;!Eeel*#VbHrh-%h5<$-37z$M@Gd zo)6bs#NQlV?{?Ss&(=?kB|5q;`U*k#x;@@cN81gh?CkG1R~trNE`LXETi!ih@5Wnx z_4HhiAK#OUKZxn4bZi>=dtBeQxVsC_#w+oko(;-@er$HWUtCV~{MrQn>#X{mZ70&P zg?Vn>}6{k!;f8W4acy#ja zr#b4)-JO4h?TdpyPswxbL|R?R=vzYZ@68|Qzx)3@i|y{2d;Mqm{<1Z=Pp4O7{PsBC z|7X?6&-?b`xBSlKJ~=!2X2+E^q&>&%?Pi zfR%<0dJu10AC+(rCYhm61L1(UvB=xrqPWhZyYc(+*YnNS=i7T>YE19FiO$uIsY|xl zn)kbd)67`#EvBHni|)AO?`9wJ`1VWqnMYbRZpI~rFfEj_-Dk5@S?-}L>RAD=5r{nVfR z9{YB!(8V3^XA)8x+X1VP7EtOLkQ~qsa8p6!2cXhewjA$=%^=NDDCCpoYx9mz&Bx{) zD$Rf4;pO*5TRa`_&*Ge*Oyo!DgJ%(CQckT_C>@|QZ}&;wbwBUy&mW9Ez8?21 zOcJB1If-|_{#}jETv6i}@ui#09RXQgJ*9X0(tQo{R{m{y{A1(Q{rd6z2k*L(U)$@C zuw-JC^*-|E&!8TA={t-@7wDPLhl5u-gYHV~Y5Ma;YCJD9ze(0F&AGKfjtKZ+j_|Vx z&3hcD0JPrDAX*3z+Csp1dk`zdvYW#OxHRy3jAgBk8sU*3^D3K_{-clLVZsSR;eks{ zkq--^*w=*CBB!JdZoh6CSGCf@wVc(a$!pLbG2FG+H;3!h^BmFlYd(HIpVx!u4$xT` z^;awLQ}H(*@y#>v!Iu42vFL0iH5-1Ne(wv;dj~crgMSu(^mxC%35!enJfEFzZoItC zmpneat>6C=Gs_={`emAD;x4Jp7IVyZRr&OA`$_L3h85a^H8y zSKYq|^Op|B5_5}pcUyv+UHO3F7y_fGDzFU3W8T6_6>~9yHY+_on^v&P* zXgTnH2d@6IT6@bDS#vYzCRjaAvWIv%*cmJpvu7J-^S^(&x(Y#;2TJp|y=JSPo6puI zqLJ1UW~+%Uzr8N+R?3qKzHFhZksFKodph3U?B}Z8w4ojNxql8^nd}tBBQpXYdPI!) zi;e6%n;$zFc=@r^ybDtnSIy~sJI^Hdd)b~qKkx2%dz%RJ?|Qp?nsEOiW`|Zhjt;(h z$UQ!8aewoBJqtVjSdhG}ux&C&_HOA$#l7OZi+rEY{)&4)-#x9y{&+hjcJDJVKMvS5 z5?c+OobNBR$jFoq@M{8+i9e6i!QDOUbC2&A5>NO}^t9)9U6V$ooYL!%+qwTc?DoF3 z_9mDv?C^eDX#eeEe*PvEe_XqdkEGR{o3*ws>qf=5i0a?&1^mUgeR<)O$@+D=(0g^C zc3MTq`e0>{wIV%}%j=vY=r_@33L7iWl#hML3gK*;glv zHF_V-ma)T7IXamPIU*}$$R@YisjhCpYEa+C?yNp7Ykw$340)p2F=);Vb6Ve?h<;l*mnWvfmyCCg7bkUGfDs3wAl-_B5 zR@UHsCcv7CLRzc-;Ggjjtj{jfVV3L(a^uOEv0~18t zlJ&$QR2dy2raWO_RtGvb`hOWu_&>(y*}fz+Ea@FLY_ah2-Rrxg5Px}M5nLUrE&`Ki zW0pS|*{}efQAFLg597t7;J^_(zRUv~w;11N;sLXtv7~QTb-T=zN|gC**OUsDuM%X= z)l(@K{;r?!5qb4U9{|9derRw`{z3%uUD!9Usk+g3!XsKGZAti0;HqEc1ZE!O^r4}> zN~_I&jpBCM=GXtB{xq7HLds2mKMl^ov6Uz7nZv7We-7}ke=mWXNAH56eOv(}Cf2oR05<|+J70qTuXw2#%ZQ0R$BjwlMlBq=T&;KLqnvKJ4rL zPy90K!~FP%`K=QUz9ld%X+&Ai9CTrAeHIWw{q``tr~nr|Vid54&2YP551oU)LHz75 z?hC@KB8<=svVh3!p8}BfE}PiZqHgVQ@Op3rCXs-RL!zLyU^ez4INgTwf&1FP#&;p) z{u56Gi;Dz^@(F;U*9v?7tTQ-2)?jY1SujgA@&?7TRXKMgd~tmppr%9 z>40n02VstVcUA>o0USpNiPp&bvOcgM_pARGb0s$1{H-@8H3_Q-rbqpn_6u;*;wQZ9J{wfyGa4MR3aGHGXVUfYbi@Nm$}FQb{b_u<|}nh|2%?8wbyP z5}ZSmK6vU{z52l#mMU_=8jx+N!al;bVN)U<9JhM^#jVbNaXbEB-2NB!>%>S!>asum zk4i-aqVLMC#>KC{qc5!)yuMuJZ?-%sv;V4@d|0#p(|@|P`gv8grFpXjH-UpF;#(l- znc`XaLMCsG3jwY9c>C_T1!jpA@*bUbk5GMxPKhX!fnzx)@sx*C-NQ6*4CWA}HX_2) zRI-f}ua&AO3Af2yB`Fq4I=0iMQVENP4%_@zK!`_b+l^tZl(#T1L6T3l-i%e?U)v1I z)|UWo)Huc9ikMizY=N)z6N_B`z(2*ow@bi9u_ChGfzAxB9r+YA@x*aiu&+o?uTN1L z5kg2OHY|`R!41IssXvrGCWH;ZhV-P%iwesxstbhLHDTbUPtj*cNyq;AsXZ@|ZK(*^ zlgghYB8@JLyF`)3^tTB*2kA3MbqY#?0o*W?Udpa``FHMa2&gZVqalfZcZlOf$oN0W z8;d7Rn*L!*zH%yyKa?m`U9;v6X}O(7O5xUo1dOYr-9(4seohx~6?_UB(Rc@ZB^@h( zu+)G^WC&Q*p!l7Fg(Hho)JdA~DUHU&gbI{|uNR+$49V~}aFt?-XC;uC(TXK+P=ex|d0@G0*KW>{ z>qudjjWX6Zii^-}P9NXSR5IrVkRZ;e!cvruj!17rk)gQdNUks>mZw;hIR2DoWyD~H zEEvrSNYm>Tz~n%bIT(54;+CL?vZDhWNax5D6xGFA97y*?1V*5T&_9F5AhHo^(*x4c zEwI8e=)y97FUe$+jwxXydsqTLu}r1I^3_qO;UqPSzcR7G0)aC8ZG7l@=-fnLpk?Nc^_iMS~V8rH)3GsM6|4K7l0 zWj`IibchVSUTj#d&w1Fed>V1|tDq$arEk^{v}tyKM(!My zN(T~8xt41ZPj_jdlsriel1B9)iXtEa>Oum*(R{~oF(8pnSO%8mW zO~B%Sp(=H^5TbA1wfzPF24T>%$z)XAh?D*cZlWMc{mp_93@_yAv{!(#j^tIPd7{G) ziKe9*L)$oVC*u5>FqULIhBh$bGlCVCwJFpj%&<)FKm?DXLXx=uK8#N9ry@lJ4WzSb zGYl178KbY8s7>6tdPtLBP06}(#&x(Tc-f^zA63DLyU7C1rl_tuJx}1DAzVo)`IjH&}&uHrJW=_S)cIr#*<{Y zaa9pL-`8vte^Lr{TfP>}5(oe>S|^@ck~dnC^<)W<%u5XK*sd5#XGJ+-rHg~JbJlwP zMOw%Rwc-_{l!l~8srO<`IH(OpcyndDq2o4I#dVyGFc&2tDp6_Y`D~G$wS{rv!=$(W z)zU4Z*1~9{kXB>(HO7eliB?$&2|nd$Onl)IotfC`HO1!qk;BmBF0=VGTK6 ze@QqKJvA~?FlJdPYgvw&0(lj=KXVJMZ^o{H9UzlCC3vbih3Ct zDZ%4*88vDNv!B;W%g(>Jp)>NxDo?HdMtNyZIz<+#bOyr=%z&gV&mK>-=0At>P`vB(?M1%$sh zxVh=a6msBfs7IqerQY?_rK_q9?hk~2iFvM5y@vhy6XUns)!>`nx22FZhTUO>fbFlJ zGC@fiw#C@@QE4GnyYlinD8C7^MFTm991RbLA-cZN$4*^4jyzqmlm7}>z1CofjryE^ zbWYGvoqT~l9LRZDBD!l~h-GTM8vB$L4{eHJuOU1T3)V5iNkEjEL&?uUCuGFiFq`Wa ze-OA$P)Hit3XI3-7xJ`{j4I?YLXRSX2>M#8Pf7^WntfR6&55^w70vqlk3;oUEwxM@ zpvUSE6~zu+Rwh%0a0#!%3dUv*Ex}!)msHD2hxiaqsX4#%hwqUBWW%c{4Cs!XBF*qU z$Q-)wragebZaHSBMO|W=%?`OTgG&ISZ={aF+y8qNTrVqu~RrQ()+MZxqS zngAIA4}*nDPlBWE4Za*M@SiIrq;y~omG!5o&l1yj&DlAIm>s8Tr{U zUeLRSb!LeUd~w_S98hM5LzE_eqdI{aiT3Q?`6#6P90+E^c+PN}y%=L9tkORK0YdvK zb3+1F0YdhKr9#!L{uFYo1fI}^9HI6$4T4s?aB$UxjTa$9iH?+Rd}Fy8YrO%l-}-A^ zM|}p4A%Bn(O5FMHr4Al&2?Dr~8BRC2u@u~A12rImyuAey-b&f;$4g!v0#7ahpPu`s zT5n!40x*%iKbg)~bKMAsD!xUEALR;Sv>*oiN%=rJV*Fl>;|$7DauwMa_lrSc|G=Rx zr%K2P2;#wLhyG0=(~OlVxrY{>llz%@MC{tSua=k~hSTMzAT=FaT`t@-EX{cU&JIjb z*q#K%3p|xG!aAg2YNZ{{)AfT2aZg$x$AhvncTT5~MfnoQ6n%IMR61^)PkI+re;5%I zw?GG!EaF?F-wTOPQ#6n>F`MPIp@`Zb3+aTT@F#5e4)_82Lii<}(wsE9_6ETS9;-?e zDqNe<`wK)q)3KRWX%_^Qb_y8~recjcPM~Q%BzC#^z2}{M6Xz*m3GR!d5-RgFb&%z1 z+Hl{Qg&~_`$z0cc)QfM`|YI*LoGA@-y3_5evnvrqWPY-y8o0 zO7e3Mm<{lWD8Gxm93NM!Izda*N0~P%5fVwCDErLTzoN^BuJ<~O`99Dkjkr9qaGI#o z5c*Eubd!Twr;FmK2Sy{u5)%Y-3T1O`_NG}pKjNcw0Zj-Bugy-tk!3OVDx`-0iWC{2 zQmF8}A7UlMy03-gq!i8^0v)m%Ei ziJA=psO?rA)I_5NS-}BS=Cy8^pg%z&b{2qfh}iBiNqD2k3bxB|So$S=9n#U^)P@qW zrr;FgFKHYU_@&()CwL&1y~R0FAm%U?6lyxr9WE6SPU(giPVhkPA51ZSk`8FD&vuTd zHCsO}1W=Kv&I0xZaEn$Ou2YZ|)*(j9V?|kvyG#<#0yq%<4Wu~1%SiUG@Rj7So}wXC zEa3$*HHXj$Kz`|8c;wG4x7_Suy25RYzKQ_Y0#KHJTMXq96QFRsuE33Baa zZIdOK$=JkS=^m1MBcK-`aEfu=zzywvJ}#2H8h;3Kh|QvSahA!VHcff}H2g{WhQ8Bv zm1UA{_dI+T^^}IWt5w`QvPBds}C}8Qr7-j!NnC9FJRNf%MSA*HO&O&u5O&7O+`=Q zpGSmrAGizVaCDRc)?o15Ln!_@H$=k6pdyt4PU}md1mLh!5xg5bM zprDw_*NtFG5$wsV2+#$}( z;vrsg%IFt6iYOOB+wtuniIWV1+v2gK9{2`+rboIAq6P}eEKs7qrbgb2cqGE_^o z5VsU&PU#n-Hk+-bVRy0;KWc=#D<@dgq0+Qb+-DbMgre+@&MNOB0PgMn*3DMwz}l*8 zs)Cg%&COaaD5fN@T>gy_BcUUWRf@66bR0&Bw=*nE0V}cNDBpmF8$&d}9#$s^2jOTW zVQs313N8`6o%MLAh!X-*V0IOgny?rp&h(&5&$L=fy^=E@lO9YCC82BpxQ4^Fp*F{} zeYMF{@{%dCDkG&7^35_4icB&e*tPBDq>9LvuV274g%~)+O@JRh$x{*xQ%`c#97-Le z+hMfqAKeMTv<i1lm`UBv_Qg{8XWnNheFJiGR?QEO z%QIsyafhllJ2M>`nLYvXA zIM>tJtl7k(?W7~hMTf6jR*Lex`+Mx|&MZpPggGBYoNL13>A?{6IrtBC>+6?ys-%7? zUb{}c0Xk7cQlYf47_KL7jvI~$81HU_fyJmYe7HaHn29WP^%=F6(S4T>7y=_vD%_ur z_f4<@iaMo^5Yiv#<0K{dI(g*%mX`*|$!oxGgL5r42P*gwSz`#4iXIsh0Rz$sm7$<` z&aW@!BE@iyGrJA${M5UgQH_TP+k{2GLm0HR;&v(gl`=F4SVqnk1`hNL89J21FaILTEGNlUWbx1o-qw;hm!B>PncZ0v21YA`)T5?XcC|{o z1(zo~U&S}(2vprsOj&7EtDlsIX4M|EU455cxC+52K56+}KMxqw6M=$D0wW>HsNl zZ#fl%X1aT3q*$8rFEzAd)vJjSW5Tz;u+Sro>;$3aD{U=dCNbKvX3X+%SYmAryb4hO_- z&`HqLMtYHk>(T$Qe=^V0_E1v_5+~Htp2dU2kNQpkP@Jt9^@P=%ZVb!AEfj_`2u`(b zh>(Syr*>`kF=1h0= zpyZwNXULSuvrv9N7f*cY%xeszMb&|pN}QBl%yPscMGCz$O&&XDdG2vimSV$8goB#ue0<@h9L z$h_lnI0(<1m4lE$kz{TiUq@ikf?&kFMFSuFQlPV(zpcF5d5bE)M+G_ZE z9+4&}oXD{7x9kybgro|uKMF0pUGrJZp9-gnh3_BZi%)$uBX?bIF3sxd z{^Q|gra@07aJ*F}_p1u!QzFmy>JjIt*QwVrxva>xp3P#*y(>8^Kjo}v`BQtiAL=JJ z37wYzouhP}+`5MvxjqX+vAiq~#^5atcrV5q>E!tu?s10($%<|IulHd!p8mSFIPc-! ztAE}k+(O$Mct1z!=!7^y>FIpVf>vrc2)H z_ZzlvlSZ+(b@BhwQ?i92sL2?|Xyt^rlW_P_BcVN(e7Oyj?pYL(1a6$t2x|1){+JBi z%2<)rzV&p__0yLSreA<9so3QU)MQK&-E%M~iBfm3=mXh)pywbAr5stx9D1pSD359x``&C)Z{@ZbU>2J7Qha5CknX zB&63ZiqxC3_8h)qshPTA$D7E)_@FSsaFfC{0C28*&vf|(=XgnY0lD1d$FDn4N%1fL zI$BH(phv`nq5Rrsl=y1htMT1rv+Y)~wd#F!u?S6%O968*QoKoHvRR{Q zzo6DA1>?}4Tp;ri%@x4)n3ZEpkP#-?Y+CZUv~1MT&cf(nIjdL>RG9$F&i!X`!e`3J zO7NeQ8w+4eSKS*1;-SiQbca|2u>8a(XvE)qv27^^oVPAszls2JJ+|m!W*Tn1*d8IA z-t3StM*PhDpu_2XMU)y}i1w{(K4+5?o*>H^9}k0e=WcU+q&=dJUA6~( z$I9Fh_)(u}$&G9l0v#*XcN;$$E%n!|x{wpVN44uwc=-4w{bWBrg=GoS(-}jLIJ}S0*lyXVVioM_ahwS4zVy8aU98oy+#rg78@(# zsC|KoFAbMv-w7xiF_3JhZj~KK!@GT*jwX{VMR-IFqzraL0AjGy-W&y}BS<#No~~a& z|K%znZD8|-mz+$qA8!LlBv@q{+h08_)#hx$?UG&;m7}~kO>de*(V4PHB#=yfS3f*zh zmD%LF|8%lw(sricKIE#_&Rx?n^CL9sxZB0b(7i-Bh#j;W5eEwIB3{&fl36m>LQ}1h z2jpA-6j(g`g%LqnCW#X~JnoeBD_#m(YDokEhYBJ8%hR4Y>`(bzpRT*D?0uZK`p(;ch z39uk-%vGZ5xN9S!S)r>$=eWgUWo0qsSLmW-j;?}VH zo;AlOA}AT*lj8i8WM5>S$J7x%Uh^ZyP3}!@#k--s>Xg2}?!;%ZSLgaWqnjP?ITTbX zsPYio(U;Sos_1p?Io8Y9seg_^)gbIOM zJ|FrEr1SgFrd2mb>|W|&5{Y{0V2-qO5rGYIW*}=(_>M1fL?52!)bNf01rj1sq5&mR zB*VnyU*W-HIQlO_XF4vCK5IOW#U7jB;vv8DOMzD?f*igFB#r>6=oM1CG$~pxRPOK~ zDYPmGR6zrwg*N9svwUHAQs#BRjTWIc6J_5szPXV|oc$5Ua zLgRwgFF>yXw&p|7SngrGR2ie?&;9+X;EWg54TeKiz_H$a|MO(aJ1O#`zt!qV%#RCu{C6>qJPWaJdImN3-+4w?rjOepF1E7$3vqH3Y^UB!$}|yv_S;&S{uAjf&yC}8W1jMkOx`wY0{I*1rr*zR*3lJ zaEQ14PRoE|IAnL|VxnY>42f#F!6-WQDh>T&L~UF3t#4j+4Nh2nE?9{ae;{p;P12baJ_$$yIfiUW~NZALO}ZEp7(yYPK{>4|(EBLnm6>%e8fCs(YC zRwlA|c7n=-`#;)|O;x5b?2T18w)%sbv`_*&csW>RBsh+p)-WzH_to0PP8&r3NNzjj zuR)g~HOVvhG1|!*`Jps%n#!Fn+*I1n0Pul5+EmykeF_XTkjM*ZMOn%librh+*#i@@ z=QLjr8!7^{CCq<9=|DO)@xnWG6MYU~tqg}c(F+NJOo7-Qc$WL4R7{3m?hGil8Jnhv zagez2C6~DM{h>YWr!DXo2eV=xojPz1g8Ya{*6?=LsW?xk-{e)wS$lg@|1vrF;Jvr> zVzKI>o>o!vottYE<}G7BDp&~l34ewY`H6hSN52=!kBor?_lDRG6Y)v5@`6-1iFz1X z7kuoJZw)lUSyG5;gHCyb0 zz6`O4&bH}5TMQfXMjmf9Jl`XksFeKGJcm;E&vVfga-$_T4YZn|H!bZ5TY`|*WPVxj zA(M}M0oIX{0|QloKioZ{U5CNpRF>P|)>LODTv&~2_{m*S5W!VlRJ{b|?EGQOX9WHs z=8G*6Y8{51aBcxpKMLX~pMfHneW3~V(GK>R{4_VO8Z>hRfe40<-CgxhV%QWlxi7&w z1VS>r4C|7ob9WA+6lPFF!GAo_|3Y5Uo)9Lu$CKgUtNX#s8x_IJrq*&YveiN? z-E>0CbUtg6DD@Vq0l%rVQoJHpLqPSAo)c73HrWN^z2qV%!mIGy?~m zZ{>vVAW3l&x@ep9{XXOvrGX@6n*^n8@))^$cfHhc4b5j)>jp*_TH)`>9c^my7C^hf zD(Y(-p~WoYa!vnf{Sx&r5)Ib=Jx?Y@tARmHxA&DK-Hyu0Xw@@?Oktx9om&i=>sC$z z&`}s@8ETTd$#(F&fbup~Y`t&4G_KwC{RA}I&Jbh(UTV1d=PVnFk32rU!8VDg!+=>DFqdx2ubtyrPZ z_RD*}b?;h9&N}=2*?DH>nVEg|o^jCLWS@VAyvF-#eYZ*eM)AC{gt=IPWNJTW+~vi0 zF($``{Ty1M(CZDp5pwyc$h3<(RTp>b>rDcH(FU;K(s={ApMkC$P(tiW(MsxjFGVBX zd%;U6g>1pm{hnt-@>)APR92^uGF$2Tw^TI8jDe6#_|9b?@h}-H*1{%-!cjOSPxmF> zuVDEF;ig!>bq-F`Ov9?0rjy4KPf8t+dQS0b8<{8{_CYGPfl0kRj#^TNf87O zGkx^k@xk|^fK+@QqTH(5+B%4uP|Xdz*X!7!O%|86y=wLUOBjxhNS2iM1HogHkRG2B z_MiYZ|1vl2zohe)1BW9o-yV+yyEhjMOs;?OLBAo`S0sHlJl{d!Fye|N}#Nu5sw-$#zT8O+g|okYJLs@YBkLt#Gke+qL_c^M|+5F@i$#o773 zNdep%-42T{Q5&P=S=CJvQDbzO*?cE4pWIIND?B}vt&22{=G%ovmT)BHtFX55YzV%Y zm9QwR-ZO0Bs|h)G;d-m6!l&jlax?sjR&BpkhQv~vhsjr@EPH^qL$k+Y7EsoYx zmee0FA3Oy*zZXEJ1g~@6yu|l%lkWhc5g_xTxNhW}wZ89{H{hq|%F!HA1_c{;(9Gjj za{562csQuwew?6~w^aLlaB)2|jsp>08GCpLHJ)bktcy7QS&mgJ*wE}tdhHFlpx}>A z6MEfCz3!U~Hw^8I#jC|7KDRqJx#sF4eu&L8G`3pXJ?4n3dH)$B-of(%c98eoJG&tN zHpnUG71cWQmEurd&fltgjnf7x17h{J7bMSxn5^0^6XnvQDWtrJ%NH2|%B}!C++G~EZs{SpuE;V$dddb%uY^t5}s^!jxr<_5H{xZL~ zVwf}C#YN;{t4cfnXg(wI41ivfpH1g=UFyH`W;p#`kagy`dqbh5$DLVU zF1Hl)`yXOlaky9dNtECqSNW}EmB`=A4o*C--xIIRR@+67bf>2rbf;$zC_Z76tN93i zfRIFJw{20KE|bWrX@BuQV7i|tD~OUHnMwa}h)jL0^~|@-J-CE@ynnspHhM`uVEnl*<2oKfVavq_T@|`PTHf=lztrjb0tAEYm&lr=a2io21OvMu^Q9D8lVsgiv+ z9gr&F)}7uOUVw_m#J~W677<*h$3UtiL2S zrQpi2ZX~K|acU&$tigMxvSml8gWcL?lf~0baE&UO7)F1&z%M&a&fvRZh!>5|5ub%f z%=#?*cTg=x{hm7nupd+Kzx1Y}M^WyQczymRhc&U!UOGU3K#G@Pf|mNOrM$R-gl`+x zc&1vamK`K5bHr|Dy7cJU=l;fTB&A#K^(ca`h?mc*^CTh~)cYI*rm61_8fPq(P}i)^5;qm)5V3MHcp_O-Jgo$wmqvb1v+NZnEjS zt7lbcVT>W(m-g20E_bTR1#yRzva0edciJ{z&OaM4)n2>>SAM0Rjtugd^#i?}ydvGz zay{&2w(7yWSvHhamA<{z)=PVvt&J(rpeOCd>+!z%Gra1n5Y@jox8_9533RJ#$$+0t zWG~?Rs`)+#O_EY-(&G4)Re5Kd@Ncd7YG-HkG8uCf5GfH4nHcuNWw!k2H2Hq%$&T8| z;&+Y~CZy)umpM^KzDL5H0Y%U5NO2~~o2+h_n zVcDGa6OKP>enIA29z5O{HZ349;xcn^qUINlrJ0Y6Ok7^`rw_qM4KUyf#W=L^dg)8>{MNB8gBz4G!^48mM(`Db*#JQ5_r9rqiv zO3xYPhkGAbAw#YIh;XME-G+2ZWWRh1aeqTBupXDOFd2OL=H&76i=ZlY-c?_oEB&)q zJf@7D(sYqUYg|)W1uBi3Vbjb665HG(OG_yNZC8x$lbD1JWFOcWC0wvY-u;F4d9Nxs zUKMS2^!ZfOnrK(UUCTEH?B3y#@%ECf#4~LM^f@vqu%M%wn?R*}?8nrw$e--#~TC@q+UC7v_K{J9!&;8n0XmZTPCRbpakzV*!i|`{D5S`elgX4`Thg_~_4# zC!+6sbh(4JstT|doRuP1orRbhHKI+&tMXt>Re5;tRh1xxpsteEcWM=Srj5__Hb^F-2WyX!xAYz%4s|JMpC}#e}IH zDLVU8EwLi6vlUmW6B}B)QQ@+tzW`IaS=~gU^#RmQ8+DpMRYw6BGJXMAr0jblF@p2l z?KPo$6NImGU{8GXIhFbUB{p>yDjA99ZZ9%7RUtwFM?{&YOv_LCSu)UhP56KfzXh;0 z0_Qz|jmGzV)=9I>`wITOM)KH5ZxU&xwn?d~%!t1Xnbs~T=)1l7hGquxX^R29p;m?p zOg{15-emDm3d4$H0S1A&^k|t;N#9i=gA_{4add85YrYfTrzt*(U5DAf^q^c-2&kC{ zrTLWqt$+~JnnV+*5b&FnK7Zyp#W#k%c$karZl+3x9ZA196qlgnd1#mgOu`TB1V76-o8wHt=f!sRQ7R(h?u}Qs454o zB8nP1s~U>U;)-Or)+p?FgQSdM#EaLvNhTNmnJk6JK5HL}O$cC8IkI?Po^xy1qNPkD zw2M*aIp~YeKpYBn^Q`%W%-BSdf%pm_yUHMMz$j`jj=zQz^k>a7juebjqK> zd)XgIF)tETMxUXy>yuqPI55i7bAH^l3G+tC3;ev{) zFfxzk5UZzVJpDuy?|#0^+})KZ4O|~h^Qf>PS^>qyB{-R&D?6*OQ?wO-8S5qZo+=;F zqpFKvB0h})6y_EzVyLHRbXr2L}!fDY?FP<$bM-7>wC?9o>U4<&kY2Je4%fPeW&l}r0MyoldG&x5M!h4^|_D0cHtl9{>UZ$J+15h8xC+y%od3eUC`%~S9beOQzOcAtoR5M*d8X>Gd3^|`4PdTiq;Q1$xA^T&v&o(H{{R9_{RM~kmY zr0n8-kVKO;s6|%qruVE8WHwqA&eY9kYx)c;T4$iX``6U#=GWm_Wvin0?2hM2-t`Ax zRqR1l&7r|ni!8y<=UsGue0@cIV>Z)M39Ii9(D}M*;F0K}r}0^?*tULiUGy+5OgV0?L7{fb$rEkjlP&(p&n5tG2+(U)x#+0=cpUmy zpo>9=Vsro3hnG%Rs%pNX?6f?;OKvUAW}=c;;}4U5TYc8#XL$8Ttlnt_{D&{`2W0l9 z#Wo0a{ZMTGWag%LNc*$`F~ce@xSU86|1Cf@Nu_KL*L>zPS;th#5bxRo86k}Y#h@01 zZyecRTVy-s|GZU7qMKfokh-V+Tk}vOg~#6>wtP{PE8MgF4P-ARu!@Yq(tfe{#(R2q6d_lj5&?Oep?z{@(XbpC#s zLD0`gkP5S5_C)wX$*c4S(y(WUHlVTpy*=R>AY4bt_mWr)tob<{cmzBjsy^P9Gq0hZ zPx#&2t1NH3K~G0br*qyvb$&U|n9@YF{`#9I2m6EG9lN&)l>r+$TaOC@ z6T&+AH827Y=>BrhXRuy5XyBi*@*W@>+@cY8io7|wD6`ng+9YyD;aI+OQ#FB= z?&qTsoQ3XwqBr{+d-3$apMfSX!kk)%MBkk^b%8To_?mpJL3vA2?|Kf`2#H}1bBTLhVqZWRD5V686GB0Eqj>|b45Ks}_iJlI$ILkL@4T=q)8YkPKh zMwPJBxG=jbUV(58|1(jTpR=OwHcmiPJ4S&Wu0WA@3DBcYzQmoO{2=x{ z*LeE|@#6lEraEpR{nvbKyoS{laFsPlaMked&`-j<;qyBL{>Ipqe`=`;4hFHux+!0J zY>N*E@|tkIL5uQO``Rjo21{Ef+$3rJv5sNrMYvgtt)${i9L-w=$5mZR;~+Z|8(n$U z1Q(k_%8D7w`nsniz*8+kgWwt03Fd$1B>b9h@BlLOcXG~2D=q~L^%Q2DcV4&7PD}Q{ zLl^Kk(wHR7{W8Dh#-L4^TT!XiB@oPI-I8V9W`afo0sgSHME1>ez=j^eUD_;j-m(zn zXNG=YXsfMo!|)IW;M*$6CK1*V2N zK6#RO{&9`3h1f7~Uqav{&l7=}{GYM0oGHqJWLF2~RNioCLnQPN7~2^(@kU6jd7js@ zq{fo*}*{XQ*R7a!m7( zWu`{&qPXhHh06B!N);Gw3-y(|5gV}|bS4&vJNW{37}&P>1a_~{n`nDyR66}t(OAWW z{Eex2;#P&T_~MQhcL|+)uFH-ee7;eFq5#Jsh49a#n2eht9WrBrUym++vJww=K2Qv6 zvvCT^l!e(meTCk%!K3*a&Qhb7&1*C9^=EiT#?0|o(D1oI&MA?r#&A|vP_9`tKmXMn zpvcRf=g0?Y!;^SzJ*~m5NCq{tAE3C){~2yN+PSU5$`t=$(o3W-O582Aif4X58h+oe z)Y@(7JbUoD(R{RQ6UHh-eIG^3yymCpZOzS2lpOEy-gBHsx-T7FHp-S&qUu?KY8OAkVm5@tccG_z z;e^#=euOh@2$#%aYw0Pg3&U&w_e-;&T?8~%m{r@cAs!lR5(@Su17OySS>;1z2 zTm=8;0>WI$$PSn;4IYq1;w>Cpgp=;x<|J{W`D*h^0IQEd3cyy4Ut1-zXKSuMR zDwnoy9F{=M8)ppACB_%g%faKWKr4@65{l!O?;+k@KMRs$ZWfn7-+^wQfG4Ayez01k zA;`xuqkGbcx;ojcZ=brF*zBE|=SJ;9dvf>laVAK{6zdArHiina%}PN@!@C?GQ2%Wg z;Ta3=Aa1<9qU1SNLb!jXtfB@fX4e2YF#gf`i9T-V$AT~izqlE&fC<%kkv>q)WN|fX zPTtsx_TG^D%d?`Z$1o@tpavA40Vxx1wj*}5Sf*p~8Mby(VyqGy$uAZko@Y6yPNa_A zU`HP$yp>TDA*6q-FJBYoJ2pb^KNbM|Nzi+?^=>t~lkKKj2L2xl{KkzlqWe|fj_xzQ zA_1RYU1Q1+ADQQ}$niXVPnj1X6ojSk&)8Vd)Ejs(mV>9q3fALFzyVE#L4qHiU*YnbG%e#2)=@#hc)YMd3JQ zYNA%(1&qD4O}x~a1~<*w&*Ms!otQ$7GW4kXr^4|c!XQwSjAFMeZEP4&mUs}i z_IczYBSXlLTf=%?%Z4iXY%&$X+~-cvo#0)Tef*TO^vRHv5>Irn9qIc|Hp*~JGQ`i1 z@sxT5>c-q#q{4KWwm6*6BEVN)yq}S$P(j#FKf_3&Hho1vj2gvt0VTprE<5P+guW7L zw=$$_LagI!2hb8ep_51i@|xq+RI7%@NI*HUY$$P#fTbgRjc3%D`pAEZM!uA! zKEE1053M*qUFdnQ-xn}{G?F`*)13EQ|0fQ35-^w2mldAt@ooo4m3Zn zVH{j~IKoS~ne2vq0-MC!r!CWcpRS#&(QyO3IBQ~5G445un_f`p0lRh0xf5HRwlT83 z={X%9q5X5Ko*+0P=J_$x3H3`PMMG{Obi-YRub{(H*5e4=JsaXP)u{37NymCX^qr)F zR^7uu=1-D$xs7LJI>VBoF0m{cFsAnIVd!>mg_`e z@F?wJmSYGA?FmwPELKgv<$a>|ki3js3qn&eEZlg>re1^jSNdq>>n@>$DtSiD>&{pbEK|8J68acz#_L29W z=*fT<=86Sugp7Yd705Bnuq)Nm&9S)8@jCrkB(J{G{YvhSQw+5=T)f+f{289E*xBjN zCvyMP%0z}F(r;w6myKPbeE1?2(nfvATiQCN<1_qQPNZllwtY3=4SZB#=h;z*BF zN8Es=3y>qK4AsmD5T5GD1XtW~lm|*5b`x6Yl9haPpO9#yKO+2&HJ+|ws_X2kg?OM2 z<)f&WAXJy}sHg}N65#6rhA#}r!i?KhG|4WA;>SKEA0CEmnIM%Sbbf46=a6#1xMP;Y z7eUPe&6#?uM&i1r(aYTv41-I4i=d{bt$3q;Lqi6@i z2bRANZ}sHRosmED7wk)FIi>M1B_@&~$LjddFh0@S^f5Qw`$OilUWfQ4X}2aysP=A$ zvQ*?I4Ij4U`M0vmo#yJn(WgdWvYIOdhpk?MF<0b+NLsOUsaSDt-VTw$znJa$e`l5q zI7=z3AVL2UF}U;XKWhrpUq{?!t;*si{Ic}Mqt?x?c$opo`h3)u2GxyrgZkQU{gW*; zp6>h;0rHu;hkx}RNR7<$mHk}t%@3)+_)aV1in0q81e6+o0k0D%Q>Yu}I_e%|7+gd{ z;41xhRmIlQo+RT~L>7!QF5^mUL1SiTc=?F0;fhMMD0q*$dvBp$m}x;JsQxsWS^3@E z+6c~jXZJAq6Y1~TPY?awnTt`^+`*&2DGz~qBl3gK&bEf=?(;Eu!_^}PC#i_1g0g4# zZC+s97 zdeWr~0Tw!LA-144QK1rJ2!{l6>u)I==Us`{K9P+xY*xC@#jRm3%}6;4f1A2WXRMwy zv{LwnO0aA{TPyyH{t8N@(fOgh%YB}*q|to=ug|YV0?s+*VZDS`y{jFhshFz4`9Z?c z3;u+;;IcRHolMqm1wX#=T762`edA|>ov${pxOa%E4V)L|t8YaSAX&tKslpi)B-spGz`oGIelDMIyB!8>3qvu6XuJ*-@z`W z*nVYeX#03=oi;m4+0tnrEF3B`I<1~&Ht020HLSy(%oC^Mc#FI-2t_-^=*ocqY{(~c z59LzyijWufdtaiODfd<=6zKvRE9*%fgM5w-Zhc#Q`={kE=XdVA{XELQ+IZ9gSPJ%` zI}x8leR{2;4O7eUUPYMLOfWxQ$YhxsT|7Q~dZGB$V(RJv!lAUacc8ZvCi3E80jEeA z6(&S2LtlPycq%b4%mdXq?*K>)UjF@*c@Z39g=NTbBqr|U{AGT#v{f+g*y=~j=JAs` z0uzAlI=UZRpx28r0^ZYXk$2{8tvuovO6Wk@S0*5q;JibV^L2;jABWb&*JlN}U+pLo ze`#wKfIqTSap{T=SvgP_{}_+d##sWQvkh=L?+TS(m)H+X8}Y$Gn(})67XBcLMA>o< zi67)8o_)I~W-T~ReeXEtGz=v)Y&5m{3_H{I{W+F^Swy-XX;K~lUW?42klr8_r>%DF zPvZBdJCCSR>Hz0`9{d41FHCuVlc-~t`ngR72^;LyJ#`^1bQx$4Z7$&$2M1<7Nk zJUX{k`LWH<)+LgaDB9rr4GZQ!c&Iwa9$?N;Slvh+^UjSP4}q~MTbONf#q}8lC>QLc zc)G|j0*BMLs3hNJV?}z$v5N}5!jS-Z&l)PTozP`1JbudrGuryLzK+4o1K>%moZ%6y z>1Fha1iRivq@VC*A8`P?9oN0E)X!$&NvV3K6R(g@Og=f@9RTL7JFIDJM7}+D^;GdC zcsAcyMjBO`^pV;UX&B1dR^D3Cs2(<6Pk!(p`th4d*lGNL-9E6;Mrq%AL+7#yuTR z-e!KLCpM@?@2pfiGo?USoPu&d7E06H?BIyQJqTjv%coY(%<)ab9;}FGo;BcYQCZ_N zko2K~<1`9w5KQDakVXRM$q%GQPyc@CkE2Ug9(|1gF+dh54Ce(w;{s8ZKoR9m?_9!* zGY=98FX9%lOv7_vH&c%+`7MiAt=6(KFj})uN!-o@(M$1k)17Hm*tS!Z?yLQhZQR~j za|V^DJlvql?gJqH?|9%VE~|d)AoUKM0kKv9SCJhe?IhJUonukhsWtU*j0xScXd+}o zjLsC@~D82GH?h0v-#NnffGKSG`65*3R+rS^}sul_Cgz?yYp<@AKR`nq?$2=$gh>2pEq+7@g(=NWb7z(eX z)RQ^cmGCPP_LcY9M0}7s`7ekNZu#;JcN$u?{y|jxmBwHPz8a_P=|%ys?Vr^GO1+iu zk42ZOHM4Ge$Tn5Z+^^Q;R`2L?kmruq$nqG9-$EXT8c%6XNYT`W4?81GZuis`5%y|s zV7azs{X1IaHt@=JdZd^rLo>YBJZ zA0eEP_Cc!+qdfA#W6VVRFOr&~BYtR;vo4N=4M_5GBwO?pdQ(GxX5WIyl- zQ<&*>Z~;Vhc#uJ#f>(=DN;j_Kyp^@nkI&EX49uA``2+o<@KH;>@=AjHCrQ#SEr^gE z(9?pCk+ew$Wj7t6%&3ar#Gr6*K)B%${=|l`#aOd1uqd+w5{YoirMg*w;EjI+$Yhp& zY$OpowgFxAD5i}v#`PfL5X}BDR}{|xhX{uSh($}`sWiz_!VUl`(LZEPf+NEC$>d>NAf5YL?DJu?b#%C}A*iEv89AAFt6 zyewK0zY9>th%C%a2jfF$#jq)V>Su0kQ}RY3a$O$hqv^9#=CjMylCKjZf$>u7*Oe?h zXI-v1lp%l=5E9Nej3EA?BBsTQJ-sd{PJc)p!z83BeW287kl0najSDUn%4>-M+46L< z0>#0N)*VS^T570|Z1jMH>_8x- zm_hH*#>%O}5w&okz((4~MTiivk7EiGp*Zk;kHOMWLY(X_G8!zzV6ZO*US{f+kabnH zGKHzkJ{gV{#;7Q=6%98VeGgG-qh>L4KLOJbIo`6U)1Yk9;D0@DJ@FE}qJp?fdX_Mjk9?{F#HZ}@j)bb2Xf;xx^$opzd z)x1@ojX=jPUgh&ARCMt-!)}4Bkca_`d6mummjKQMC_B3#7yT%;lmVsE`b8xd9WkUV zBYIMJ~P2qep6<0qpy`Z;XD<;+-- z>BM_Q;ne^V5K9HZSBf(Qn+@;iNS)(t?gc=ZNx9egV(J(JOV5Ol#{wi0k)0mV-39Or zr}KYRdz4%4*_MzB^6Ye^AtaIo)iL!EocTr)&lO3lz}2&PQ*)s*>BT!w^Zrwmz;13C z)r<$s8ITArr_mvJ$6CpuQ>Zd;850sfCgH1o3TE$W#*B3KtV%co1~~eYY>n&6*$iTc zp(Z$HP|mKnro{zC5->TaB4Yob#wM-FJc(kE zNvhrv7h(?32wzV*I$~llVrz|r2Vjju?%*}Vk$TOn99cJ960s|fgAaUW?MTiw@EW_H zV+7=Ku%_aKvjr5TWJ8~&kAmPO9@2OQF|#O%<;$l))B8vPrR5^sJZfa=8FK-y)dA^AyvyDyG5RPH@QOwktK=jEWcU= z>g4Z6J{h2?QHnqCg@RWyD8JgdrxYd+vN_b)N)5V~V(-(}$HB?wa%3Vle9b}LctQtY zk8=VwM%l!j5=-hD`6CvI(AqlTi@T}x7Kx2T$i||XEFTRcrVhYozad_y=h^}!qAF+s zX&_W&%&vwq+FTO`=pYU6@YK9<=YSA)U28c|9h?dr`5c)F8Uz8X!FAm#gUr%Va$l?B zlSvh(Fer?mA`jIGCmTjTFW#@IgrZSt7yHIscMg;&Qn{ddn>ZLjerUr+x}D%Hgfa01 zKr#^wPX!&lR=35gXjOp&SJ*^iA3DHvkZI=Flpil;&}tsU#$io| zVgb?sbTV{5&>5=%hkdm)o{eHtr0zxW@XFhAJlDb}2DMQoV`D;4cwANU=!px{;7e>9 zZZU7OQ2;@4bn+Z9;8>aGm0{l+m}YZ$tO~HI0t?RaZO5SG7MBNAIVZbJ($0t`gB%ca znoyXm3UwraxmQrbj!D>L2K5?891#zv48}SPQmx=?8rcL{U6S#Ga#Xkb~5zyr_@vsPR|SabmVpfP>P!#i{}?A z-I^CSvM=C!m713BiXkWa?snOV8jwio&AMRqIBBF131+6|JPQRoQr8=ct{a0DNX!Mc zexAjW!49a1khSMXdUf!sZk@#ac!V5hljsSJrKQmy^tlIIhR$xQtX0=qr2Zw+M+1wSE{a9hZCP44h#xTJsT0TnEhB5KtzV6{_# zHYeqFk$fg@VN+!v4nw&;SL+g3hkpc)HgPn2|ADNgjzm^`ken5aX*r2-U@!o5 zentg>y9{mnO&&la)1F_Su8$~?!(!$ZChkFdYy(xOOJ%+n06YXDB;X!m_ymAG6T%+I zHo^BqRv&+>TXbM%tt;Kp+RnAFarh=0k?W}N{R4?YN;`wo-zJH}gKTHIy_ACl6G(8q zRv7Slg0!acXY5@tttSVz1W|rs7KTcnKHI>FZ&K(igW!%tn@dG zNK`&cG?p>b58o?Q%!$$pu8=;KLlqJ!10SwhQ*HN%(LoS6+!oa;!u|ZUYHG?D zgYYDLBq;2gZ$ZxXeB1$E?BQ%F6YJ$NKBm%0eCd(jlzjlu~FPsompZQ3iGv4vB?gmubmPh$)md=7WAcbDU`Mg=o;mIvMZsc4#VRd^l#gf=m+!J>%kTnfQ_FG#Cm4f%wDo2? zz^iMbIaZ>?2iHbE0dIVtXrRK)bR#FQ3TlWTA5g`v{Q-X8 zzvd%qHfe0QfwY3V>aHh?UqBpMnCK#h7=t+dZC-bE$qq!LG~X7j2$oqPU2FJTmlyC4 z-&8HnBfgJ(KruhxgDI~?_e#th#<(M_&L0SPVq~`G_0Eig7p%aefdo6#?l>+&Uy!OlwH|F@U-zf9tQs+Cp3q| z#4nkLdIB@6qxh}fnfjl^HeFEJXpw61RTs3~#dvcxGi_ zdr-;gt^hM?LBz*NB8c#-{FctUFO8G6j@n!Xw!R;=7 z#L(x4I&FKf%g8FRxyUoTpoym8^e6 zS4d3*>;kH938wsbZF=qDhb`KKQA`XWQ z1y%a2*w|`sRoCNK@jja7@rs|=;h4}XJKm{2gzd1RifpUD7FgYmW#DId1GyPyJa_rIX@Ri)G2 zUq_EaAB7W3nBV+_bh@cIcd&a53YHyC6uLF;feaFi&R^fcjv|#{G+%QjenYT`tOu(Z z5Aidq;$ALPg`#K@&Be>R&~B(DX=H=`0KfXjt+CS{(F%UQvR_b%^e&lxlisA~jW)LU>-hFXHY#2beoZ5Sf1C1{zWho#c&rIYUm6Z305|7%rvKWn zR~^78<$eV`H(SZ<31SZhkNpN3v}L^lsmi+gxTB|O^wNyV@vjN9J;%Sp?88qK-*QSB zDkOhc!Hql(i~nPHW@w8cV1X>ErXD%`iz}SdUx;t`*3IZ2Xrkb&7nKLXY6M0rQd85U zh%|pXcv3()#NTA@Ny_h<`x#~QJk`I$W7jXO4&>_1{Uw{V%xD%WaV2qS1Ckq^dS&t> zttonK(3ieiJIIk!6bDC>czVdF$L1bCn4?yBgZGElDOX%bg>`^H@eHQ7ms%R(Q zUNGM9F(sIuaiKAevR^nt_YGk2<@JEBJsz)gqF*x9o?N^S?bShCvgDa{Rf>CC$uDBA zKZgB^H1wPm2J9_D2FuOX61sqcM9yC+PL8lhwNPne3AE#HH7b-Y72BE zzfw5a_1!>|REnqbK~{Biw*1SqdgdoatP*WcQt{CGyH{!!~pL94Fyd zlj4(Tr|w6t$H+*ZEDzwvr^yOqd=TlLRaq30Ow)rMO+;AnZe7hSschyPc)OA{n?*h` z-hy2y165lJez$$;Fg4BT(cOS4q~I+PtDS(?&O{$;_ayE_G936a@*g1%U+Swy7tk^B zNfdLb)A`iabK~XM)7zB0*hX(@ZP}aX&T4<|)ey9|eBD4;H9QgR7PrWb8^-QDrA z2)K&|;alqSmAE5bAem!N-tBzB=lx-vM>&{sLd1)hCOL9vFcw7Gn=NnPhG9`Q1y}&EmYetfj&TbuQLj%5#d_oaJ8~k4$M^jm>(|7eTddZPX z+MSaAq@zCNjUZjadx4i;{%XPSv=vWi~JLiQ^wz) zKV110*Yw2b{3061RsugxSQzlh&QKy*hV_4z4Jn~VK1=ypTwLM$=De*c~J|WlA z5WQ6#rZWhW5%FUGqm1z;xI=E4%yw)xMyi%EhkJYUNt~o4Su>KfoVp(^>d_IpQb(`k zS+UicoNl7SK!%K@-rFNP-+6)H*Z&Zk&YJkusCYTJv|Ee7M9MCajdpd8wS5>$y$SrJ z(mh(I)S&|B`9hkoa*V+antx(>XtF2jXTwp{_;ce=cVLfDF*6aqUzNWBezuq=0anKe znh9A+mb;L#cOIIE2Uww(Ut$51iQ+hjQEyJ&aD7BBJ!<}=s1hq;5o8>FK72;GLaO@G z(4){kzv;f^ttb1{gsU*WY;d()txDC0_1%dLKp|Y*UaY@3`r3(ZtMCY&f3>quRFo9A zB)|4`_v=B2Lu?3c>O6TzdNt076|)<(oDEgoYe}cAe^4doGhR?GAMLqU2IiUxkhe6V zNjGP4RAP2x`L|y+u9zrgP7>oG_jUz;^HzSep-!3$dy}My4#Gm%sN9P3On1uyuf99o z(Tw&{h>1goNP=xk$aR3W`6m=-Lg4O;{I!k@mQr^RI>|L+l)bpHpoczLNbTR#+Ra?9 zyVhKs4+TQmYWUe4+;{II86u56u`ynuQqAH}HG(fMS z=`{M~D{f)82~`ss{#oHDJ#z5Taq4nvARA{_p5yjC$lg9ywrh>Ck1_|*BU|=|t{}f* z%#FMwUB^!H<8 zA;H9KQsO?~f$d*Y@QfJ&i9Vxwfc<4_ELEknY+;Sb8g(f`1+l*(H^H@yllUEtq-b}< z8%~+9l1uoyY^Zt^Ej1=;9Qaxi-8Si?u~0xL%Ki3r<%6py;&G^Rub^Gp&sN{eK{V=m zZNw_2k&t2M!r6_xS;#lEvhW^eyEIh8!-5cAH1s=`xGVGljvKwKQW&N(V&=l#Ko*W* z@cSTJ7k*D|l5p7=}ig`sTKsAOJGr`#nB*5Sf#g=P4XqPV|x{G=7^gwZ2)De;|UyGOGZ zQm!eha}iDzJA(+Q#}JiT2>TUu&8JA6f68jt_+oIP)4i+^(9)b$mosNv z?ablW6NvWESa~0-<1VAod(*!To&1-6xpPoAwS*-XBFom-Ll_^#I<*VANfltc^roj9 zpJeraifzk{^3epz%<3uM@U&WuJS@A47NC1blFr(=rDj~k?ow{Cxh=g`7)GhqU=QVO zW&*nTlZm(K%(wAq(9Ib?rX}e}EfN2KEao8yjkeI%3?`8}&rxvI&vJ7x@z)~rCDbHeMK?6Y= zK&C%NSSr}-4_zddrpxr>9SB!ddmmxv zu}i;r5Gg^_vW|b~G+#4*jArisR?O~Fo{*$mI)bi-ZbmHHGUtQN6WZJs-2~Tu&DLI*rz)CaU+@_XAmxnHLtr6ze2B+0?eiz znBlFdLM6S*3|QTf+jbw?rqzYJTPyZJ zTx*CHU37wt&@dNWR=NU>8?in5rR%H8rFilNQ)T|9QxP|w934#AjBRB~Ou5L#clJZ2 z!_n5F?DD#|s^vF`$e~jr#MM1Uhhy}IgKsIRtuKfw>j-TvUf^22R3S2v@h6Tm-{pT2 z&HO)#t~(y;H;!jyk0X2Doq5RKBkr8*$U1vx9Le57i*q_ccUD$@*;^Ue%I?g}vO@?V zBt@#j4f~Wzo%5IVh zOT&I|QSmp%o-6R%FN-=pb1$1vWf^N6sPRlTkok8-l>o&nJH4vb=xyxR|N&%mvi zZ==rft}4bUS&hO-lJh#fbO2Tet>L_16}CV-l%ljptD)Aw+AlKkee;(jB z$O!j*M3ol7GNq5DZLi_)p(3HOx7qFffK!u6IyHwW8&qzA@gCc``XyO5&ClEEU(->G zv{vw~gQZ+sYYqSo#?G>0jtt`mxaoj$TqD3gbr!*0S6Mn(6!()a4Gg5rFwz^(Du#ZO z@Zsd_GUd)tJ0A9xH?Xz+u}*8qITp_On)o5S-tl=T*)xw85fpV?L>fO3xeu25j#TInyazHx=QkUv z9luV^YkWN6mBm^Ve7hv<8?cw6X#=ZF_f_6^ouk_p)s7kbd>-g{o$_oR7|!qK&2g{& z{5JU%qko?W5QBf65)R*7ITNm-zu^BJV~pHFv8b!{{uMgwDEzzfvk|1re;kRMeG`1& zmN3tcj{FFy90wnT`yN;t{?#R(eI>o&|0T?$6L}-+{CeNf1Mlj;o_1$i3x9uRRBC^T zo0W0jQa#p{-)gD)I97fn*SGM-_RsB0e+Pd)b<=sI`4{=;+1lT3@`LFo=d9;PFJjIk zi~jnqzf=4ZZmLW8!!#c_b(8nke>`XWKYmR8M|MGX9elF*d1dF!cjLF0jokyOzcfRC zna)NEIR2&=T-^BdHU7`P-*)*CWj$;>M$_?GZR{(RR_*Qm4d5(!@w7|XAwvCiOR|cM zfhEEOPo&4K7#mu95%=kU(UeiDO3C=aD)ilC&j1v2jBQK3T(RbUQf782F}2Wsb1fxI zn>a3*LrUE~-w&)=a!gekVWwJTzO0MHWc2?IlnEL$B!-lMsE6*j{DzxM2Xx3;|G82h zd&(7Z7a)F2HRJid{{$QOE98DeT}!rZOW^C@6Y^m4xA8IqxG6%tQqE zV2_DoiR?uaWZX=@`(D~zk$0Xh)hflihE1#uq_MCl5n%ar4_&MyqrYL((4<6xvOug0 z`Na5+7O5MaG=D>l)K0nwwx3(E5H}XaO7-UGef9t8Ca;=r;vIUXz$4H`-}{=F!mT)9 z7wR*059Ag9tZ%H1O`BK+dW8IZDo`TgxRgy9C@M^F_bQ&;YG7%wTu2-rdd>Elh>_=C zP&KW)?9SUGv<|ROVV>eeMW2dMXGkAKj)wTe;vD?a&XfKvom;)u{!);hG>*-k=rq8zQVq zp%1C6nfld}m^a^mod7yG?!??13FwK1@B* zyWO$Y8p(C#NFFsJc4a8{8p`KYM0_r=#)h5wioKl*Z8{ZP)tJ*V`WlFK)ioCA>@uQf z9g9za7&lIBhD~?Ft?Zj(7Z&f-eRHrLFGTQbql$ejjCz2Wrwp6AqLsccjCHgVO=t%Q zvyND=39onXGM^NIiGM^CEapb4zvmzD7sG(2Hxl!-h~C;1!TvpXR;g^X>K!0Ua4zv# zXpzq04*QtMr*hOs2vl7_WN5N5Hb-#8`5nObRH$w|&&}2#h^R_P@B`8vF~K=eRcYn{ zL}e$H;vPVhk9()H-4OC{RvidC@So|+u49s>Vf@Qeogps2wm8veH%!yLGW3R+aJ{!1 z&}6}>DZ}&DkYBVzAsTx|%RpDg+%MTIb_j0tAS*4tCVha{fTDe!yk~CGUFWPF>txnt z5-qh?^!v%9GaAdt8w%l->#r)B4~W%8*D!O=0KgDDuOn%1^^yfz@@k6n7FnJK_ zQywPrTTe5GBDKLv8{Kd0t@xS{#a3oj72&Fj_}Zj`4Bk~ebu+d#ZFE?efG2p@+2sSc zl2}TKewjP~Z+d1*s}``K`Skk>LNUrH&GHCm#aHe1nW2zs=N*lU!UTwH@%UQQbB!idgfWfrt2vo2uacE%L_cMAE1Z8f&xB-24lW zNl-cah7`j}^w%>-RAK^)g$La`B4&mCQZdsF421w7031hjylK;@v?hjLC1Vp)ojFxJFH5M)DMFuv#Q;61Y*0g-Q zI9Fa@ho7MT1Fo`*WU&Bta+1L}Bhy%bs&>dZW0rgB2tmW^ke)npS4f6Z}18lo6gb(7Tl+jI5p; zhhka*d7J-br_Pvgi93nH@(lkIFPgU-SM?d}SwG>se~b_>AYfR^m45NOlD${bdAXC? zMr|N1WEVuL3VQN+g!~l4wlW-UR?ut7P@`H{z`u3{Lo%mJx`u9Q>e6=&EO8;YN2`sc zjf++?UvJI(!asRs=VABN@tf$Hh-N3`M<6xQ-|Cg%A*g$8shT2M0CM|#IJqIf+ zN4%8^^td_raI8k}lEeq|Tc2mL?9|pJruvPW%Is+A4}2Px7y+^e!KIOG+8*-9=G$Au zd=k1KV9kQ}GD2*wS0piT^es8ATAF`8*zn$DRs6ziV)}MG zMf)o(nOqPN`0hR2F3(DHb#Y?4;_|%x;?~>k`LV0j;(^8gCBOp1`DYXq)rRbgzM!`7 z4;x4A4Rvu9{L^e~ULVQVNSBTFO^aCB9a%1??EotIP|a>#ew|KwhP%^(>{Yq`BV@a8 zd82Q*Vxi@-Af^ByD?o$ffdS+JoSd&5N&)0=(n8{_4ed{O$hM28#W(z6;-1ahFeL|C zxMz5uMl5j778=ROx_i3}^;0tyyCW0R+X;w;pT54m^RZwbGXD;D(Q__d;}1d`+V`9l zej>IKt-zOxf8M_LH&|TO@fIYO>?7?3i!p<>58HT+pY!H zqUD^8=N|x?8(HQ-+MGXyr=@!H&)x%|82>XJikLLv5^TS^2z&)VtVX;#p0jVC^NwIs z@r&8zlPaI)3GanOC8`>Y9K!*ul|PHBAv__ajH1I;wp1?^nIy~?b)&lRHKxxkxMT0I z=c6Bmh6E8qJk>QFZ_*VI7@At?cfpv&v4Y|6DH~UE=4#lZk4yNDH^Q!aeM0?2a*gMh z&fg=3y--46+DXyS@sz#(u(iNa-DY1Cw?es%u1;T~ORdxzuBnmRr35%;lqt;;Ni>yh z)mW}#4M1A3#aXejL!8XFlfj399{&x3i&Y8d3T5^xZD~(|tGF&xlRi|*I#uTqsh$)C zlox6=y$U3gB~7J@BP0okWyJHBqe<5YB{JAh*uOJAHg}ef)J50QtiON12Y|y9*Xo^$ z1Dqas2@(y^5M*`@@#e5N&rD876^(F_XlR6S;o8vjhkU;8bEI0}jMG-VkpA@HMA!d* zh)moAsFRT1wwyV2x@@hwoT|Jz2~5ulx!Fe-8Ah2`!wjL7g7>uij>w9jaSDeLLrXycK;bK;*x{EuToMmESx{%r{7dN5Bfz z6LJYAAK*oNS|*R~0E}HT{6@|#qPU3Q$>53qwx@jj5Mc~*ji4DZ?N0lecppl~K4&+R z`071I@T&ANYAdB8*{Lmywx^rTaijg-kB2ZHfhfsMu5;R^O*D7YCyfD|Z7=7v&a!5Xav$%r zhmF7*slC3pYu*K^w36ykzfil0NIiX6+ZlX#E+1QG4_KAhKVhot*EG>(%#}4i5$B2C zPUCLY=Q#6B$%V&rfS}QvPC>eWIo3(}mZ>`ZV;GSyqPbtu_RP5U^q-?H{#@-;QgAuC z6>6T<-khn!tq7#Tx$1Ww$GHBY(6@U>z$FZ7u@$r0Q!uY}-|z+u0Ew4SCUMs1j%!bR z7Z{tA&H-I8VkFHmha`+u6JKtu1;G6kOoxP`!z$c7uQAB~pQNynky!yfftS6X?-F`I zyC{e4j6Jf6quud*XaIbcZS=~{WD<4rXYgEp01LnZ{X$l3b$3+a&{kPD8a04GX5SO@ zktn)`-ZvG|k_zJGmn)XAk@8UwO|}XEPyJLpRGw2|Rx!WDqUwdH&8`AAk)1bnSLW+m zbYPZ(bX_1$PJcOp){#Xxo*6q;O9s?|-iL#gnxU@VKH`oaL$?hdj!YW$X`oedo;gke z*ATL~maJty179WcWB^Di3d-M5c0J@iQGOw0^uS~<-CGuuw0)o-W{pg^^c`SStpaVl zJpBaY)9o9g&rt$qqRS-y8V4b2l4PV+Qy{fmJWDx4VW^7rMXZ zzs{ypTT6kWOy80QZTJP=aeMqquoaL^=NG;3Nn5lz^d`mb@qUw403^gSk-iVGMg$!zWd#|-YS zfVtiWB@g;cSObo(hG+g8OrNc;=4CFqOvmtlSMI**hiBA9->FiY_FE>nki&w9yaw}~ z3M-eGv4A*WM(ycMyEli6KV*|q+XZTJ7&j4DcLqmbJp|Ji05v1d&#Z}2i#9RLBm_4K z)MSi^L|@zO2R5ZIEr!-PZpl&~A>BQ*18jvwL-G|4Qv;~wN=m{^QJ)WSHA(JIxmr{1 z@=?gOyvo-^ktb*8)7t^b^1bASto}K;*yOV9a0O74(@Yn{T6%Dost2GmooqU6rm`ZK zyr1A@DU;&4d;Gr@UlPKDK78@$mZgrt|2t>!YL*VyE>&J6jjgMzJc7 z>OH)QaA*v9L%a_O87o{es(Dx7VNh(!&T`9nYvG}5b-UE0lv9|8JF+r1##7ok<3sk(I zt%VsL+C;lpo}0bjBCbCEG-Q?0|K#Nr6Aw}cRM@<0!}vK_iz6G|o659Up%U5Gv{nJ2GPM1SiO8l) z*XHjZ-w^-+6{P4k%GI1vnvY})qJcP-%Wxr+Big{k>QIlaNBh_pQHmb}|0+`X%gq46Ab%)Rl(sdaknCNbvh4f*KR#ec(pz<-r@b@~1V)5BZt z>;Eh-D}pN7S^vyCWv#Lr85-~QKM6!#%u}j50u#1>#edVkHytqUYdQM4a(*khKry+| zCh71kY_4(MZ;AXzm;LAgx}^7$7HRD4gRR&41J>}vyrcOHW_KBz=)YxW`ll92skvP# zcX_l*mjhzfo{$dg!F=|e%zpwZ-Yend3HlXX;<{vR%$qBMD?OsB9`~8lC(DW)ft^xV zV|uu__J_yr<@>STW7YFW5A@eNIZ82v^@z6-X1n5B@K)(}d0a)QY$KFa{wMx>Uk806 z)3rF~|L`cZtr2q*7Z1NCq|ft)J;!?lc@-D^_!Tod*f&QnlQ1?TBvK_^tz)u8b6@F1 zf}?SNCyVQW<=>;{+I7q=0U{679&UwH3Aza5zO2keNCe_oJ$k%eb#Fak%e#8;{LQzD zk0~`}*wmLQ!XCFu4p7P8R8KnK@(IrFjjWjBfN;5*ylq;AL5s$&6Co!GaTnBciT@N?I z%~oKX-&$4Oilo}v$$bd@^mc;Fxy|wb2oyK&wK=8>5GP_Uq5TcrUsEhUdc&3f8mi2z zE5CE4i9q-%2-#m?vYu8)dnbgupK`~2Bq2&rkB>^Op*4nO%I7W+$FY9ie%C4HaLMeG zsFq#EwXXzfOWeZ*O*9p`mUs3pHa+16O+fJjHFA=9M9#r8n*6B1 zdyps1rqznph^Lg__-6Z2f`c3wk%6*cI3TJc1jg$@Y=%{&nI;yaLte1$diWKTsnF zWS-e&%Iz8*vNx2@>&Mfck12Z?z5wGF_nENB@bvfG7H>pKqQrTDB^Grb_z(%Dhw&Ku$%!68X2K*-NNHAc4orQ#MiDWac? zs#FduM9xyP(BisJtf_FYO=;~0O{kP7BA#Zn)J&(D$xGU9ww>c6w3M%AyFY$hy463R+^E`|! zhH5s35Z9kzU_Y{?THX+&!TZ|&o}jne4VLMCKSw6MCa7a{o-0@3_Iwz`dCu@BU(wf@ z?ZwUL*S%%_<501dPKA`j=vTEdOdagYr*k-C zqljGGIpRXkXeY$)QV%QewT`CN)g|;>DmI^6Mdc!&!3M3dyE}4Javsq>ASC1Kr+!LiLr~f)%?FVjN-f0WRZS-2V1A zP{n2ZjL986tcWaJ@#rw%-y!csY=-2#<$>(;`QKv$2tZ!W;<8EM;)#Q1hwTf*DZbTF z3hVy?-o)tVrVYfAbet|E`kA1DZo1^9&$*(dI*i4_Y;_x#GE-l|qC{-FpR94@P?I_xq4Z2p9 z#-7GLQs^P`O19r2y0AFxod6>t$mA6HPcICK5W~#v_uRd-4R9+PX>!;+rf!CDc!)36F!Y#ljj>)~@zcvNVw%Ou zrPqXL5Pd7OU2Eadw%=^P3*XnEF3_x$?X>fExVVV*9wGbz@Gca+wT7 zI9=QAru&0-e3^~SeJzKP?+*ghST++V4jG>b5i%qbx$ph`AQiEsYZf`-qWqB5jeZ^E z4UK5%xbpQz_AAGJ8{xh@PFcm8k;6X8*0>3aOyT~9jl{y2Z$QXS(3p4*{avpuT^u}T zKYO3ChcP%5n$3SNnVFUH6P*iW1-ITd?DB9^exf0(qD}L z1+1wTtDZ)?GhZKPJd5APb9me`Q9pqz*5~@zx5w;rD>@9isztE4i{Wmo%XtV5#?Mj= zq^4pP>ZP0u+KKld16d)tb2tL0tJ>R8-ut}i2kU#;QOV1YIo>`-xHgeFc+^P!H{8K~ zK$$BTAjm7PQjPV`f9d9@*K&>muBdaDw3zQ_aP>j%9Pm8NU0zd9hN^MPA%@}Q42Gu| z*1q_u;@xNIeRj4YLo7E5F6gn-WE!j>_SG^Q#@P9v@`XyS68ZKdRaal&MSDb$t)g82 z!5m47N|>5DLuk*`g?!)O_?_!kvzqlUT#X1n`=3ys`w$iH9~OuQpsHuU2js-mpiU6gKt{0_>-vIN{>l*J8Wlx0C&4RSxJ0vq4$BkC0O~(CaMnFXmHxHgnk_ebvCmX;XHs$g5X2%fSZUvw&9!<)5NVH={`0gcFVl6I9 zM?t>n@$mMTTOB6f2WZ{LnX=e_EK5hpXP!L4s-2aJk;4)4-qokn1rD{j3qz;g4@7w7 zN*1IdA1Xai{=-z|RP5&=3t&lHep7iLZSXgdy%3;eLiDTDyn}S*9Xzh!UXw{xY8Vt2WfNGa7H}a5p=l)gN*-#G*$+59KG(eh?1dQXQjK!h zrZKW=A(9xy=NO@xGr|g$n$7n9?gGpzNkzx9uH)`dmu5RS0YgPJq2&_L@!#*I9E{R?#0kdPx|mHR;XFH>}9N={`Ls4LViZ+WGFHLlwxL5l)7X3|QHkyJ3z z@OlPj1K>@EB%hbRm7uT2h?)2tn4TsgIiw8s;p~r-E@gL;e%O5$B`Ji1Xnia}Z{M&D zTybNCWUY%7G# z8*PeYEa$EQc6io3L{XMnoLsV^!gTqb z-_v%q$>V-89f-)ZXowP9&Pj>si&Ez2%Z**!MchzJv{cz|c>fMdd3CXD$xZZSdEYxl ztm_av7yr-rQAW2r@60X%#}`wk0xyxn-b5p(!KYu}=2+QQ-TDv(xer$8XjJi$*CnH@ zlL~py)D({p%C4Ge6oS~a+p0w`fuxx>u;+t+EZs?1J@75h=gn=9lfzK>2qj&WFPQNgapr+}N`eab=I?v;|>1M*5mC)*p4UGEUv zHL|xqZBOM#@*q`?%DAK4xUtn_o@0G|DC7<#mx-f;3vh>7E#EHM0Md9N13&YGIv`p` z#8LvAh|ar8)B0IHU1OZr&sVm{C0@0&XK_Ybd(|hM?7dq*N)!b`%zqbxqgKCqk zhz_r>$xh|0N*>Mwb_c*7ve~bC?O%YalLIVzJ@-Z)T6KhZZ#{YcAEwx9Q)UdPj+ORk z0Saw8ccrvi)A4^ZR8x`_W%1Y0{G={{eiu3yG&Rp`@&S&hT5>R21!S3_)MGw29wBVX zP$DUjafqApN-~VSJiVqi(Pr;lan~(q>tay#RNrcJ^kDF%96}DtuMB*&$fK!hW?1D8 zfWKW;%Lh;2)3RNWVlLK{!@8h(vy(1s(9X}n{0$2j0X7J_xZHTnP%}otYc;tYq)Q~K zWE;gi08OtcLzNytlJ7v!Z^PP(%<3(D_ZMnU@vGlk!=5~KBKOkHqX+#&@}BlQ?Qu;F zo%!YAJ#4a=+Xb{mS~XV(xx%CrbZ;crjaJmL%F8=oQ)7b;OCDmybqWMcm)* zKS~o_oW=?1zEQ&oL zmpj_!`dN`U&vuEccR`9=jP>?!nEOXuiMx954ipx4n7T`3saZ?f^H8^^g+&w!Vl5Y2 znO-LY9N%I#;KE8=b#MCD6xHrkm?s1i2a*-lFUbOWVMNC!T2dDcG4v+p1A6PwR7HFG zCma?Y#{T!LXNNn^H6SYbm=-gJ4A`WR1!}i#!{fFB9Wvn$*>wvK_~|RQQ*&hQgV<)o z1vTygk&=z{j(jwXJ9+-p(B=bxArKSE&clVF`83exs<%swJyi4>A}=$oH3>c{4(>m}9N5C_e_z>lwNFdqjAiE#GN41lbC1$!y z3!@ID(%1sPqc;;F==1{ID9IzUhsSn;lAH2AHy&Q_f?~ESxMV3=i>yjCW*-Y9=Z3pE zI^^P6MN^obf`m)b% zY`4t~Dc3EqR`opH=m!3T(a>{0m3)nkw?y2}z?rN~^uBQ=H|!UMrCLq6q9* zF)WN#*yNq@xi9kKgRe#;M`lDsevatGa#v5neUa~X>6s$*xNFzpQsNyUlU4t=ag)G; ze@4554|#rSaHyrwwx}aLdrp^C1`HNBqwcFk_pWpsk9?LfKt&dZOaR*`+R(X~r5{f8 zkw#1f{6?+3_>k5TTI==)j2km(ZjFNc7OWI%NJ)l$hu6TLjNsacXQ?HTyvtnV-{4*p zP1)Pf$Ocx?V#;Yj%M-X%Ls=y03uDx1rl2(N(#i#xxwfne&>%-SQMV%1$|-5>Cu)b5 zD}ZG}qy=V6R{>{^9`)QlV-%ArvI#d!d;qe`b5HS-+c~RACDz?gd2a+rI{o znCl=qj!KshVl*YMDYtPJVmH(3uAp*{7$MQ14}4+vw_pzaQ`LCnG1#%NYV2T-F^86& z6d^mOqE2X0CD#sj5`U*E3sy@-@P1aO3hO(NT`{~6B&kZ}ZG(bAUIWUpD`zQTcdz>_ zcF3l*#t=D51dx>6akP|^$yEspv@n&W+=D6np;lU^qekiBIW6WpGTbXzcB9^oCA9Kj zbW9WdnV1R!tgU)bsiwz#@vMp!ELQEoyia=K7Kcyhe1K8Ro`M{9xebLm^REHjysz#N zuUeH8S5veD$cOK-8f~LLL4P;~DDk6mw-uTux zw6MR^M!ZNxZ)AXrtsY#bbPY3DLf^aYgY)yRU;po!t3Zu+iIx>5dApE3>h};5j;aLQo@xvS@)WPl#h6a;4plzGS&c@BO-Hip zf=~gmvqM{OFNJyQuy=u2;m0WpHuW20WMNT(!SWtl>~3;D*f{_~5iNGOgsPx9nRp;H-eeGd2WoODbf7u(}} z+y>D!m9w4r)@5xoplI1$nA*$BjHLx&jp$n3IWUD2aLUnKdb3@GPz-a9$A_efbmRz` zr)?@6@>PqzXMe?JOM#CwcOQG=dD7?F>TB)nFHqv{8PlMH-sZ9ExP3=N z&f^V#V`dv9CPTQmCP%&_zmrLqiR^18N25zN$B({DzKI_Eb~?IGO`%oJYH zGr+rNu5yQXhpA!C^!qOAryfyh$Eq%f7^Wsz?6QhD*0NBsPImHq#WJ>kJ^` z4z!a&g=`MtkUL<%`YLkGI@~VS&Q+lmbpLvD=+LBb+;6!1euBGFHL#cH`29kK5swP* zN?)(fin|>OZQBm`rz*5Ps%@sXb`b?Fw|+=L)ee8Wjqk*=I+Y!W{?>cWfT6f`0I#ah zdzjdfc9x3XS=f1Esf$*w%z19h-SCkV0#SxYW(#9uav?UIcYE09oF9cf>qUUiJU<6pPiw3db84dX)|6g8gzI8%OSOJ(L`yE2R5*%*Jf4mVtH=d zYc$AylQqrvM_lIecmAO}V1kdo32=xOO(UuE*^E7rSY^9GaQW_uk!{VD_yh1=9#V&h zL6E~+Nw*Lhay#iFwMkM5gqyRZUs{?Y`Tj!e#!}1k^CDzfER2+%ZV%wMwTc4DZ-ulp zvrtM(wZE)p1g44SxAT|1{>$k%mYb@cbOCA+olUDE@)VvVyD;YDMD}>0!tW&Cf>5XH z9QD>*;9jRKqH%xPwD-*k3J5#i>j)_!G}i|hHAa&x+Ta6K`+^X{jagrgZI%&^KZ4L} z1_ITxV*^yC$=XoM`$z)%4I%V+vt6XLX-$WYs8Jv!D_bIj4h|V$D*lB_j`2J1?|hFX~q&vf#?5nlCJ_oouJZ?;%FaAT0?7<<+?-s3>Dnx!zcM) zqCFe}g=MmckBPk2d0%qJbg0v;%>#{Z0!mcAOq!kJcQ|4rLZwPo4*Ocf{~an`C*eUs z!@d^>jWQ5K=yE}vtJM)$K-H*A;b8!7oa=?LL zi4dyMzFx=_IQNxTYkxLW72|yOmT0`~ejS zsvBHxt2k_Ub_)GDKxA3b&$MGe+|NJ6jkw&HGdxR+nIfa)9e`$zTB)ZnzaDsTiB7U_0SJzQgS{LqrSb0Pq7{;16g&#<{lEg>$X}oFL5K zCgRqZfT(->EqcToV$vN6;DJC=XcBY43uVD{z+2Uz)HV?E`Q4_})ne7eCC0VJx#hu^ zo5!^CR}-z^;Kl*qJK17 zF|r((p2wP7Q$=dJ>k^jua~5i=fHp48+~5*!Rv>VW)Fg@6td3%_DS1`(P)SpR^ z?PCRoZxwTrw^`F3Gn*3>b;)l){Zts=rDt75tZ}Xxmb?A<)!48W<_PG(gB7RQ0PZM> zHL4uXAp3Owvv>SWQe)oZ_zfz1vl?UCLRR(zmg}HUiJmXgajsGFZKJ(#$qy&UC&vIt zo9KF#Dt7GFFU;SEcL_#iU(s=d#ov*<5GH zo{qt3lK4{EppU?77N*|qnqKGN*-$tK#XdcZ44fbC=u;8ldkcSNpC_WlGf zIa$DtO^@wls8CYzc4M@KOPluQ$M_SfLQs`K#9Ll|rpVGHo0~vpKW;?`c%QnLo;gBZ-Uex*d<@KE6`fMtJMOm~lCbV#wpA;@ec-Js@Yo zyuwZLb}zuS*2XkRCjjx!bTv!~G{*|HMORrx-UJE^Lm?+k{vmujEZVE772q{A+Qe9Y zhvx3`(U9_@*nWY<8*UZ$YzT;e1FWwEi#&N1AqllEzWi=Nk$Zxx+2#!?i8k$E$}~Eg zcFl@^JM0{Fs8?3gz=2VqrD#d8d$&aPsHJLsT&WzDrl*izHm-Fa(DHq{CUasZ><#x$ z0~|wE&^ko_@P{Jw*XW)$E(whND|$C-Jvaq*TmJhI7E)oc4n2oAp|7A6!-(EbLb4X4 zAWvRtawIz#51OUbrrMx1$%3=5ol6)6UW9&lrMx=Xma5RkN9EY~FZ%f{52Xbag zO5tSBGaNNnZqDcwzEg;l!fRq0scu$l9TKXdQ2?~=7?x=7TeZ4q&E7>EF!6LBd>S@t z^B8zOOi3fac7=TRdV?3!3&p%&@K$8I2m3aViWR;NPm(q%Ut|Vvk@~{8w1?2GY(ar1_T_ZEuF~1Jk%dDlMOiObGmBs3} z+`AF`rH6$ZvYNU0)Zr%$$PWpTpMfW=L7h}Z?G;MUV`Qxg2vBk;0MYL95 zEKbZV2G z@JG9j7SZdO0!-cfRl(>t2aMUj18)z`Xm}Qj!^=jV2o^puhOkpyu6-g!Ys(Rvczk0Q zj;$hj<;$2g zLMd2OGO+|=2QGA%3aH#E%`5VuF=AEpPmYZi|xiqxB% z9$JD1xRQO6u5vVnDZY{qpE6N+7pG-FP#xe-vWbuHQ%3q&4$oL;SSIGNOB*0k1Z6PC zNF)<4=@LI*8Y2=4o31sMxog>L-)jM1d1N7tSDHg3V1)mY8f4cH1xFo&WeAtu zwakZ&S1en-Rm8ZA+U*T`V7Pmhh~)Tgs{@mv%w8sOGeg^k^0ep5)})zjqpKM&(W#OU z{7l)MdYbZ3Ij0E*2oA8>jn)P|o(4PguT65eNCq4pi)PM@9ZDLpT5S2y*w84XVCODMw9y^uhUv5RiiR24Ila-tZn+c1JCNvl|u zk}cWTN=oRtZ&~^jb~j`%qxH4b#4J~H(qw8c@HPxoUKY=Xlgo>w*fTE=`_RdOA|6n> zgWNt6hZ*Fr8wOdvw76s#!ccr6tEt2&a{V?@*?^0|pyVMg{Y~`%uXyR&S{CypCv=yB zF423d><+#%u{}n4fQ3`Lsvu6hC+@70I!!5GNv0I`+MtzW;2{5cXCoK)P69-6o)uWGfp?&Gr(z{Qkz3RCgr8YOG}2oki429 zSwvtOp__XOG-0N)qXzCKYnkp3AA&C>`Wew==5d#!ffd_{B?*=eo>|#VOZB*Br~*5D z-NM@^&OHy5J!jv>u=J=%8tDe1r$UEYBGA?Ol10+Z7Lw#=>C1i1^oe%76p0&tNpc*F zZsB5zvlS+l$w+v^s!3vI5pozRmNQ^xAec!l<&L%tDJ4Dy$u3SyciGEwC+ zqrsFUj@^CpHH=s05`RvRCAKu1`*BWLsQ-}36;>}3_MNE7%s3_tw`KiYgCqFTP}#PA zJtyK)OsmhsF#Rcfgi{=H?^Sh~-s32lb-4IWsS9E@(+*aU*|W3B@G*m^42jQi zv<#_ydE3*|VW7o=y;624DPe{|VRK1wErHoBOSw)`tcu}zA0L!JJzn(Ub^;Go6aeVc# z5WNE=?o#&B*s`idGzKVvea_z8MiQ@3rDsL17+t@zo}P2!uVty^8$oY9e_H|WNkDhHh- zo_(p5_qC#o%rMM({=Wobwyjs2`E_@^cXVP=jZ;0WFmr9l^+(x;5y?pL7E+_RzM?&( zJzL%0(x>uL$wA$yjM;$tGP8~B)kZ^UYE#MxMv*aQSlY&D&{)DD!`N2F5bF?V?Y75cCSr&q%hb3xj~y1k zdAY7`&f>@)l>urjw?I|i?%A0F-GnBDv6u(VKHbGVREEH;hs*jcFrglLBZsvaUPSyI zWswge6pWn4pgVkf5I?j2s$7d3VwWzBV@PI~Ef7OJKr~HS!02e>d&4c`?d|Zc15+8{ zYrQ>dfZ$tJq8`Jh-wLsVLbAMAq*^43yc`C(DD;7Ad&!E$eLYT_Qy<+OJTtL`r6hj83@=EhHS$K}~N1dEpa- zNUbsReW{_Uoqi`nATPjJY&h3LrUS*U7J6E9EoC^sDBRLT>3Rx`?1SzEait${NI1Y? zx25Xn+0HCtKo$d(0R%sW7a7NwG>B|K0JD22sxSl&w_8e%tjj2|X>+n5IMQvSl?`kd zM2DsxkM$KWWJoPTc_zOVNgEg?&m*O!3XKJZR2#5Kx@|*Iz`K=~CO{Ia5nJN8 z3F}$Itmh}0U_NoET-N7jmlmy#<0us^G3)QPA-Pf3m2Dv0j95NHIoUsExYN_a(}FF1 zO2JEgl4R>6tEC|k5*KGo{B689U%jVMa6l%1h3i!j{a~QB-AT-7$kO+-lis0<1SjEDP1oX%;Uwn{711#+-N=T2pERE#u9jY>;nQjSB)Y znPkPB$PBm*M)5EkM(GQw2CGXrnV8uHDqCo9<*4f=Gch9Hs?2k~b!ky)6=*uUtB&u}c}T@#l6SrRw$aN@DT*l^oaG`xvMLjcPMO+^f-L>vI{RRF(=_E%kI) zGeGfoDsTIDA+*tLb{J!+1r8S&eA7V)&UR{*9j}wGzjSW*(mag;xnY=-mA76+SyIoD z3zarVFE+mPV!fQQ0$oy+TmoyiP{hR>T#@BZ8{s`^z$p7 z2lf{}yyqrB^hX#y$gk(v*f|*vuh6EpY3}w38NIkcppDuUL7b+R< zUkAD~i_6o>Qm#t9{TyhEfHrFfo|@rOnYx;f_%FQ!n}s{$KxIoC$V*4mLvkFld`Pp8 z;x1ESsBlgybN?AtRFJqrgN1<&#xim$D9i?yvgZgu6R&YOOU8u-e}}gEi#-*WkwqC# z0C|jFB8!7I#$U{KySv-s3&q`vTX8M!zPP(e#?Mfkyh( zU9?8(=tvk-kcNy^JOMKj-d@I$1()P#BknOcg?25uM%47>+4zkO2H4a98P$pi`H=S` z2j&%ehuhl!f|8U;wuyKi)4YDw)DKfY6OKsT7OOc%xrzB>1e5li- zZ3OKG*6|S1UFJ3u{{e1qjzs>EG4c}G9J;#6@f0zzdBDC$XO@&g_%3M3c-<1Se9J2s z)2MZ_c%Z>~TzSs7yhVT}S zNZJBg0p+Ww;458v9D=@hjR*p|iS}MyIzCmVtNKUOOsE>M!IUGEvXFbEJn22W@WI(9 zyAjO#`)TnL@-Vz zk!J_bmy1CPR4TNB@_`mo-!Q|_3rq}g=x;JHarvR0NMj)j@ZsJI_!y7|=EoNO4q&@? zV;j-*23HbGNh$mT|C8TazY`4O^n<#6H@(?X1`#IxG~Qf+Ns!Ni264zxX`L|Aq|rgI zt~HN_UxN}ZtObshU&s}U0$kqDtO&+CjdvMi2gZSgW zmiWw}p`5xKEw>w@3Xan_6k`v(r+shC`G?n5fiiEb_SI^X8YFGvb@1U=1VOrA5vaGT zjTrs(f#1zMlbo_s(su`$t3gp`bmt~@%ZrVF0KM>a0^?PqlXBODZ0&7bA~r#~yQWUU zVf=Ghb4-YIm6nrn zJy~a&etrycL5rQFYDJ~3LlJ_@5@`}rqxFdcqf;x_wDqPu%+AK@8aduR~r9am@c z&GD;IKb1*qvdu{C@WF^LjetR^wIJ4OM)0Hi`Q>Ki%CJ}L9%ye$6D;B%|J*2r=#A({-5gQ($Lv~!xzqmhEOu!#)t|O? z9e19z_DZj@l%5+%uIZ+^hNy3DKvTfA%9LiA;ggO-_{**OSZ0{BQ+h@DFQ*SzvWLRH z1M-ZA%K3<{M&ne4r&1GG!Rr{&e9b-cth-yYcN4sg;kyyL+;G=o_;(VnDwY*rpKXP_ z!Jw)mZu@J#Ajjs}?gbI<#(gcEyNfEV?Qf5Rf~EO7hz0cXO9cutcVpKvdgF|@W6pv? z>yurN;~LRy%-_pRo2%VVG4*M53vHNobYn{9?9R`?+XnsmH1*0dW1vC3gpnHXqQOW= zJVF`3F+tbtR}5J2Q@7YN{PMJPb@7*i?zwi6EBNK}-3|g-LeeMC@dMgRL5yqsk=jTL znKSffsjQ%9u`GGwWj&f(e8j#B){O@%exF>oYI)+*EV6lOFG4MD4_=!fZpVc`d$rlI z63;Y$_I*ko#w<0SMf-~PUPOnA^&H8qbLtO&_CyXSG2J?pMKRr8C!}#<@2BAkqYCIH z3{6A5)gVP$K092z?bfDRXJK}eWvIm z>0Cp8p*I$B?<;pv{4C`KqVUTj_}g}1|9IRVK~wK#s?_lY-1*a0pQ^usjs28+7AXvm z`jqZ*U|X8tZbfXgc_~ruSxS|hN(O1eQT-Pt7jUCcwP6tDg(yNX?L^oIT%Z= zY~JZkU2`MP#n&-qg6zIPccGF)lfLpZrbcG3Ft70f;hD>$8nZblROv+W}0_6K@qrVlG&TR!_+q;~WJ7MuysAGTqxW@Q}0 z23{#s4`fc_7vW@oZuqu{T%&DIqh*kKM%;fGjpVCKC3ziu4)a7Fypuse=M}fAb*n}z zc`}Plsb^TGdwW<;3P{>v5*F?P?Y?gRD?T{#Fz-^3sRn;d5qV5UYoVV75T6|MC1F%B zJCkGf&M5DX*U8g0Ur?elseJhwVy&raReW%$89+6bA`DtaOzN|o3Ay+%`dl9B5RqhE z6EN*kRHf99Ij5p}N#a=GP|w zM#wD3Q2Z=HBU6+B$1Zt+R7f_iBzeK2^eHkCZb>J|$b2M?wBW_b?%-5=7*PvAC-Ik1 z@qyL&^>&_~!j72DUWSOY&ffkRp^UunHcLH=OkScu(A&SVi^6OGYlJ0r0F$la*Aj_` zxM|SAgN$=f!|Mp1F?nI5v_)8KTo(!lg}ID%3|>Nk-kMiI$U^yV(@5QE|HE6dE4KS4 zf9wGALZ3R}t{~!Vta#;r0Lw5Wv}59vbMo1b0Wl5W-#sk^VW@Ee@}uKn{*Gx&1SA?z zW&V!wi;LW(M)t4<@~|B|R(fb8ighwxWCXx8B6HCdGzK(u4WsWaEk3zHA~1MuU{u&oCC4KT$&7j%ZxF`R=$%V zhno!Wq9vUm#2k6SA*U@If1NF;j*Q;vIN0MxPp*&f z>92_%e`$Ywq#e9&*OE_wf;Ir5rf`COjepqvG%Ly8a}G62A5?=r6`4r`%gd{HG9I@I zt3Q&fJ=#q{3_?KtN%xgw0JbF4oh(Tmi$MZw4UIU{X@{4PR;^fBD<2OdP&LNSQZNB) z^U7qdqnfiU<~n}ihBov`rhISU;0jE>3?iFD>Js`>dYv^NZ*=FWO~s|DkKK67=3Ag| zJJ&fhC_*)PY$g@5e$2~u2wUyxn9)#!P3wqm}gZ;DBpo-b# zM#YjW`5tbEIUKGRfmTwT%**5^OKlt>f5Ab)2aj$WS{1yK9R|}I4}Hf59!`{D9O!H}l$$Mf64h6G%1TAi8u659{MH=trN39@X+>8OFPNH*7$fFFr%-KO>YU{v) z^j;|PoDjI%GNcKym)^`-V>7G@)PGoI&E&Rqs~1>fq4B=_Z07NoB-0=_I?CzJ_-@06 zK9=x+deNw6AI#6t3jq`E-zXTPg0zd`V8aEG8J`~D*6{^&V4g`cKMSSH85=oJ;CtbY z{V^t}XIbDhD%(!?j7QbOF|y%UWwz`#yq~!L$;WOdUCk8YfUD(39%&vgeXMZFaBG-G zFE75SvAl*~&r%u?IF}G{DKP8H>@=S(K@$rGUYsAw_P?J74}Hp5bH;%< z`-ieE#!U#BH=k}SVRkV27(~5zRK|pb*Gc97SUF$j7;xyJY`SPoehE+NX<|y|k(ovEn z1Us2EA(@RhT@v%4xNBg506L-qbY|fMJ_r%o==0ZEvY{{NWZ^QYko^+O+I(s|N&ElZ zK8Bf@uW?<7nX2EsT=z~q8ttx1g?>9MQ10$tZ2$J{?=#DlZ2>2uE%GSQ$H}>YEn_wB@O@wq!j zj$du=-aza0c{@g~>t!nQwOoofA|$%m!u$FATyBo&*^;&^xLSYP0r}vVk+3e*!hzt{ zL<+G``OzM|UKrhKIN6l>WQ6C z+W{%?4{oL)-|%dH9#6IpBiauR37J6XH^8UX%ibym6m1eZJj;jZgD;M=PJ84**kRTx zMc(8V)Qd5O{?Hey5==^ko_fRO6kn3_-genzO_(HtMA`gf6;#{+71;vR{Nd48=)*CVtF_sk}vpiy| zIz}!I6fa6AL!@L78xm zbD8t!hc~)z#nxEP)$kw_)a*;qtHO40z(mefb0i4XD6g~@qnrM?AA#ad3D-V?2>|!D z%l6>i`f+);uyzLVM1xVylmupGy;r1s9$K9rpDzY=@hA%kNc3>ka$jO_I#?v)FVtr6S|_@@z~OpLls zjg@2I`Ui7@*xXi`jk z&zYf5e9w@98Tt;r18nKC61b*)Vz8Fzt$H$#-XT`f=)rM+XzUK)@4STk=zV<4tX9PC z37kB7KIz!dm^l=4=Lpy{IO^HVc25@!n4zk!7;bX-%#Yl-2u03w;#^U&PlszCA34*4 zQsf;{elwF9JVs7mFu25kg*xj~ID0CiPocRn?~D_^8qXF9mJVtlNPCs6WIRICPpNyw zu49c{gnNye><+8as*W+vdL?t!RJ|1uzVg;olg|4Cb2P2oNo+MglS_0oudIANAy8bm zGdS$`@_Cxp*f_FVJopzNTnG``2k!}CPf2`}E7Fpo)c*Dlnb+!x!y#W3Val>-rC-~+ zhJ`oYW7Bfxpl=O{pnHomp)Jpw@!{C^oD0vvz_9g=&c#KcJ3%F}{R1Yy06mfY{lEDg zos0eb!RD>)@XLds%p1oO>wZp#nm>lG8H}h(G198lMjnLr?k!H+q$}dKSe_m0+haH1 zBDMO1k1YoJQC?}BTdZDi>71Jbv3F3(H@WzP&|&k2$4anW?CTy6zpm?4>M5mY)CJ1* z~YmCD~ z6>#M8`+hzwSz60GVTR4RcO2q2CNAU=NiaGp99n*4wEOsm zfLZeipZ%9)@;`S==Re9X!y}Pddc&|J6K^r(Q;~{?zjN;>SEeEjJPZf6^Ga|CJlm5# z)o7*-scXkBYB3Puu9$>Yta7ar@oR0k%W zZ4=2dRHtEX%G4mwqozzZ&kXt3VL8VJi@RsBvaB5AqGQ zTWDT_h|yfnTuVqG#C{q-yw!dUVZiF4ae2iajYM!IAeTz(5|8U52wxMT>>%}wVoB0g z!=n$@tz@3(K@3N&!QK@6$K7N=Z1+aZ zCfq4CL=P73VDUp7e5pdQA0?3gDjem#dT^mQ;Y9$f&goGb|e&WLj}TMOXa{J?O4^UXq)YB zUn(hNf4wOYk4^XDb$BJsoZq_N&|REX`d{sjGe0@ORs;ON8aUC!xAQ=T@p`n>sA}OS z>7O?H>SPC1gT4!F@jF^p;$=c9+A2V}i?4^VN&UG2{cJ*s5;){$LSMtMD34vZ^fFfr!1Bm}$6(!XW^Ea!I(_Sjz+?%A^d6S1`^m$}>GdkI@_SZdZ zwL`+W;Grb-MCXP;mG}45R0|1jJ%IWGFj+PegPQSIh+Q}HL&;#Wb?vl4^7|ZguQ6+)96WcEYNjdjUPtOY%hc&9OR08wV zD@te03QCK}TN2Gx_*yE(ROEad^W9Zt6@c6owTahutS$*-lNDS=8)~3LZ7qb(h4HzA zqS#2MP8~4hkXS)*ZpzZQ(?QWqTL*smqWI^>NOksk!|qxuGocn6PR^H&?aK6YDXigt z>$Bypmbo{MB7;UNF;oH3x9Y?BV3a=<2@yaZa9gC4C|^23N_gDVuiZRn0)^XTUjif^ z@RXu{!q_(}wh)jXQ*=Ftm!(kh5D)k{EHN}x%$u$-;lk|zRu~gV`rH!&>U2}E0%qs} z4!>9AVwqGaH4xvV%)$t?M`re2T%~0_!E? z!@CICcIv|7%94W36?gB&;X|2^XTUPcy8Ox6m~s)!)7>`RC1YXTG8t;B<3E@shLVhg zLs<)vb2)6e^Xg9X?zJAxXcpQ*?MXedPr}9smW7gnGF$)pvBe0s;SCckeUZ_2$;cre z%6#K6$)gt^L;7emWe7V$FFuZx5o1Q+Y!AP`kBuMpi}c^D1RgCKVETUke$e*_PgjpFUJ5O%u%72^u@|a z7}688iv#UJY9=0aEUkFsa^hoUZf3H)H%toQEADY9k!h4#=7sWe%>Z)9rtq034etRfSsmu%!Z*DR-i(KYA*W zoc*Y^_4HP(hbTW5NcLFtAIb@aEtOl9nU$9pt-qUA2V5h}<_i)-NH02qp+S-x)qu}hA6 zXp3!IaGIrv`RT@fP-UWaL6>V95FOJ&Rfx%PPAht#^7sx-WEF*WY^iTD$;Sb~lv>q@ z$;DvR^8^s`3T2@-cI9853YXq;u~DZpJx~`$gBH??Sq@D%S|jWmxs?*w>bEP@5zS(4 zFpse!Z8DPIw*LtRRsfUXtdW)fs%m`!fZR=xEaP<=m=N>*-~p>7m-8i2hWKl&pc!H;}B1tT3b8B(R!)hBT*gfln@` zy<%JmoVv~zxHm;~0c5MhrS;SJe|=RB0?Q*y>hed()109lNEP-)2m_SeRRIe51qUaw z*~%Y3Fft}xN;-ZZ%@6-ZCL>)(E4gC4fW7=t*td?tXg+2~4#>h1)**wkE7JrmOMXmJ z=Zt8PnzpS2cyx?3mLA;$bkhFF76x2T10IsZ3_k1i-LL^gS+8=!g&4`tX*dd=;g#9H zvMYg=`xavQHZ?y`Y|0=NvPa~mk@6RQZsz?Y9eo{RtQtWDTi0Hy5{b=%N_|KpRJ;}c z=eML8#lIK~`my~xEvfWRu!e+``{1VHy`P1Pv^|nFfRIK5P+XeQ;a;pkZNZjj%m(=S zIS=0FuM8i8j|mKmuwJx#@rWuy7Om%ZLe{(%({GXMg-9CYPpaqoHsK`zKGm~iq<%7) zEh@8A15?^#}d~i zZdhY$LIbvpHK}$Htq(c5 z1JvtR#TIw>Ll#a}GW1;Ds`YU4Bw|%dwF*$Q4zP9VRtLp?953zQ!sJx%c_D;sF~IB7 zY_S)BEx5tPHseg?V1c@7Dz3|8fz@UxS1Ad-!IE$gdxz7w(ZM&NfZg_NglstO`pv1} z!%nd+_#!x0=~;|OCS9a73A@^7dV~)?mXxTf4Su~L3M7RlbPuSu%7{@pLb%!w&G1!O ziJDcfJuKD(3w@WRX9RJt=SMB>c94pUWSFb`eT(&kJRqMhCVIXh@v$Fl^gXDmN`Hgj z42)9G2^4TX9>nm0&tu;;7i6KcCwL|@1!}oEMxHEId@ZrQbGjpTh z;ly||bH+Sk$2d`QqO@bjc(QZ0@rF2~wWs01bs|c4XW-G|dX3BnY<==bH<(5X@cKGf zYQG(HceTR8JIBq&aM|hUz0ly0;B|9f`fa=L?#L0CA9X_FT0=zK$dLK0FDPWC#WT3> znMv`3UuJ`G#E+XHvs)ScqCaA*FPHg*cj8Of-KgV6xkEBuP>imK^OYO=w;?RH(OOT$ z9nO&zYL$PZcnPSa-rhK$idf?1z{<^!(DtHIFDNP69o4wH<#xN;6|#`87rV-rN~d`MDky+O56m2 za|$uKkHR*D&~k3PuBUIxaCu{Tin>q2YpgBKDS@?+JhF#OaE=gp^K*Lt$u~C$^Q6Bq z@M9JhVBf(FoQhic^J!r5H2l{}&GF*?{Y(|M+yQCORGimdPfL?yD-14m;?BRSM#{l` z9ekOpoJRkFshSXTE>p(k49 zvAZF6_A@L@q`iw9Wri!DvXgCzxi3b{02i_ifr3G*8=$O{ZJ9feFG5{EZNP<_W`?dt zey5EPaFFCi)p!nPBpp7-pQtA;!zZ(}k#@o-=30cd0QsXWHmA~s(WWLKKc8Yx7;J4% z#JnmddKC>L@)$iJqVDD2eT<|feYt}8Jier?ys)ula2pa(e+&Co&ksOqG>d_T>w@yGP4^084xH+!0XG|`HlvW1 zRizxRcS$mCOK^;*Tc*tPB8$;`I{9;v`v*61TB4rQN69sn2snqQ5Ebcn$S1Y(4r>I- z&qxOUHS0~6vP(wp+dmaU$l2YeZBl}Jj-w8F0*dX}5o-(rQqcu7I}fWaeG4^(dN&z2 zPo-`EyrjphrOASs%7ycW6QW?zBJbudpF%@FfpATWg!N+6|M_Q{bb;nF zbB;tS(1C~wIRRTnj8wtPhUDkihfdK1F0^uyB_`SGR#QQKT1g-QFnWhj(mH!xxpD_{ zMWsV*xs_51jUS0Q5^Wac2sk{UGdKVB%U1HW^CC0@urcNDE~%z0UsP`k(3T-7-F+N+iLGqgS|`zioJPns)1q{^K3SALutjbZ+a?`n;YIy#3~3JsqY zFHssa7gy{VzpemhH5S+HsGq@3O+}Biy^V~GN}q@1o_k;h5xyVl0E?1ZOVqT}x^CpK zUg|T+89CWk!>9n>N07Jba}#T-bd&O%k3|>h#Jl4boRa0Jq}Xy+!|L403o%vc)jR5u z$djCft~M^nbt{o&);Ty!-u0P;1$c${ig0B&9Ncj$qQ}UEx5h_9)WKmzzAt9nyum+S zCJ#=+J_Wjkm?H1MO_8EJeclkKV+PHmh;fe0QR}yOlCDZ$3|g?_w^8;e|M z2y{oTza71vB4TcLY<}&?$o2;Eu3}t3jH0ZSnH9$dlrLiAj}@}Dq#N@`0BE{yA|d8v zlhcFR&|Lt25NjwAd_S+M)QenZ8DJnxYWlsH!Ess@>+REA((V}}V$w7<7A^I>$^8P* zHV(OgwRQZY%Utf=d@lnGZojJ?J`Eo;8>rU*UB?X0y|x)`082w_^j=*1~eABx70o zO|flbuI~A=I^ww9_!0^ze0)8|RyUxM+a{6Bw9z0VndJC%#fsLsQ%8p~bjB@ zJf+b)lM`jY#^vsgLFjU8-iYx@LF(l1_H_=!SKf^j2wu(7@GMeP* zMU{wA1}));U{Ij}I3=H;^0)_h!cwKtGDUi1X?R2vRW{K$JAwNK#bNh6fKX7j3~!e3 zT%OYkGv$jehcV4!_(FKxReaH4d9nOr3g+{4pRAmFBwCjxX(&S4Tw;#XCH(j zHIeCki^oy|Tk21U_{$^9CU8rBAs7{rMdnACq_HssR!6|zinE?Jcyo7VH?YlGxzEQG z@x^2Omd5*1wXQHl4VlBJHo82=aCj{c{2EJ0Nd=H&zjymgb6(7tQ}QH5nyL&qDag~~ z`JzZ;GlB62a{k#6mTiwuji5wx0KOegNw1UTrAUe=~waBp~GH%#iu< z65DyNw~d@b<~aU9=8S$)6^Y-InU;RO{K3%)bY$L3=|>k8qq2le(14CcmxxN0Ee$)c z55dp)1|5HcM8qyXEBR_RkU@GTYZ4NL<0BT|X(ns-Iz6yJR@N%%s_na`SxZo_Bpkn3~OGpWty)ghZnA{63I0{;<+BX#{y z6e?kqu_ZL`2sipEXsE2|k+FTzKm|j++w7Mr(^GbeBGWlZQQ-JPzJLQtS!VnuYl8!V z%Wy58$srmupQ&K4O5sdAB5+UO1qDO-`xssTjLb;~M)1#^+F-!cT(5aTfdd%Dv7aXM ztJKN!3cJnQg6()|X2B|J_G|Z9nhMWdcuU$^5FQ1pu1M|QMb1K}v+sxxZ+`F!slkT9 zC*7P!goS8T;_$@LDm=weEk=MCTJkP5Y)c{Q;iF$sD`k(Efkbbs^Jyyls@<8o0b=@u zJcWS^Qw#PajqEqpBiOGe;qaABP;OvIt7?^7qPyRsiBw5iRFksHXIyucHA7ecLO8)m zLQRpV6bu-ga}n&sYq3h@vEAWIoTi!mta2;maxaBIG-wAW99G=cx;$R zz_l3M<*tOU`kzhoV3$%H0f;a|QiY6e9+ZzpSI~u~t=eMmeOLkhD1@HOLsQ5KqX=;v zvtq+Iga7Nb;4aPFq6%1+PH0pIH5W4zjE;2U_Z;)=!=vC#qVm^lbD^!d;;ZmQ=q6yQhtz>?MVNh@WS0* zCfPHRFpSr(_OBF%VENi9+AD}7^2Nglr+&mBBx4vd2M01@kS5N(ScM5fY?w%g70Z{$ z_$=aY-wj)y0BiyNT}*I?l*8z!!PXMpFShdKP>vrzlA*~ArVRO$(e)}~MQOkaL2^bx zVL|qLFr-o@`SMJwraQ7Ishfw7@`j4Q86_`e+MA2^q5P_P{R1eK1GoRwDqKiX*+f1< zD=OFYGmGhL%3eGf9&LaWnFjweYakwl6xu-GXHpn}xV@6{*EB;}^%5cA6>FeSTo9=Q zs!9ytJ7-dkG1nlE2uJ%-(fDCDrL4K%1YI|sKq`ty?9RXzDASE$= zT3qORp>!spLx;~GxmX1J7sX}vvm8*pG#Gy6TN2zMGl2g8#qv%fWWm0$@XtMDSaE^S z=l+#tO5TJ%k$bUDOc@y&zMhRYAbxgsoi2y4*2%Sr^loSb5ULNy5%eiHwMINIz$T`u zTdXw5JGeGjUbo_ov8l$-*k#|4^2ACt-?h#a)WDVY0;Y4;+Ev!;`3Z6z=(BosP(bNjcP7u1>q!Yx`Ay*3}&JwB7dd#pAdtX z>+v`7#z)oT>BpmD_%G9;7v#2d~|@jt&)F?lr60VZ@o)5$+rU7 z&ecxxT?e(>@u+~7?@InC*QYedkAh>>26!OaZy+K%(%<2S#q`Yt8m?`kKfcU+!8;hI zH~9ppjmeJeo*Gg=XD~$v5T@&k$E_&pgc*H%{^b*}#5V_j{CEs z$PK@xS)CyyYRzADW>8^aOWkhq@gu>w3*1M7_F$f^-zUFugA@^Oyt|0L{Ya1uGzU2N z)aH#?vKA?gc^H-87kzwTJ6Jy>#1$Fc$WrOK=?w|MqSOKHw9qU^i~Sy=RCyjD4Uk?* zQ3J-@wF^#{YC^xwVBQqekG|kXp{0r;Mi?tKpcMJ%EsO`300L>vL>*83m+}TwXk0g& z;y@x3r9lcHk^Wb54F(#4-0MAO8*Ct<{bV{;nWPoKX@eEoOVk=(Gq|!!C=68F`P{XV z>=&Gm7LiByG2Z!7f8Nmoo5F%rTe2@PZ1=6KYDM>_V-N+QjF;s7XSJ>pig* zL}KQ=#F;M|1*{Qni(*QE*Wva5a||f>@oryh6Gjl(2&X6lc03`8H(Yd zfv%j&aIgfO9O@&z5aTz*+O2ud`VWXgjG<(;8}ptNRZe_(9YCic!uw8i~Qgr z+Q+$2nw(E{C$hpC_{DgHgxP6v%b|v{0smveJ#9cD`i#Kr`mR(nPbmRA4{1+TB_{@3 zJ>4bbUQpgcdEmVu+Pgl0^nYjPDeXj-5RJl&{{3A)&ys#l?fo47(xA2C3D|amNSpDc zc}$!8Er{lTT#2$G^{J|; z#!AB|T6mA;IBPZrHxn&GB*-eBWUqXeIZVwu_$yDL7nZQ31DkQ51J;vjy}SWZihBxN z$7+5uq`ZQt;?P`43#6uQ10;Up0gKYgHlem5>4j5Rs79uPi*j+#0bn}DHTt^2|5@Su z$%vA1uiso>TrxdG(^+utU7|SYq~`hQlPYZq7mICs*xK1C(4%q>@P+D?w+&uc%?Wrc zZb@gh=XYPf4tw`HpT9+;p~tiz!xH9fOU7$0>cO(^4!l$XQar6}@IkIPpT4gB>QlN4Zt{25iWDw-x94W`;A_<0 zbeJ@s4OcdBbFv9UrHx_h2g1_xYRBXYbpW}GmEp|>bP*{2Y4nGyV3e*amTR{cpiqjWt&dgow7rH?J9S!n&PStUmZTnJ~9jDFUtqLl4em- za6)CvA}5XwF2$nGpR2YEs^h0N>EDX$AY%PfmP@_euc-32ig;X5%mnoo-dtV0s@&8i ztFE!s>F2LCS}PT0YHwOwK0lOQs-;hkO{fge5^>XCLmZX`S(kMrsmG<01LSSo4+QrF zF61tcnypBJMo$aM{pe0DTW`T+dpoM0s5oU9%r!sOwOV8w)OUpft==p6LCd2r+kb&! z06vg@LzZ)R)l3CED9_AGgf9%;491`1ls7Q{>Czq>u4@wh; zuWm~X*SWLmM0C7GiPoPbt{L}mxW-VEGUxabj=mz6EQCaliBp!S4TGHW@u)BcB}1Z{ zLV=29(M5xDw&?Oei8?OlfA7_2D9~AzEq)Wtz^||By>@VfuxR89E14X#PXDLilVyb~ zlsj=~CPa_6Z?(w#BH~o~_|yL8smaV`cTz8DajLkf_4-RkFS4BikZ7Y$w0X!ZJ6x1Y ziqKvJS<`H;ev49JPD-uBF&75Ko1d#l>&E>rN*vIh?J+C-Z6P%!NY(niNC?d?*8}>WDHL=$=>oXP#)8Zlmk; zN;aevLM)EutbKmILP{q(TwS=4&0-1YLASRsC!@ne>RS@HD`1oSURo~C{U7qubFz&J zuH;9`7QT%ExMVbI4uaXKXZO7<#mfRgT^$=qtiJS&x|_2Js9-fivqLbn^eR2B+AGd< zR53S)rQJeuotns@68lW$P?eudXdmonKY0$W^~rBZZrH)7MJSL>KZaB-edmg?1M2=# zdFHA7l!wI9ilybsbhCEo|g&T5Ms zPRHsNz2B+n7#U$;rv^+6GuQjDwf<9W$4V96HF%#7?c$Y(tSfz*Wb4#X;wFK1pteK{ zc4yz;0n}stEqu&uX($ig{g44&k1rVQH+6-GayQDS?ZRi&eqZI8amb;2+!=<=l&IA) zTpz1e^nTf_f0sujjaOrq9H78^c|^~`P+cIgUg3+V@e9`o0`4(4Zgvl-8l&c+V9fU` z_U?cp7FgblyC&qei;WeRZb}u;uTkbe2#pqbSA&j=_7UleeciRPd5}eEM|hHY){&ca z6q0S4?oxT$71%fGBRi6gY$j&PPcVM&<~R>JiOP6XGNavW{eJ zi7rj1a-v4bc#Ac+>M2r7-j^NMB!l(2fFiC_8e8Bfx7uOk3!S`#0z-hWb2Vdo5o?87 zkpXjCN4sQ4!Tl8`XAJ1;J+|ciOT;5}M3J8MSF;KMmUZf)B-Qy#>R?3$w}OkZLp!ji zMH{}vJ34qru2yaMgYW469d#S)WvFYHQ&CU`71mJ}r7q1?7R*GEEoc{@l^eysfT9+} z`4E(7@phl{7alKTfb87GF`!p~hGTY9i z@>GAV(|8}X;TL5?Q2aacd`DRjRQHbj2HS~58auruJ=%YNqftR2y#d04(l0fz2guM0 z*-XTS{7GC=n*2vdciH14RixG%H?u8;GdK&ix0f({fe%P#kKYaHiwn_L5Ng<2nawf* z>Ql1?hn^lgW}Y;Qo8;blB}V%0eQ3V1=TpZF6LMLi+9>C9HKF_=6HJ)f1Z%5&aR2h< zM(&7fR9Tp95k^x?j*%uJ71}AJUG=C9^}S)Y34X8gy_6! z;)c)BIvpwvRc{yFg`hAZ?NeCGcXaZOh#}|!-*=CVH*0pI9Y)vU(pj7#61Zr!1Al0EM@QbI_POVeH@yOgg}LscT#K6& zJSm~Zn;uJA*=udACwuCvI3aN9&H%%^O2-M@M&J>Nsd2j~&prySBeBtN2BGp5vwLNc0N zVM0T=D*SrCq4SUr!F8&ZTMrJx`L_7@o%4qCe~dG#3x4b)dCj{(*lv3k7C>4BScvrb zT0;nCLq&WCU+Vq?U;YE%{|9jY13%w^QM1Gu?Uq)RoyY1O)4LvVk}wc4)&CRY@}HRY z|B3naF2?A*?Opj3z5jH}I`)JpU+bnP{XoA_^&4XH;F{j?;pD0a4*y0| zo?2A>A*R3Q9(AGqsB+k>@Kn|;3jb~5MitP92l(e{|!=SYn2W1f#_ zZ=iPVEZ9B>kO@vWcOiKnV9+QdxnRq@_mGi(Tnv%_*F83ERJyfvkC!C*ud5IwaxeD` zQjAz9--h%`VR(mayFUN-izxZ6+m7+ke>rGw3Nq}3qLr(FyuM4sAP2VNtxHMgFTEY` zRQ>?H&=Q_ch=GV?Uzlu7EMbZQzhPcz8O(X1W&}WJwy|x8RGb%Da3DAcC3^Wv@6Vs} z@so(YU>>saWG2eH%fD}ujUNB3h89X+o=_JFE!0n|lb#C*gF?}|MBU-aJ_L15q@eke zs4%_!aEDWY7Yk+vBDloCiX9;s_pCxzM=25B9qPosZMP^X1GdsE;7D`bJm5raGGa1B zSXOUij!9B&y@p-T7MfgOEZ;Mj3V1ZHS`C=-L`-B$w<%9yvV3#LDLAPT^n$ufmTF6vH*e@GtQqvL(B~jl* zt9D;fi<*()ioHS+FUbdqF95fuZorEwtkBaZ)_^U5M=nU1wv@zkYtnqo@6&4&YHoutrG`p|CPy7iHDp%nl|IO#n%rI}bf?<_yR+)d>EeP8> ziyDJ!qs#o96+T<2+KQ{#{QE9V8a1~Bu#s~XdGMBwIE{HNu#U*QJ&O)FO*^AOF0gqV ztj)B$OCT8dO;|t(i|g@)J+c^+p>;!I9)6&~g#+n!@=>7?!T2$>%_O%b1A{$Us<&%d zVqRpT*xp8+mVf6vSFWel!3+OO(0`F8jz9|L9vFiJoft{5`u}0;t>dctf=5x6Mx;aO zPATb-l9E0&(jncAl$3OHXi1UoZYk-M?gptt_u<@q{Qlm(_kG^`hs~@tGka>UwPx1d z>*SsS|ES^&-L^?eYy%kz=qv6cot9lXerxEz0PSIH!{`GFBuURkI$!n;!>K+*tfaU% zpoPF&|Hf$V$SNqGc{4g=Zv5Df+SHYkSOkzvOwpfXC1HyK`H_j_U&?B7+x&kk=wS6{ z2^jFalNmWzp#3v{?ce=i}Ez zOoD$^3B>q^-kps9DhZ~t(Ws7=1)IPlInL#5c!>F zO(gFI6ajs5c9XOumDs%q@UDra@@Ks<{%IVXM{ipm;>=yn9^q&uw+5^BW;_PWSdCU- zEs1xZQ^yQ}x#s?}J05y?M~{{tNH4HF`b$AFFf4@7Cz(9@71OfIaU8yX;RodUbAQ>V zR@N}{oqEo-hnZ%>o4(C7dM?|018a39zMtA_oUO4-SN)%qoD_P0>!p1{V=A99?olPT z5$NN_;S0w#h}14_b87zQQU?5DlZq$B_$v!TxL+sHLYl*7?iH;LaX|kZ1c+0;JvQK+ z_0LH!eq!v(v!Yll2?U&9C*0UwxNsJ>1X}wRlX%z-14$|7Y~1+yJ`*=8npLqoz^b=Y-3&5e#=Kx||3~&ri>0Kj`v8W6(%~VeptFZRz1)AAe+7yOi zm|kD%4w1se?Qn)^;>R^TXu3h z{7(R7;bCI{W$2+t!0X@IOTAcB*#W&z3T%^t*lb8arvxui-7B|{yMLuEv;HuNbIV4Z zWr$4ak>W%)!VkwnDM4YUG9h`iz|N0#@(NHaPW%1AkQ|vBn@-7#Uf? z=-1QDi zSy}VdC^~HxWw(t$9`$Gc7) z=93utEb1|#=?9|)ABz-N_uC7et5>EC+f9;Wi*YIQ9-wAg%mhm+(|q^%Q{;E<*1EVg zuV~G&1!N1K@i;v(m(dekCxk^>BBXUdK*~Rh;}U+@vPZMfVQr2uY3GM1_>HQ^&~Eqf z%R)cPfmn)M0x{s>8Jp;sLFsCIT<(#w#mMp5-rkZ@fC0bKN~MIIwF^cAvf4ZU}#cXfx52iO)(E5Ct);z)xS{ zy<+#WpK>Dl%P3rWB=kLON^GRu6qQ5Jtknm*=NtUB1xw#mGY30|6SAFV3kPg}pNnP6 z>hCXm-={Z=$vet0W$1iV2QTV`Qb0UPuU-B8 z+o-hlRbRZ~aO?5!qXEqa#fRtaM_K`Xj1HKZMI}Jv>{EV z4~J6|Ev&SU2no6a6U}xanS6KHmdhZkW>u9f_tYt4{NDK;mMALI9|T+x@y2)x&wYr5(1W0E_v|)gJ6`??LdajT395apsNaq^x@d)ogiibX;`J#_N$$Qo z8|xc7?Z>Ey`(==c;pb6~y&pZh%O@R=DCUV;jIr1$N4;nk)b{7!-)ZV4vmo2uWgiB7 z&YZF!K2ug&NbN^2lr*=u%Hh4ooe$EFa<-qF*d@&@=bW2C(R2oRDW7e?wLxxo^ab&% zct0;$b{NxLm?^NF3O=6Lo1vL;{C;gliAQs$SsW@?q3SKX%qJ@{a!2o`un2Ao>fNgD z6jv(ODoDnJ`X!F>4P7mHN`Ck8?0ln486v+DmDWjFTpKg$7ZqU((f1?#P&~$)>n;RN z$t6KOi{x&ni2ybUXdhK~*rS?ym~P4f7YUj8 zt@x(!tN9mvXE2V9=mhbh7IaMd^YK>;RtRP5vbyx+*qc5XVWVuy-%)(uK|}T)E-ie* z-G>%p&z%#eR0dO3**wmaSQ0HT_iARCf6hdT)_?00o;FvoA@awF&8K-_idJLNI-}y}U*;|te>@n)%YZQ`=gEbAE%eL5pIk(@j4(Z5`ea!#NksP2W z)q;Uox+qpWpUS$0%vUwTYOH~7Z(OQc@oB<4KwjCCdnv;UFa*Q|L; z{B=;-`5dh_?q6ox@9Nc4(LZXF%L}f3!`InaeQip)m4CRV?B-63GZ}vTv@>D-cZhCP z(=;N!=GTxVIBDI|n=W9ek*m~opQ$71#}{ixeA%Lu8;SRL&Kl$y`#(n~G*BAZa_Nb! z5T?%wramhBsuyG$SsfG4S1EDtR%R? zir4rxR3bDuNO((OKtm^P^InAot>wVzH<2LgiQ;fr14cRR{1lPg&X5w*XI46IU7IdK zER_hBpBRn{!^A+2t!)v+`sEF0lf*A6b`tca{Q|YCLd2$DWK zObB|sRo}iwBF`=umFi1lRA5h6+n`%6d`iSYtUpQ*WaXsI8y1dbvB@!J(ii#s)uwJ1 z+tF)7ki_vD8Ap?ZQ9m0~(dR!qE~vH(bbW>GtS@aW<(T`n`h2{8^e#*XwH?>z5aP+D zhJekC6NbN=oFvrcC(+SGzG*#;9H!$#Z%oSkSxDZL@H6j6TDxjO#*ZVikXih}lCd?k zWyXShF%~^uJ8ABh@1zY(aj1vivi}s4!r~%UJF;>kkrN@cG6vom20a!Z5)WM}Rxt3@ zsJ>-bU4GWAK#2<}8TkE_^)pIPq{FFm+^>2NlF)Se`*Dm*mh8JN38Xc1#?6v%u2%Lp zwzqa7a>BUu-ct3X_+y$PG4d?2>H7lD0Av}htk_`Md^@&fPSg_S$)Ss`iCf%qVTu<5 zin_x#D3kd$eyzZdhlY?zy$je5<*}ml;}!fcE+bs~v4=5kFXg>^9ql$Jar@umeC+E9 zoreyN>t}i-ov7Cw211=*DKG>Nb!9kzw5%>QaLEr^R4Xt()v>*z!|b=br7B1&^lJva zr6R$lnYHtNOBJo}xiHg(>zp^3+C}h=_k^g=TI5MpUn*~$N{?wittg1BBDpF^rL$l~ zqmUs@ry1J5T&e2OL=SlpR+vPe99X_f0si_6L0N`}vPjgttWlOk9Lj0B_2Pw+bm3^0 z142eqxx=d;kxM6tzWI;XQ~j?=4|7;0tqN}2AG+EBr&pkKtBeA1TU*->&lzQy@8WFL!Bd5J)1}iB~Sk=oyjt8W0>yXx2M0Eq*yN)r-vhty^%) zoTFTvt99HnT6B7mZiM%9av(>)M>-{>{L*P5GiFr1AXpB1z&2zt)QD~O#M4B3^aG1d znANQ-FS`9(&$*B05R=NWOo=juUD_}5a0;osEwu1b!iGt)m&$U!C6)*kUuKv?_I@Zc z3A0=wkqa{ESNcB{!*p$7jfVcPopD3|r>B%`zlV$1Y{riX*{M%Y%Kpz)(@S_O7h9<_?@}F0Qso-;qY#c`!npJQ~+e*w9Y8 zR#v`Kb_F7P%&niCAcl$swzjs)pE~&1DbM|(rWJD;&sy?oTxo}OF7hs&)LrcAp0r%p zC$e`OD`lLt+-#RtR(EgzQSR9M*{URR_abpz;DOXdL8PaMM)7Iw>5bbD*4@{6P?vS= zAXuwMER|L}Ebd`d&nJw^-mq*Tv4YQ%y`{(894i+_irQWHZYe7fOMd2Psl)pNTI~i6 zt}K%Ok*S!@$c{DV9w0snYBsvN0VZtK9BX?Bl}$#5a;9_J`bUa;tN)BCiW-lu+N-Ox zWPi~;y;sb7`JIn#?&4t*$7d^H!%%3Z3my7Z!Z`h>DoSJm`qd1p*}zk|TG8*<<(tdhrZhN8aw#<87g@eEXW;kZgU}RfS)ggl^3=Y z{3EEoR<$7fM-b!foc$lcm?e@feo-ZOEqlHVKouY zz^Z|UumY8F)V=u=EkoOst=74eOE=4?d%Z3;&}Y*H7fzp@3AK`Y>8kf1;J^+CqKn|b zN|F9sI29ikey~>hvH8C{ub_T!eUW=n!5H=|RqACoKDMA5d-C{k5IQQ+EA(!BNuFqa zsfs5}?EFs^(`;eS`^?9lf0>XD9uDs!26l~Leq+ZQ1mVY@&I47DKx@`FkiAS6wI(Du zqeXdiKn>n2PI|ydYNFMoY(oW~!oy^Yd9O2C!2zn3%GtFbo+f!#3OLf`5 zaDqD;n~fMBXdV9T+4mss$NmVM#ACJ{dpOj|l2ja)*?`hpaVC1SU#p+r5$+qz8`e7b zi1C%?9d$hox0Z4HpDXr0mRU zsq4v>7$^^`e(7Qv1#iG^jXZLI-$AaF#eokva4_9^-Af#US#qBrh86si*wX;}9WsxG z1yAEY{3PdXGMBEk+?lLOF6i+kvRsSwzNPTlA)E^n02Gn>`3bCBPk>VC()=`7%M%@b$Y$h~D4y2Wt zO=pW(NZ5ep>|mQ8RILU_XZgp2v6Oo6Y@47MHr-Q^xiK>R z>x2hA!-M@AhSj}$8<~`Ls0bguus(JI`l0d!Qf_h8ZzTOOjGNZG{QTjCJwHAfuNF!` zTb=1YfIt3PO?Ms%!2T((0Vv-~cN8IjnI3o}?XRHihw|4yGU(iZnRN)|g~+nVpZ>*r zj9+*NybyXG9>}=3Dc>MnV`@ZLnMlM;LTsEgjVf$7remRE8@B%8!v3jhcF5N?xU@9A z>IQRa#~RJzS@p~a+i)(TG>)`Z$C8p(;<3O(7#$YNFOy?a^u=F|qoOfDTt8I&w1?%g zw^3etQD$z+lq@Ll_r(g;ra4A9Ak?Oz78Y{nzr#6Uo-7-cY$}zE4+!_vVv?qy@7AY_ za8w9xmBW`xL-hbNs&WBHcR-A9RN$8Lrvgou8acqQJ5c{h_Es|hcj(iv#fmcDIsjAz>11XU1f(Va{m(HN)y}lKA-^@n1dgrfWgSIvxu?{_k;+THM*gBz}Vbon1pA5b`uGVm>Yf| zaZkEscIN*d7p zt(!6V{R=G@65olP3o6q6OjTRL2B4dp#Jf0Z-7#`2R(W> z)0u&^I6vJglo7SC_kj*+Bgr$gfHG6!#>^S$V^f0n-7o=tLV!Q;1wW2@hpRo_H7*?W zu=p>9Ap<_@w3EyXbd+n8(Zog=62&D&=~-}1{t#pBYt>BHR8hmrk>TsPw ztEt~n{m`4@Mh@u5k{Jgk-AB8N{mr7;SatF)(wX~(uNG)A*3hUPE*zP9Kh3R$nEX$o zF6U807xui_8Kc2kn+`(2On%n*9hmQLm&PK#;`%S8;TeQ?9>0~(Du+iI%SPjOK&;cH zF(6)U?JR&Gd1^=uzow`RUULUl6aR7ezmb}h4Y6G>FlsHuPe-|qq=wQ2m*!GO5m$t_ z-V?~wTYIGV`?h;56#UdXx-$L^6Pls!QL3Kr<%%x6UK_ugBP}Hr1Q(oN{<;XPx_M_j z9?wEGr8nxn{{t2fr)~{{W`^Toeg9m|bwj%6P_R&$$#uPUE#5OWedJFaCwJVL?J^jv zXT94;?`ioK@&SM^*jXRF-@iZAvm4W(eJUU&!W3#{LTDH_u7!n*G1tGO;GFTXi7gPY zy%xom{p=oJiW2(0|G@WGL*}yQe&*;C!;9kSrw0K%su?3C6$c*i;yTRcl;yiqy`W+h z%-ZG@Ns26TPlGu)?+Tw1^YO+8oY5zg7sXGkT3e(IsnKK4m!yw5dRV9a6VN0Rc6}=G z)5m{5Fj}QGwep{AZInmt3iB@HpnfH@+SscOhoY$0fJ%SAN)dT)EZSybF$>Qrc|*G+eO<)inwyLW z5HatvfGmHC?C&BG>01ANtCgoRa%;YdMC5I;Xv_9Soqto|@=Q2#)YX}HOe(iNOd9Q) zbK>EN9B+Avr~n6Pv#g*$_bI|}1QGwzCyIbR$7q=<^lpU1ZJ3}uU(3sFu}@Rb=_vTM zx@WoHn3zx7MS(2_CUaX&+vR2&QLFD%b;2TfL$A*}j-B zv^2mnpWer`q0heEZ-iDWZ(_)KIDc3BXb}Z)?x*;b`=Lz#z2tE5kZ`rwRGVtA!r=pJ zl?}Jesf^Lq`49)Q(hl*ExmLB2mR}|oS#jl3?VEF_Q-v3PpSPajpqxc4_2Bn*VB@8I z#my^Zzt`an*n9nwqbUQ@3rn33)$^RguX>>+NGZE&FY{WuacFCWtCnI`V(ezU_k1=!xOHPT!`8Mp~f&-6}Q&N}*we+cTt(R`DUBtZJe`)fN z{0-MKOn@g&uUJ2uIGC(`0k$5r_h~zBsmFvOk1pD48jNivfSg5iys<{G3x;_bZ2CyP z*a;IdE;xjG&D&+@XFk7u{Pw2)G#Aq6GbXV8ouhK8Dr-yc6{AzME+jZKOz6HUK_k#( z$#}*5uo+nRVwKjKuvI@&4>5w0dfH5(#dI*Ny*%9K5i4YUjFR>K3tkIfuuH38Rk8Qp zc3}yyEgfWQB1yhL*ykCB`cw8=%T$y<3-%nv86I0rTUTHx&6aS~qQ8!zv83_x-Px^j zE!M%Fq2{}=?l6#^mIb>@U-#1Y`r)<42G>2FIX#bg;7hB1H$=V%3e;@5qt0wB?4@k} z8)}y$p7FKbbw5XyH+3-jw$3d62^%9_S^>%|CQ#Wx#X| zR;FvXzqPCMfRMWsLSfgO+7isoH*f-*r@?=2T(*xZ; z(!l2sTs#th>(BMJA2{Y*#^_`6#Bh-E8(%lDbfGRRiRQ>~AP7~@*um!jCdO*N z5p#*8d1P}gDmhz=+B6j;-|&0wH9RcW2uP&~3@Uu-UP%k8dta!7kKTXXnH>r`B#1da z7U*YWB;9!OQ#wOH-z;797sa|b$&m=oruZXJonf;@x;#FO5`nwtUb_&=_?dfsafb(C z##NBPStuXs%l_sT=4CMWWdtvFZ}O||tHT6sXQIEpB-5n@2wqaNH?QeE+drH!kIv)- zrrsKA`uf(XKV;9+g_+@R++U|+T&?yObnRWW1aFm=#{2IdFY{74tCEg55BLXu&0OXw zIBuJ6(0>hMLPB`JQUj9qOT|Y9s#}i$*|as4{{b-cb9NCKZuFhds`u@K1O>T)u#c%;Vqj4t?5;OvRE^u{*Q-+6YRw5D!swMBN2b5D+W@P9@`Z7U2sdh3LyNJl6s0 z_pfReu3sgf0X;6fOC2unfF$FiOYN~PGoEkBM^`>8i&GK}*r->W7PJ_KuyU6;pDI*T&7U6WFM)l4}qh}}XL4=zgu!*Tk2cwF=6xQb# z#T@h;nyC}&10P9ag}D^Uo2MXqD-oG+fxp3qTUH7ZAY)MG#HF5sDIt-SPf37o&i#99 zs6f9sbok3$!IXmvtOnhq_%bH;y0kk~zF;jF7UEdEEtFDzACb_ie%}W*oNW~WL;72? z_TDI+Jlr;2vg7otQeA@-%w7~@8{&Y{#F!87!j55Wm3_<@rM3R6*{0vW;(+n44f3nm zpebqy6WX7h1s+RKKX;?Yx$J03#r-k zyIyR~Yd1X<=0f&ZOU4();+)nWluRnl$>iOVK_hu8ad;zLZ;a0{O*8Ts513DaL!MF= z>u*echjZa%r+8Apaw}{*M=YLQ=}6D_!Is`0TwoHraO|N&B$PPDEks<&LflBo_dNZ_ zgpA94VV`B#xyyY~5?fYyA%oRf!)V^@mSuaXr(P)0`#n3S0+U~QTDb4SE;KqFG6e6} zUx$1r%KOwpt;>Cq|I|}qY4pBm=XNiFVt$5A`k-?foD^pcDvtNp>oI2Qvb~9|#hTTE zIXhdR0~cXy&ODBjN6*JXJlSciamQPfGd+2E&ItdjC77o9$3=$I?7o z=~!tgAH78MZ{YLrNh#!~_Bk+3vheaB3X6F!LN9w@&}H)T34U-yC?TQ4YB2~_^Pzp&Y1MR64kFTVdE|jzZ{UlL^|W_r?Pa@cg!Zr9H~_?KXdWoATlY}! zSzWJjy9>YC3k^8D33f}X+GoTi`$)v>&zGM~0>|Ioe=!CA zws4Lg;*Y&(Rk$+MVUclA!k+@6nb5I*g6L7&*5>qKQ;ORUzS zXH8Ere;r!seVD7SvPPI{W9kMTP%5B&oSq$AMHq|zc&mnrx9TRPv1zmEe^+()bZ#9? zPFWUm-dVyF2Z(ArkN@}dJmxmmw0BVMVQ3clz`*ZN6|C+Isbrvc0VZen%d?I4QIxrT zOBO>b&3 zDTv{;3VH8nG^ss$mBMpZNCRLMrYDR^U_Qj{yxt@~H{Uw(fHWp5*PZ@?jXOoaPDr0J z!;ASA&R0Lo`9mN=1}am2Jg36f`iwdb4&z&|gA?k#yve=MlFAqw_NpNgXYK6|8Z4U6 z{9}v6Lr{g>;OuP$AKx$~VwK60#|wEVoe3SC?p3w%$9;)1Mgf+VCt>M84BXJ%AG)~Z zFmghyA7)e;QNlV1Q%})lvVkd<@KTP@m*4qIh^dM9n2Qj83(s3r`Vc z@?(mIA;stEr$RS0>St2l>fWc{_=!;X7*xue=mn0_K^DI*ecS5C)>q;W^`Z8G+>e(# z!UPfx+ze^b-(TkPJ=%>o@6wxZIX2S7$=P|2iR`vRH#@;%8LueF0{$hLzNBpjFOsc) zk&h4z^@@m5YK%}la6saBoh7NKT|qIWS?Rx3U(E+KOQg-C0G|a5m{IJ$pVEtw4Nk}0 zQOSe88BnhL!g}}GliY_=i?MvdT5YhoB2biuUu((NePJyk>EmB>7zzc#r9UIe>Pv~W z-sb!LR2<}_jG{V(@yGM#Q>RW zWP&d9G$YP8A-Ic2!h*xz;cFnce&c{FM{$5IA{pT8((3_beLE|Wft z6Rz?{O5lXd4%ZuSxHe`|xbIgn<{_#F6^H~3i+a{oCq_z7fbh)#c+pLOFgJlFGz9C4 z+{!*ywl|&aVTQV*u7fl(30lH@NBz08Mh^`t8m9echu=_Ljc4g9p^cO>F2Z?0WZL^j z^LuI>o0df^a$|^H14(^kvWrj(slZ#Gq8nKk0ia7T2?1mW>czOV9KX2TkY}k|RClf@ zT^~ms14q7zY}x;F1Y0-#`h>MJ;eq5|{l3anXS#fb$j#<=-Zm?^;xdF+NVM}D68&_4 z!9pE3G^Bo_?ep?Wo@H#;qk)~s@+Wyaw$S=oz*!dZPwkV2+EiQt>iec%gQm(O-h%-; z0>DS?Tf*D4G2lFRw{faV{~{LON+6~g4qEd>S6%W(+1-0TOP{Xh0L!!^XBZAzDa-XF zj_}w^3MvK|cTX3}IK`<}UCxO>lyo~ZbX7zQ7K&2$6H?LU89pzUwUo!hpiL zAXq5i9F!zC1|71T*62tm4$B+$EqUHry7Jh|($+|GPWHp!p{Oy>FeJ10dR)1I$i^F(7$A63Ux9xi-G-j zd;5Rm4c%NC*EIJWK?(x*+)RMZOKE>nl*vFMfb`m)cW=md^b~khD&KKx9Gjxv{Wi(} z^XIsEahV(m6m^m6ar3In_Ijhk+*ML!4C-wfyWzBoBdf6+;Tv47dV6|I>MXmn&iNV& zHcSD8OfT1J*xTXzazRzM*vEeZNaKm|J3+>OM+?d?G7^l{+OP$7AO>uxjA6d_H$r=e_+=40 zkT?LI&mLS;)5lh+T1x1A*-DwSjxY1naSRkI`THUf$L_=8I{Dg8pCj#g-+LqiWSO=H zYyMeydFu*9z3=IqlxZ&^PUC2d{IJ>ik-I}iTlMw zJS@;5WB(Y53cW+!M3Nwwu_+`Nz(|$S->DrAYBZ?1x0o_J{mM zEhvBzSH4J{B(NdesIArF(E*e-^m zuTuXjFIb4^=R+3IzR0q~Fw|?!w$>nRTMoaakAIE6bG7keE`>ovl4`S}-M}f=r%jF-Uyc~z~uoeDpu-(mk()8*$sm&y&p^M^s_?$U7pt?Hj<$NN6K4x zli0pby(PJ*LRTZ&cRZreEg)nn0=+yYh5b@rNbFrpUEFdOeRVuDg*OE1m;5gJpB5*_ z|4>Yi0e&1vd*#IAM8g2JbQ4dH3A`n^LY@$4V7k@JvB~Z`zXeLH_P+JnB6*Uz4pJ%O zoF^uCVYne74$rYzGO`v2P%jH%T>c~4R3*}==}Pb8xVh) zm*~j%j}7cgEE8ZyG)6=hi zcLDq3HTb@|R@z}-zU6Z=?o`9RX1l#jSxXQ%&hx!6dx4I3m)3Foy-Kv!S>2Ge+9Sfd z98KgWphZKvhUbCi_RZLs$g$Xi}5O0+QR+c{}K{Bx;*#3|I6y>rRMi?FsTWa^d`tb zu!h_6752&1o}FKGp*zJs;Qwg#Og+xgpv4!|`7LPU*B-cOVD)ecvV= zZ}#1EK7OI}$<_H$R@wyN%e##C16eyTFZoQ`uCaHN>fTt!-a=VAiO7}FqZpSmJLfip z3`BbR5?{~^b&zyYKMk`wbVkOudVdF}I&zVI7vKo+sE$3?`Wb{S_e61m+G@ET?mqy2 zfS&m`DZdH{_wl7e{~j+}zE^AcIBP2@!0>Y|9h!ms$GlN{YvE(ZP!%3lW(lxNLHC{z z8k2qMXVtvBuaMM_d8c(pjESBiY}j*`80Z;D>6<>6cV?U0VJs-wmi<~8`~1v!HNMop zInlb2#;Myxvcvqecr#o{L+g}$++vZ@=mq*-$?{e&3H8n>*K+!Zeb|0RlRLCoTi7@f z@qjt=2XuH;!9RgedEQy#;QJDS!=_r$C8FHDF0fVWa8$^B>mud01e!ns&FN|R$3 z<8EM%TBE<8E7iiFyx?-DGcdl;mkNC$KFR2(;bTOY!I>7s2B;d#9-*Ap#||5Fl7d8I zGf`Rw-sCTK`XGf}tgnf1CnAaGjPGD$YjffVw(yO6jFY!7XM zzed9{`P&r!DhF?%!>px%cV#OAzN~1THmV zmrP-u1if^0BfHI#_-!drC-uXNvCqKv;vCi-iA;UjE1*V;U&qxb3jEKW25i1=ij+`3 zX?iNaC4cQ9OfFDzWt!114D3BVt$T$4dyg__%Y7i$3>0_`U_-=L{IUGh$DS9@pM{ib z#C+2sWGi7o!IMt1$y;tSi?-v*E~UAJFMItZZb=&cy3wPZDKIZ-q3x1%pAvI}ordjFgPoRbZMTxr_+P$4 zhJ`jm{lqddG58-j2A2bKTmYc(jGM z$%^>dpjh8|iuSz77KW!;pzttLTV&5?v01aLj~< z52#lGnbdzMTf=KESA5$@D>xU>IuoP`Dy3RJPM|yx?8G3Jy*8dDPbQ(${E>KVd8rR4 zi_b*>9R!1*%5c4q#b2Q%7b6&Jo=#G}RsMEyx5VbHsg3eNlkS7;5<;4eJ;9FjTD`B^ zTI7NXc1sq)>_7FzRXzmrtORhd+*)D}2>0A?iKM*ODo1!;no#=lI6(Ma z><{gFU&;gtNgead=VHBw=<&%t2fg8py5u@=t9lH4I-l<`mJ(!bu1jC0P(63lr#dh4 z$>I>O@dwTy{6X5LimTC9fo*kc4do~Se6j#h>^`w$$g{mMN9itG&lg{Bu|*gnL(`r# zoDFn(jPuL9ACLhVd<5*H6;@Zl?f%bAt5$ED>%46D&Xd)BQ>80j3iwaO&QX6~*;B>5 z$NrR8!^&TO5UE;Zd8En;UO+Do9?@HON<{9+MZ2^zTgLb)ujDUw$BKEJC ztb?*HN0}3CNgGnnLCU+zAE3TNcgnZfsy?SN2VzZN=<4!WO_9%TR87oub&9P1ncScn za=2JycwTNSrW+kR4vVO|(oe*i2yEUjES&TdK^Q3HDn5!d(6F>)gJxG4vCmp0wn1JF z90ErWBAtA6q0uBSy6BQMw^Za?>p&u4tPa!(o}EeT5shH3lO%Ds0XU??HC(?+43h=C<(s z5f&?TK+Yd;u!+$QOAv6*-!1;{aJu|%_M?a(ACN*gjrYHCWvFalcW?1(S}va&Q3C#8 z9OO#^#Xm{F9`Sgb`GaQKoP2U8u|_*{+Oz{%J> zoKz*=`7!Z@F>f^@z?%y>=n|p~PvUdu`nD&t-$GzEHzJ6$ z>_X0cuZcUK5Dw&HL0h|B_O zaA%U~=p-pSDs>|ZgInSH+ES9B>~uyDw;67goC|}gQ=GEL2S-?Z+MBXdUw+&>a_6dZ zNYB}mY&d|R;gW}=QFZQM1Cuc~2ioJIC^%(9eB&nW8PWu0Lyh&O?)mqqnzxHf{y1Ie z7Cj%gJ=Ckt*;DTxCn*C7I?5HPW0|$@h(?}*P&Id6nsXK^z`4${Nv;NV4RsD(QAk#u zS4M*GXgc!)!Twz%;mj8!0EVH-R#`G`*O2m(%kF;^_GUW#&sma8d8npk069GGxIO?Z zpX`pMD+2JU&WnOoDBuit#S<1u1b40s1!9Z#`gL z0S&scFmXf{*s3bk`5lcm*ukd%hV_6(d!rQulR{+i(Fl?>eaa!|fT)>g0`#YLcDP>Z zfLM?VKu_kin{c5hfxM<+)b(bgysNtfEW@`|1$%uN<1|(JybiD#xhM9g7`2DDX9i#&K2z-&2aG+b}bEMFn%`t9H-5qh(9s0b>^! z#_ysRYhd30Y9+bHexd11Tt=o*7h(5@zR6&7p`ywDPtoR=aNuR##a$==P;QUtq_Fl% zLAsxk!XUcC5qE(+0^LN`A{tUHQQ=s%@^0?6P(-VW;$9gYU1x~m^>)%}LgH=&&u9&B z^F!q`(08o^S;u9%m5S0D`mG2h%`eBb^6~bSGffTKI(bbd8WeCS`<4iKCP4vWZcSz~EC{L0XeC z@y%1pJ|pbSdp>`rJ%b9G@0PJt;Pm5kkWTJ7o%7x1pt#0nbN!3=1|kL@m4rO7iG8(d zMDN@=Gf)oov|=3f{<7rWjV`-PIQJeV{EQXWeV_RjoKU!BFG@Xv%#{0P{`E%FIHhE@ zNwNd50MP!k3>-QR8Xegd+7AvpR!E2BWC#@F3f+JbS{ufg!7GG~vlwbq0Fp(fpQLAk z)up~9wfFnuqC5hd0J^!NCZS)Cqt@f%b0FHx-K-CxkCHS^dz8WE)q&>fa?@!EtGmZ! zgx0ApL^ofP#Ap+A2iuA1Ec;O3XteNJnrHomf-Dph%y+}232wT@hO31xdbjTDBv!rTR70FCY2?dVx3~{d^@u>Y)#iy*5pK}GBK3HNh z7AMY)E}|s_@7GGL9b&!1qT+bU>mzM|A;*|5iYG@@$JNs#)JxY~Y2-rAk=zU_+s@Ok zACpN6TJm~hAQ~MdUF*tzrdz<)pWd+cF%_GK%BA-+9dc2bY%Pxq1yh%EFl4BO4%!Gj>ga&G4Pbr?ca@ROE1 zt~j2Dr9ORitPBCS(^}Jj9HQb#nUhZVb6|3Acf>6#EeaU1&E+o12^WF^KkjSY-L7gz z7f5gZNT{>);XH80P)dxZy0r|ETUC^eWrG;^)1O81MQdBdtLM>|bSdDk()Xpq#2VAR zS(OgYGsB2im+lF_`lb+5dCoEC-gr^frSu;DMipS5p^G*Bc2ColaPes~pOap*8g|1N z!3pYTG$^iM`2tZsm2*?CC$LIJo6U4W2kjl1vf%`#JF@-yOm|&eCi^EFds-cb_awF% z#jk3Q)v_kV2O5was0Y0CXDKCNQSYgrIEfrGaXld`yWPIcJ_;PtS@RI2_Yj6yE^8^U z>82>H9x~w^x9>0$69Hqd?ZkrVhZmuJW)5x;fSKx-=|em3X#?p`A_;WDbHcsk0XtZ3 zj+w{1i4=ZAyfNUS5XWWxRqTdLK#6CbUY2r(_`V#NDk@RgX^(ppP` zql4l|?6RWk|HLQoO%H zRu}Z~a~h{?pq=2PpM2u8z1UT)U!T6rx5B8TGL0#TGM*sYZ}lQUKBt&uJSdtoo`y7;i&H5ABGM)C85{-j*#e+=bwKVTsC5Q z{%ckqY@G8k{&*k+fh@k~)iXyf%Xb5{tuRH&SKFyn+o1A>9KlMZ(+E_b0a@2B z)N2m`hlh=e<*g)7whRGJ+}0gMvX2P67a)g#0p)Mc`<=Uv5698~gDoVJkX4lnNGxF# z@xWObzW3ncs(c=@^GLI)a^{-1$wY6aWQzFX%+lV?s*oKalNIH;{DhZ(yj`@@O?-qPU6@WT&4_Zj3G~7W(eq? zC=W!4Ot3XVx@O715X|d4AIya{L9vRxF4>8Q;1l5KN{@QejNM|G7auplFnm9%3?*mJ z9>0SPJjm>H+6?B?PfJj_+F`f#7e$nTKpz4j!CZg@7t>O5lF`FwD-G8PIpGcqk?`R5 zfDZtcCWLbF;2ddP4#Ua*WE1}aEa3Ft|1$zSkFI-ehC4-0JD)Cq!xOh)stRzEuS_Dl zzsy>1S53*h;ab#N`o_w*1^!=jy?0!bP1h}atEhk?grZU;5SkD{5y66lVjvU|i4deK zMUY;E(2=49kls6jDAIci<(49dRHavG(g{64Ae@Ol?{m)io$vdL$+W%p+H2;T5^{}& zE$Xwk((lHL@aP5i^dtW&=pu4ms}s7?f8-H;2-jDoQuW9+G|^Xm`~a4mJyW`%@1a8p z2E+8$S_&n3vo!oiKV=LpHoX$3gg8kkk8W+fTo%OsFtCUmKR5_gKb0{2cF}_3)-Cgz zM8KoyXt-thzDNE=@o?h`?m@pTlG_bXI&1Z(wBtr6hKYovGkG!dQSD}5^OcM3a?Rt} zipA2=qJf#GrLY2K)9t4U1%IC=jmaGlpt zVS_kHd(rq(Y*OO3Vo)vDic1ib-x`&Q~y<{QCoE>R2X+@NM7~ z4XpXUy5~0CC36&i-p+(Y?7Qs6Mg%`R>yr*12alkc~FH zjnQ!sFmJ&y$ypF{H$;Tg>+X-ed<3>$Y#s;8&rh?J92I~~9)|4yOk?_#`0C9}S}=e1 z1TYjCy_BsQ<2RT0*1>;tJxreo4s-XCZlq~j@{0)nD4nmbr-gGqH?1S5=lJbeI6G*h zsDXBfy@=FtU@Ti=(7d)!CkdTJMvPMBFQ|P7OS)VCoY3|NPuJuT+EEWdPCpo}4SL-E zo=0ykjOthj+Mg|~zUX;j#B`DG9=irvvF&Qjh6I!)cR1Gb$0AHDM+PYW7(DPa#Yg6h zX=rqua2Dhz7Z)6%QP7)~Q0g{1UkvXdRv1-$)74-9lU<|9j;t@{O2){ux0*p=nj!`j z^kNrg!M=uZ4x2(38~@B+Fn`B5Zjpzv4EDSM4&nKHsC4(1P?>7Lt{vSWi;icXdc+I= zrJ3-o>sPVS-w?}%h}EfKCRQ39@H2n&ec|Ds>XXxB-oY6)Sx+dM@jOuN3A#nl;p=Pn z>Lxhq^qw{09{L^Pa4Qv?$pU*-J zJGlHipy&%xF*ppaXYT7e$A9(Qqtz!(SebNz6$2$@gIoN5=?xdTG21CfKA!UE2W}a< zz^TPUb*3wBfx5+JS5E}_KP}I!d6|oEzifK5wZN)2C(xqa;{J}O-7H+*xCF8-fKbG- zcnTl|^S=#XWo2v_%3!_O`WA}*?pdlhO%lS;W}SvqTgFe)lbjFZd0+!6gGCIA+>(2^ zJ@qVH7a%V4bW!mkL#gugb|=ec<)8G+MT{c#&sjq!(EPgRd|!{j%;jOWjuwjPvw!N( z8h;Bl>qP5V6TZz?L|(c(sXJn|y%?nVVU<`Lw_c+>L}2UJL8*ygs_6xcB%^-UWvFk| zD4T0MYRsowO7)F)foEEJ|jqG1nZ{ZAl8#X?Xas^{$);9gXUFpLrwr%9Ma0aA* zz_RNqMi@H6`C(XsjioTxUttdUZYf7tz@DvSk4qMQ@LffOD#Kzg+b9g#gtF3&3R$mE zhlD?T#zP=9f=1S0P#^gxDUZ=mdA^{Agl40u{FT9`J>=Vq8|b|QF9YIE9qpKsgK z@yuqY48|0a9#-tI9?JeanjB_5M|Z&g_gxq_Dgl z`GfQ@)z#ni;1|7vUph;mf^FEK`0$zzgS-t>S%&m#VBb2Ym3$Tt$IAniz_Que$g*cF z?i~0ZSFSUbF+xX1JqN$d-eFvPie~B`()1b}X<Z9EOF~D+dJ%jnw_EFF&mfNV?|t&Kei-NmsHeda_+ZL9X)rlsOG z{Om2cUSD*6Whh$&aYMsJ#96+ zA0YykAd$21t=!B8Bo1cU<;|=?f^Gga&+jF7=M_<=lWf|qp8KnZp0);3268eyTfbZg z!adl%6HEeiRBYTA@s3mVVQMKixzi!j#VHq;Ne6zck=f}H0>S#;h8ebFn)44mWO$ml zBt^z=57eLIr@AG#;{LnDlVDKvkdfuqrib`&#dji|!z^1My}7^3UK7g!X5Tfc8P(VP zskGWg=dC zZ)K+W9;q{ip>I8~BQW2#E42-HlOKm!(p|5tZ$5kLCVgu0QIMyWO_{kIQZ<>WFai6f z{x(JjmeBnkVib}Tx6E#IkOjEn{_5hLP~U`TOEpQ4FpGE&)y}cqwZ$?^d3WhA}>gyk1ba^&Tgxs$bF8wv;DXmtI znf7C2M4+ra#b^#*D_}k@uilXNd#y0=eZJww#XzqkS~hNlRLiQj^yagk%?oMtG8u;7 z-b1GSvJfkChz$Pv)}&{(0_;?`Hs2B!z7^Oqs54FG8r&qmq=Q*ZOD?F*4^_&_@YsG@ zWfd=koBKaqPY-c36OP?~tuRrNcG!Efu6&~NK;%~B;LgG9x!nr9!w#>Ixqtjr!LYmW zql9tw9%|8H$)DQ>I<7JPuN5|HoU0r&CT1L8@SM6Ocm9xkxh|_v2cgXlSa3M^u7`cu z&y*3`qv$n~FMXj`cdC?+2?~0ci9bdB?f#+|5FSZSoDPxhk{;U`UgNqY*KvQVa!bpR znc5=$`a(1NpeooY-5Bi&By=ZUUDN{a;9FeCe+WqAaIze+z}nW!M`0w<|OcOs&8FL*gu%qFn0alak5emlYP{b3yPbV%~$;TIXM zZrx$`T&GX5abI}qTs$G-2&CCVz0sZz->L92N&Ya~)AlWH#!RG zs^i3kj8nV)gmi?i^-_IsC|QtO?+KGYs+i{FOp`}KH0bZlsCRq4Cu*My3{9gSpZE!* zE9rw#U}zHcW(=iXPM#2uj@x^!fU`AAsUif4LsfuC3H{D`j=uHK>vh+;(<5%js2$#W zG+DGYnF=u3?{FLMuI`P}(STWpb=);qoiuQ`kYjS1CS-Qfqv9Cn+1>4>P4UFb%_6?O z5?XcRv%WcRm^se+?ZW70#uk_sAV!T>&a6qAk2q33OvmSXFH3DTYST=C!-j)`$_X9b zr=i(_)%Ka^*Odqrw-t*x0D-NkwnPa-A<7KrVgIj6-Gd8K*8_pzQ;(+tC#DSzd8B{u*l?jK}4b>EuvIDi} zu7`OU5nfwPs8O5y@9lQXxWV-{P0<&?fWSr=yZhC~gsg%PHqW$fTgCRIQisgGQLFDL zuESrta*Z-gwv2`?t4hxHeESIp9uc=_>R9MG5R{UyJ8Fyhm3>zM!?Qh;*a6l$vo&@e zO8i!sx)#Sby6#X)-h>tJ$=8Y6q;P$PoAX}snE6t$LWf`FrOY08=7X2r3pvCniux9P z#q@`yTT(JY6HMI0RZ+*Uya|!EpOgUX%g^fs+~-xrJVA+e3;4n^n$S7=LJ^cyS$1IE z)Q)c%ml*jd;H=}0K46FU#rVJ-iwAjV{R*QMy*aPpcB!=2^0XRLk%%!a#7JEpSEk_M^8E zxKCb^$?{*l;50w>^xY+wKaB+Nahnz0dcZ5$1pnlARnFnQHP+Y;ieFwR^qYSfAJkwy*zD<>rlH+UG~auO>Hg z-+lANe)O*=_B&+{{lJbYu4tyUNiRD z-G;59&26u1+zxV+%u{6eJaMdZ91tEp)_i*taZ{IE`} z){pFky7rHj4EDD(Mh3%4$#ZSH*Ilwc2v`&_I>v7nBTIg9-@f_HmDA5PR#fH5clDH! zh$sngTZu`LOeCCGui;?T>l!>$+%S-kes894UOMM~<8ENYHZzj+LB19fL$4&)_3Y&U zN9khUS@DkLQ@sm(y*Y?W&q^4JBFB^mp3iK*UTLy(LdgyKc_hw0`KX{N&Fy1jw!8H* zur$kT9NYGOzBZ}L&+1FY^GQ=LJZL4Elj8meJ|Q1cYgdszG2ij;nqAj9F~4ram9D{q zw$IgF_trK;gA%?g_XJ_p;f~rQ5qCtXeYwDoAfkS%ARO#3=M^61yj%4kN6(}6*_*Fd zD(-$_*vWyA5IwJH``-!)V_`!AU`O`6;aEP;yLk?~duDXa7MfaY%GRcU^gaso zgn)oT`MN|F>yBWLZXofv;66@>RYt@(9?xWQToF$UmKOqguL{KF|x(YiOV)R|LJir0nLN zU8#_ibfyF{;mfa*q|%K;;t8~1gS9=L`0*mp_RR88Q8dzfiZ) zzuys%CMpX0KcxHk%^DnN{4!q58mO|2)je~B=eYVl`u>3>aQr=@gsuD{)pLg=u;p_8 z2KVK=U9H-alQUk{sd{Rd+Ez9ytFzn;nK6ug^Q^8s&|H(ayGX7{+I6u#YM_yxHx)iT zoOhT!_?JWPUxn(=(*!CHlh(1vAAPKl+kI3f!;n8S0*S{}1|J99q7@d&a4PqWKgG0h86@KxGu-Pg?plC@i|h>CD(dDfI18X4%L;k{(`KB6M1C#y#i0~u}i0}elb9JEZsH0)+qowqoMZNV$sPoC=->?6mw7qcE z-kB0f>-uBE%tlqxIElEjLfZQ;o8XK|eE_<3yaV3as=v>f`+svONfuX@enqhJCdtrb z&Gs6CsM732^ktW)Gx1jjnzJ0uIq^}E>@y2KR0gDq%ZnC8~)&a!&D1d>41aeyMSRc%`Yc&x&T5W0=F#exO z;v|?P)@BNOtrOS{>wbFdRbqiYsl8P!C<3F|8v+V(Yt}teXBlA~aEF~QI`S--T4*S( zV!{e5KZZTc9Ps6OxTf|n9Le~<^{8wCen$b!8I8IJ0DwW+9D1~S_A0t&h`fH9Re7->79oAmKsAdh2u0lhn^q*jOua_v)A#>TV1_FexMG^bxjbD{|;o3PZ=bUV353OoRxs&|BnEf%7T#i z)BhPG;9OF%%sqo4uM*T)n(&$>5XVKoJGvjK-jL+>G|sRs+642?JSr zOf}=}y#2e^95jdOO^)&kRe4n69+KAn-<2OXmEQdG@$l_ChzMMkZnA`Zs)Vs`U9}z( z9y1ic#<#bcvf#&-`b)IYln?CVe3?2P4NY~{t=+R)#LtWSvUw%7QODWSua*4Nzn$l_ z;-T<3YVCtB&b_ej0}0PH9eP82QA7Y&bzNDthDZxrBcP+!TzqiuCOy=UO_iLZX5ch7 zQ>OU{+#zxh+hm$O?^sMD^de*rm4>z7dTCLq4_#PU`v=d&qFc-^U%ch#GaeL@KQw-2 z=o!}N+3kzY!6C2#Nw)#9HL*b#Syr-H+T==p9p2r{OpUWQ^qsldW`{m%d%x{tk}Xp5 z=FFGxwKc8hFFmzSEv-^93GNB0e|V@Cq?LsWS2f}l7v2uDA^wt{HZ!53MrAd03(g-PXZMltxp#56`?)W&k^`6`<`43sOQEpM z^T9C=j}(xpEfFUhSrMcJd|q4E7T=%z`-VT}Z-h9TAl);xIpC=+i(4Pa5=~#eU%Nlq zuX37uu24~_E;CU$WBkoV8Z%?4k;F#8^OoLt*;`5eEGUmNy;h7Ej!#g3D@GnA?)UK; z2SwAh^`H=u_xkaNYc%i@`Kvsl7N#v5tAAVUpW)VRHUQvz2WpQ~W%BOCIWm;UUqfVE zakc*$MW6%jG{Ioq-<}H2dm?9tufpe60&w@6jIxrWAQAJPdC@%2A+9S{SsZD>ZKY?> zGIzFIqzgKOR_;4rj6jWIHixRiq{5tezuuL7`i*PBtBM%Q2KYB~m8yD5t- zRZ`rjr}Yc$P@ zFTJSVq3!z^{FIVdI65fd6(s&aEV@G=_+P91=;_gD+_dEx>bh0r>}@kl(DfIv^*NOC z#<(I?eY>Jy{fof1y7O=m7UWuHl>n2O7VUv#iTo^Q0`vA~isb|A64iA2vyDcHl zIBlXl31L&Z*hEXS6T6HMKUe~MoSyNaz!OCQx4EZ!Rc;HlD|2#x0}LBz3r-6lnGMHe z%|8g7ob1kGR=)ycu;j|ZSu^;woe-2yj>f@C&iE@#!59R1vTzfOK391K<VOyEOU4LULaQAtVV_>mbNXU`k z$>LfVLxNxy?#9L57u|ks$`CX7N&7-{(1IZZw;79WUJ3qp>4ad5@<|BJHV)nVGgzjq zCK}dmh&&K-#IeND!n}WO#HDe4_(cl0g6yA*W%ls1kf0IV>*7mlRzxfA1#2Ja(@id$ z#QDb@&J|K(jW?#?tL&usLij}Cand{qP+ouP`^BlkHlRquXw%>}!<Cr}-xzu@G(dfKYW}os{ zbP&rYSW(GS$b;U+?folUBgFGm9AkD%diW^gYc23^+>1C z;6h`N%ADC7f97VPKu&|;cho||P4HmIIIk|U_vULmYsj1C@nYwtOfmCqfFymx9eFaNIDfcxRFjWNtMQWZ98Z^trcl%cmTcExlDP9}dmJ6I2M z?r06jzEm*3LdqIvYsqU2OY)d=wjnohA&r&%4G}o4~1I_2ebT; z?OWz5zV}2z!R={E;EspBiKY}M68xUwomvHms8)&mFTKU&1wHPP91fZ$lq7$_h|s|J zj-&RtPDx(d+Whw#78}xg-N&!J=SLZMb^ zBn^~_Mi6JiC{=rKUR108(SzJ>xrmT#fmC=(lyd>Yjz&Q;vO^PqDi9n%?Myb*h)Zin zgxFd+^{HGf**MB2|7Jn06>5L1K9l=Yjzhnr@ws-ig4(puOGiz@=>s4!!tfYT=jFktmA5AD95Bvz#xnEH~+9eWHI6l zL}@NasQJM+PJ=DKwoK*-f5$n;>B57LuBU^`k+>+i^L6emE5c&v-SD-eAmWj;^ZyBCaj;S-jE)WfiWG~-IrgvWNG zG_{~q@9JtjWd&FswQx;d}MUePzMFKhd+Z0PR*n(E1RjVgQ%iusWni+=;x?__CdJQab64yA@dTz8&zLU{E@k`F(0A3Vc;p-cConM zc<@?XABT6UK78UO4`AxI%U*dFc6h5BZr@H{rblz zB4R(UcuxdU_(s_`mli*~&m;SEgZvH@Z!Aoy2ygY_%y_Bc6M_7o&#wDUou)7DZghVd z2qONX0W{r~7%@p`@!Bsn1dc*$SYCPY}gG-?52v|C+wIXWlLitm)nYISTjLzc-69f{4`60aK9f zuQxZ|QE_Jp)EuGd^@;zQ4qOJGBVt~h-5^S7dyjZdnufB191xy5ij5J+m5L6GHe5cjuwWCjueo-2{-ZPvWhhi0b>Zs!Aor;F@ZCi znQ&3?Et(z=0HT5&VE&p)*-17r1n%If|Mj5LU6ZmWo==OU1WKq8k(WvOI_ zty7;Q7`NKJUB@68%_l&AX5^x7C=&Ci!KG_1m4o=5D^b{}8Z@<}uxT>4MK`ar*3RU8 zK4ZAE6?nT}nP0BKp#733m@82g7RN~E?Va1tjdmEfe~8%R%G*19HJ>ku$9T}ySpL+P zh1YkD?-14)1*_srg4?he%wvTm@*nU=;du*Pt)>S#`b*@Qv5emB5k+k%wRJB9*M)=; z@$>{_!(G2{Ut%s;N332uO|Tn=q3M4y2rdY;U5s#NMfY5a5QY&=KBPB*<~5ERi-NeK!)UAg-?jP8-V%!#1hW zv|kf|JL*f^=o_&y!mu#^tY@{?bdhYhhf+V4nZw=nF!37(dET2ykMwFpb?C3 z0P^Yd;((oY==t_^v7kMR@Rs+?hx|XjF_N? zfKHvy%pO%0{o-Nz4H`nuM-~XM&1>m03MtArG|Jz!O^}d<9*jFHlpaB8Vlu)WP?huC ze$I}v@y+s>aB*G`J(Fj|xec-p6EFnhh*cU~6w7tmxfGfHp{MDN)Csr{_Hk)}AHNkgZx@4J$ zFsj2?z~YG`(_2fX(vWg>-yY(57aow#=kys?>>>{7kJprmCnaLj|D58tFR9O zJ?Z3!25chds*MEqsguehPs+Kglh4AGzXi~6pjIkA-+okKtk!vO=dm*4;V+vosk=@M zFC@F#yt(W?+H>S6!A(aSOkkvc2^GsoIoi;Qeg5Yy;t(mj*6)qc?v#$aWsmZl0IjVVqsUz8zdEKctNkKr4p%LvzMR_M)tI?* zRs?>3q^g3YSLaTpv*|fA-z*LI@b;J3pJpczGKa0Dy5)DQ8^(T|Rr!V*s#W>$x~IP4 z*awH+e14K>Q7J4XpiZKZTj{-^EaJ>;tERO700Oa0O?C-`+4RZ)VW@=%C* zLo|9NjFgernlwYc#-YBm=PcsF=y8O3 z)?3T+N%!Eln}beW5@}mx5gI&%oVAp=)pg^G&T8$qljxPETNZPr!D5NtFZXON9YLuN z3s%^jllTAMjSU z(TlTkq!RSan$6^tm1yx_h0J_8mO%>c-|!&`O*F!`Kfa)si4FvnpAVsiHlKU1_x4kj z3lYZk;Ck!^U-D)xXGSpPL6BgNHgfLUW1l@D4?Q7-;YgY$W;5YygrUQvjeETVK!{#G=KSD)!jm+uA%<^atU-I&{Q?59w*oCi$Pj_xsBS}XSNkpG z>`yVDysw3E^R~h|8P3hL?RxX-eBN_co#lAdwMQsqy^j~_FF8Cu3yX93 z>g^rF-Me~j9g4Fse0?9K(3q7xC*8fUo;Z*0+OzdV1bLnyn|{n5xx^J_ucSdb**BA| z0RGGtQ+qO#PP#Os8RZ|n^=3s?M?1>&*_JEJqVIM$-oI>&gzulj#nBxhEP3}1V%eXEKlN-~M| ze9zuJ-9}}pIcMK)E6!N0(Z$|B5mu|>@HsijBHm8W%%`0ytd;^yodWD`HwD;*5&#TT zeKv5QzYV~TMbaE7W+iK>5^YxfNGA{3)mP7jw^rq8mS30Qbls{)e~z7lQd!2R+?{D? zunJ!wp5DVYX4MkRmPvic;_I&)SYnZ&>T*QC+3h%hew1i_K!G(`J$zti_&U)pKWHqB zY+%SJ662_PPwpL7NhD@V`vQ~5Tt@_d4i8q)>{G{v0R>4^A`NG?%3a%+KwNPS13x(y z6##R!>VP>tA+r>=&~*6j>Ag!CLzjLT!q|cVMSKX+IP}-!W0_YVS{sN07UF4{GC_}L zhOZ-w=-1A@Hh)4PFF5q9kLL-7jgXmt>;HkBna2KUdJ^A$N!aLFM}o@SVP6wm7?5_# zokCht7hn`{prz9jpmLYs%1`00x<7y>uHCh}&dnbQ9Lc4p;NMC36)}&#n?_#07po`K zU2&dCbIt!yJQx`x$<1^>R0u1_zvo=wAkc^0QlEQdj=Yj@F!!j9%9FX8i9DyG2WokL z`49%f`Ud_$MMzE=)(>K;nH+fOJvFMCZhnD3oqc47L~G|#`f(`$_*k9;eDkBC>Q_)P zlJ9r0%QIIU1mds$>F*6l9-dPNO*Eb4GwpM*++YELnAP3V*>-FZ6E}2 zVd6VjOKC^tDA4C$i27p&6@T$Rfd6=KL!I*v9U1n)pu2WBz?YqgW&1qm^rTpo4PpGbJ*zWjg_ujQ;ue0Jun|!@!*`Q^f13>UXsx2Dg5TyEyB1e=nQAx$wZUOTFEZgZKXT=it#2 zV|Ev5yylO@i-A8>mSbW*q#Qlcy(+e%dhAvVV@UNi#(ci55v}eEn=8Lr@AbwDHd}mp z_$atn1}9sa*WM4yjrv1QR0wA!C%0uSyow=2StS{mDM z>m|aOpmQzvVyCVS9O5$|)y>dB zyH9UvxDzUuC)Oacvsz#rd4!Az_iZzk*5|h)++)*1EJegIBij#@*gY(+L!Q~*hZ@Fve4K0W< z@9Sxi*Fa?KL`Wg4q67CN!^Y;Dk-I2ZT2#@De#Q(~#DgEkz2gvbF+%0@TP_#pnF5>g zAiRFrN)BdY)*p6oU6S0Tvxt=i8;@mK=)IpMmW^2t&yyYtLi4GIoBUNwz3=1SH&-V8 z=BaN7H(Stxz?Y<%;m(H9{Zmsqnur26r|}|nIFpE}QBQ#KzPWrK%BC^vR~TY5qV>`> zNXg;@f0Zv#kL+mOQ-41k1?Y%pSqA>{8?4Rc4)qh(oA35Nc0wFrlFFwYZ4$9YI}!_r z2{Ldt+Y*e>#A=3VCI+V0?oWOM^^RH6!Pf|jPNCOP(2WTjL`DFwoP-C?PLSz9((_PL zXl21N5Fmu<(UKQ<++sUX+pIfZBj`XzJCY8L}fyyP_vDyR668>oduY>A6?>iR; zlm~xH>(L7$9D2*c^xDfT6`?!|*Sw|FpD*V_jgw0%O#mT%-POzt3p){Zf@SbLP0JGx zgA)%lU6R!LSJn;Bg+h$9RaxKzD&_q;wEosdf8j=Qj-%#4dws4> zah5aPvQ9ZVL;XRmv_)e>bES{+e%C)f?r{yvIuVyeFYRivvpCz}O$L$hHv^%~IPK7e z=py-{NiM+7ThFpgI>|MCfRQ@xrh1ybAlG5uc_t5Vn2RuSUMD-3Jzv&m7uzl=4SNV= z=eGMmS*=+Qvj_x}aCx`4Ao?X^2BlyZo0{7YO}^F>Km$O*GxR?f&CmvgQ?yERl!Ce- zhZ1q81aQYw9F~})UmidAj_3G$!F;Sj2kKZ;=;sFUKxBgunN5fskG*#;>#fK7K0}CE zON%Fm_!k{<*r3qwStM971NnLL=EXnG|K;bevft*)A=yWhp$_`Uzo_`V_Pv0xfBc|7rt3M9IyCBK@%Oz0sZrWu^FzbEM= zzxst-MTPV0ElKw&+sllzNnoG17{6rjR%JNAim3`45Xxi4SRHLKWTi*X zWNq?eFuXN_Chq3@hAlm%js0S2@GwO4TR?g0uOIKcdYfN}+pxwD4+FW~6z#eB4tJ_& zG#Gg#ub$Q8b)M9gHCxzwN-Cj%Ih1C;-QVK_QFG|{3yOaaF&J^&Kkc8Q+gtO=)_2wB zh}=V%es`gwj~@&$m$)+g^%dN!DCuD^!V|IyyA%;Wfy?dwkFroJrd5J;^7wDt zz54bnWae8ddG`0DJ?SxgULa*$8ntp>hFIeWP!d6^kUYVJmdSgyZ*|I_*`sy;cg$y| zh_DB=I8+1F_TK>JjvQ6D?}~Nw5cG{;vCU!Vq#-H%q*3bWR5oyKW%Dw`*p?F{^xTO? z^A{MM$(a1sl#_a~yxU$f-PB5407*HdvZu+7oM+XTZ8POo8@4Kl9OH2=f) zQSRSdu+fu(bgDgucKHYFBf@3hv2ThV8o0O zUn283xt_O3l_((lu64&mr{c;Fh%G|Y2jM>&&Kl>FkBTq8Mq++QivD%XHSYfg-ralz z+34hn`$3e4bx$1uqlgc$<98>t*TOp5c|W|~TOZ#igk?Jn2*Ilh#lJGC{AGt0M|VjZ z9FmL5LD4<7NlS_Ol=|DxTafN3`FD3b6~DB-!q;_O20^Gj>edEG)6CMTbjEb)}p90=W{R85(?9GW2X9kB6VQRsi+?*g3AT3~& zHE}AU#Siged&BNOwLu!0_uDny9TiwK?eawdiD3cXm#`kfwdHl_XmdkyQ438$V8IR& zicjs|ne%{<)4+LQW^^?0P>3}$?=koD7SYuZT)z-+-knEyNW=pi_}&Hbww%->1`OK6 zF|W&m%Yix~{09ov%GPog7QjFwc%&RWbZOcLm>56-*XtSRkuOXqw9sxaOokN0e&JL2 z|E}^7ik7)wJYqqqvfK9IwaZ#_3>0^$l^4UDcX^nw$@15^)6H`8*NA{BaH-w=`|R~2 z858n!gvyupIQ>dJiYZDzWeJxU2`k<|j*3SR@&#m{OhyTv?{L4EhN+fD(P$tibW6(LTR{ZN^zj`~FOrPiO)W4>DVq;&YVku%4)Eh6IV$EET21mUJue8?I4y6m)0cbDe?v12f@+YPM!G={{4dZRiCzI1%Q8H z{*FcL|KMlEemo01dxg@AwD}iSD9+0Ez80F{9C_*7fALFJ#xMD_(W3xuRV$PvV{(Is`?PusQ{k-v3Iu;<2FHAfB}#H0F#BEN56fVV3fv{* zV&-^1a2dSXU6!ss9tai!6pPQh{Rvg9EGk@lxpC^AF8GwKIzEjY&|4*3# z=hmeIzCPOJ?&GF*_d+(}JJd&Qc&AHv&-I9&cV~Yq9;)!(nwh#Ad0ZsH;m8YH8glHG zv9HrPOet^I%1=tTc>zFF0rh$*UoGqVblP8*t6X#eu)YPTZ^qBGsC!p2df#oH{dU`cEt)dlI(w<_K*4R$0 z>a!N^2Ks$Gghr5T@upB4Y}k&Lnu?TW(MJbWQ%>O=M0c=rX6aU#)uu(1ho(DpXl{Lp zt%3A+gm{0>VQJ7fIQK#u9*Wk;y%#ywFt_pA<9wm|HI#1sWKNY`0n(xNl4ZY9tBxvp z)ItWC6!w5&pBquFOkh3nj_5I`~))lh; zJcCXAATDTGJ+ymUWk=_=!|IQ9p?mO9vgN#mOUk9p>yrneFjNsG(Dw-S4zz`=$PpBdeoz3xT?BDd!*deV)CCr!z?xjZV(z2xGqz?C01|ojNTKk=HmZOx@v_ocH=lKRqY8Rg1+sW1WAmrLYRN@eATn|ILTT}LT0 zmS61K-OP_^Uz+YpXI5vz;vr!P*Gok4Z?~Q*h{^7MWlcF2jYQqqeHY<;v3W>Lc(YPr zlUw!I{a*LR0URuYOCF@8be9*;cs& zyE?pfZ}#v!894H8dq3!Yi6C3XhxQ=6@RFp7X=D<2UaMBw7nC!&Q^1w#X!h(lz}3J_ z?7VH-@eT0L72i9YUf`Dn+7rG518NYlI9I~Kew&rvL?C#LaA-n_hsF3k;@!{YqvOZO zhG=6yz3S7$XehUoF1*)#GpCD7!w-{7 z8{Em5fcv%WtO3&K1%_5bhi@b;=*lHSI~$E*{&qD6uv#Z0LWc+)Nl*jR$W!EXQ4^~e z7#_Dh$aE)XovyJ#atKeb$yg~41UFm8eJs=|uEW{zK6A#+jSbFH>CJV4<)bO%w(4B5 zX#K3Ww%o^H=RwoopQ9_X(Z+XMgmhNa?&L&z`>^B8;F_@*2A4Z4q>a|mOz7p5bdW;-4X3`cq+HpGF zNEBTP5>NE^cr{qdJS=}+tH?^vag0^zou`1WU0sN($>(1D(WV;KYc{mI-qYo{LM2Cc7(g-I5Mcu?7UFpl^4xpGvt@L;78{X8lSH+wbjJxF%lBT0&C0q=~OTjQ?B z&<~jF%R)@gs+&!41X7bMmudY8Gk`#GG=5e5y1X-_iRBvmAO}`~kq0}i5qvOlg-_3x zr&*J~q;Fx|YouaX`ex_%(tMqH(T?M6xcHE!#X^(M9R%3$Y|M){%;lRxUERohAXFX7 zf}pp>>$pwGAJDq=qcahnYp!N7o1z_}l(MEv9VM;&;K;#arD&=mti$8DIrrjwvF3z; zhSY!6-`Fzb_15^p+Rym#C>gDYoqaEM-TfgBy;CJZzuE5e_pjpfDG|-_L=o!2 z(II3kTiqz}_;56Uxc_Qi8uvU^3*63VTEx%qfY-Yw^oTcL^>XcgsF29A=O@Xa2jl@s z(%$1w+;g1R2it*GF1N(|m(9-p=&;<@@*ifLl`T-jtG9Qyw#_m;c)@;eAv5<6vbXgA zr4Xpk@)phhLV>GbN$}-@XTw#$tHdHNlO9n`xv?j;p);|hv6J7FyrJ}e!YzHPK(mUJZ+Z-P3m5sncnfJQx4}XyTA_%y`(0UWB1X8eSSbmBV%9jy zK7YHN-G&6HX-@bg&E&+X1O$GtU{O|(jw_iug^Fw*GP@vWX0RI%$oV|Jn-~YwK1CZF zVi_vQ6Ie{pXDGNmhOcdk3J-hoRZ8`VH+fZP&iJWgdO`Gxka*tR^}obPyXobw?*@h) z%bvGCM4McSAbG(k-ngh)~u+<;mkcja-qtHiv%$ z+Q8&^8emrN@F1i2pM?ytaNtU!u0roHLUsqij}J|@=D`Qd8I29UfbK>0zWmWe^AHyH z-@t~k5pQ+wZ(4;hi{=GC(XuGY?OQ*Zfl~J3qGsi^Gdckv;^nD-(2*a3Asbs_8zPMv zC#GUKMW9V1k`(Ipl!d@>hW^oGCkXAiN$Cyf{QoOCP7txh!a_L1y{!^;t?XXj*-ZRz zN(WWGrZb5%U5Z94k`Vv@#o1d1MD=`Oz$!?nxGacLvam}Ch)RRVB1oqool1wa(hDjm zOS6Os5>g_KG*Ul0Bm@cRW|8h%7T#I>zxCn$@_v~;_e`BRGk5RYndh0iV*e5h$H}!R z-~BZ%t1yPaTfBLGTIW4GRDW!B-m!kj0xc0!!&hnO8E;E4H01sKIKtHkQFZjgKkz5N z^!*NL>)!mo?qOGCL2QAwdP^Z;%xxaHn-(w|b~d9Uf=yok`>T;0h!>WFH=d6ExHN;K zeceK@B8B{6XB@l=|G=#)R3N$@%Gz2-Em=7!zj<9vYUA5fvWIo{a5&!I$xRB^5@1pk z9(SpcUsJaJBm*v%j)n70CI_#E{tam_yr4bWUXBiZZ(uXG2IrHye>p(Mi#CiU3od3> z2qhlpRRxu&$NTgXIf_Mo3X{A!`tI6tzz|O!M zy|H~gL&Y)!!UHp(^J#k9IHlaEj;&gDf`e%Ry8Yz!4|D@SF1T8pU)Fq3hWe{C2G|2{zbPb!2vx#3y!a{$>34S<`6h|K$&!QxHR<#cYcwAfM807TT4 zz}wsHVq+;4ovXMmpV(NTD1wFBqlX3PP%;CX^h7w{J=@H%+TixXf>@zhHh8+N_NYiA zI&@s&;!JF*?3_+^dk<|qIy6VGgLY&|{{=S8PEPx1`hm=Po`{R^4<@}b#N22!07h2z z#IJJ~c)IyO+rWEG*Hadj7EvUe9k7vTW6%r^LiB-@RXP>Do$oNwG(T34Cp0g zbi1xB=p|z~9C25hkKN2byx4iIJ)0Vq!W$1YeU&s|D`#x7`ynAhF~pY z${0(7tvK&Bk)IU+O?RDXI6SekFC9W-+F~bq3v`d|+$d(OTw-Geo>vOJ38icK-rtIn zHqU7PpYh!G%Cgd}sJv3ZLJ)QPcnR)OE;oA(bcuQnnsN9mT&%4J?&9OX)`l%VTaL@) zD=>*d9D|nN_etA8$3!q-Z-9YRw0v)de(TA7yb=IgWODy51+vxV`&*VIq#z0 z#2YN1o3}I`U&}peIgj1=%zWO^$Ja_W|275daQJLp-ncB8c7v*1 zAtnuR&P32R715{4ZkOfxQZQ=w0CeF$Cc^bbz(mkApDSpt9Ya$418{nBHKE>Kp%hOf zHhqnBl%@jtJ~N63^Ab7&zP8t#CnKP)N@;5(!+eP|GbkejeYn1rEwE({MQaNj z1)nJH*eep(3CP>jeG2-|osqNK9RWQIM`Ru)u))3Qv<-96tAL5{tc?3I{`LsGSdRTN zDhJeg880-#{wt7ZhKZSsySVS?DlRP@HQw+Q!p%Bhu#Ov8%7p;9JuT##P=w+YvWUBY zDbprMyWyd!Y0V`n6~zOWGtL$`qJ}4IV3`G$soxgPXe8uahqkLm_RkBU9~ZohVV{#C z=CjKX@YH}u0y07eAS2vm4wL>6A66@ zr2~`%-QMQ_#_tjJ5{l-De{2r!iDD?;G&C=ymI9DN~ zL35;1!Q`@9a%pAR=JSA$5K5NSKffLPct0zKJx+(1k3Um@t`#21$(`9zLi6^nHm6EY z9hteOl8wv0%=7&>F_!Fa$>uARY_|W(FdG;tMlakqJ>+^OXVH=w-0t}Bbo&`t+k}Cp z*FRTi5dKDR;#8G+G_Bedaujbmg!9mtqna&mKCb>e<~Av~*?qphREhIWjB8(jkkit1PC!ON8dFXQM`fX9xU&nywH^i!Ex4Tbi|FrmNm+im}GR^7))AAOPNq1eEtSgAx?FIK~&Ny}DB7SzMUe=~SW z!yiPKC543IK8=X^!x?%NKfe#ayTR) z?9UbMmZ9=;u`awk0?utE`>Gqu=A^yQaGn&}Umw;)}^-^I9D# zZYTZ?4HrM4@iZ!y`BI?Ck;857SjJyF(}WGoyVZkbT#F0uQdgD{I=kqfitUnh$-FB-(0)*kO)mxZH>pZuOv~(@d+@3robIeF}XI4T4{q zYkvm@@s0|0bN}f^b@|-y8MR%U2x~2tU5v^Ep!#BD$=4erXbVwa8tEj@*1Xna2@fA( zIbOs|)&#mY?fAb0n{MIbJR{TN<%-*qvjg*(N6dPwpDgx0cV*Y$kGtlqYq@bP_+_(K zd@cVSqet5-;m>J={EE zF$ma6m#y~;>pD`9*iJE8S%D68mq|uTaX-?a`iM8e=hen5zr#pA#n9ED-KMvJ65B_l zfj4=RX*S9<2~Wm*PX8e`BwT;P0%Fun%^kC9A(L~M*yI!bl!oAgP%Z!nH@QE)j^VhM zw26V|c?_A|P7(=aAc7hL=)b4Dl?0{6Td_p39)@N8Ym4?xlDwE^*OoOh=&!pCE~ zlb}g^4K#V4J<1V`ehsn&%_TpAW^W}RqUL+I8$okR4`{mFx&i3;$1)Q^lMLo3GIzK8 zR3P<28z~qu?#X9hD;K_h__rwVVCtw>B#~xgOdGU8_%{FVrrcilE&?HfLI-F#Cd;;- zv`w5?4P_8o728cQWaPf^)8Xu#lMoDW{!O^A1`7e*XOFnJC*=x3u{V#We`&RfE%owO z%+?+gl3=YI^(_`IpXL!b3F#n-rN?%X*7b*n|2PRZ!Bdw%PPKBmcP^RWnXE9v#K{^L z-@0cm#5L=|ncm!v48B!g{VOL#V)q<)&QHj*!ckbWjQE#_BY}_y|1M11$a0)t1DN0N z44A)RUow&NGt65ym_SPi0k+g@9q8_jIp3L>WToc(5B!6{9Vv{3s^DBLH_WhzXX8)O&*|e?rqK43k8pJ?g@fDl~!hh zUb4aGBP8zO`iO2BXpRQmD!gVVXA+hh?(KI1C>6$qp!n|{mq_y-PF7lF04v6_ffcRd z47o$+hU*ys!%d7UCvsB4&kdjWLU3XWPFVkSn{%%`RJ$fui_pafzdCb`h1cmgfjtKV zd&I1aJq97I;s_Z~jRB~J_kTv@dDN!?|NPk5q_QPya{5Agt_T4 zY@)O?hUiNgHiKy0?WZ-{2$BV>pf6u(8h?zf?3;nrA&`x+L_SK zs9Yt-v*>d_R2ZRhol$x4a5eC0G^Rw9Q8qdU{&{~38cd^~(X>0^Y_v#qgba1w*&zPV%VTX>H@ zFljE6HPmVPedR3`s6UVC0xE(2a2=0CZ2fbD2OA zaIS#eXG75u~}j zYHpO470Z0f>~Xs#T{?uw%`p6uV!C{}x4_tD!NnBdEB?7F^3!@`F9 zu*CnvN)IHK0F#Ny+<$BYrs5mB=@ubqg21 zulz=62Phnh-_m%n9>*i4?jL&b4VtV`-dyU+?5$!M^W7&`OaT``I$*(r6Ws(D2T6?U8$6H{t9f zk10C&7RzN`HxMIrAH=NSX}o z(_+}y!D2XEzj!a-npq?J_Lu&G+9Y{-I-fru9ibmSq&H&zYui$g&o;{MX9DMy%zS&Q z^Drv)hIOK-t)|FPOMlpsavhJ{QlYf!w`?v3Vu?lee1R5ifM#zkj?|Y zTg0gO4cn}WhSP}VN)3Pq;Dq-Vqyzjh$R;n(`vSNAL=6v-j*W`oB?E*6oscaUx`0gs zAR=1!G4A9mZCFVd!hX$<^@B#**^{wwtH#sgk1T$1#3<_&$ymkea{@waRQ-1{Zuap} zJZYLD1+tah*5nDayzKLQJ++o1vXvQt_>E)E-hR{YkN6%mYX8hJvD8kj`|PnM0n}Yx zyFWjGPjDLq?1QJjnP0I!;T$_=Ljv+gb<=A&%VjIELv~CseuT6)eP3yiS__vsI&`n? zO!Zpkhlz-z#jdH_p6~wp2Pk&Hd=9_m2tMVMP+y9BiYq zK?*5Qx*c}Wa!RJwGsR_QSLGTrUum*W6Y*G0HSRV0{ryrwFQ>0`2<3IoBIju5OPqB(9r0?-ZZdXYA|A%TZ69$0$ z*lqC-={e%HB{V9Z*9yo%#shoPH8OF^G?o7V#UQ6XVlBPrsr0Cat;!byVZuhN)Q8 zSltd_=qUbuq|<1fFEQt3 zVz5@Nl=}5=dMhIl=6}qDV*)e5B7y-zFamIA#&z~?-b@u1^uCa$Y|c5*_y^hf5rTWN z7S2c>9*orB{5<>tnKxh7k-k8!g}8ZiM=WAff>LCs+>KOf_l#AuQ;=eI1eb+dQNVAl z$(&ja-)iyWAT**_uX^XKMzywsq)`Zkj(nF+Up>rm86VIf9Hco9K^i_HJN)%|NrF<# zR)mY{p=-H_gUlJxc|U_K*@ru4kEg>M1PiNE*DF&sN0n4dsK%tBceVWD00Uq8PwO+g zOMpzlA?tff?M8&6J&Dg|mw)>dTf@rCl;8|la;F40sq%DozV*Q4jBeWa^Rd?Y(MPjs z_MqbB5HlLa3lfNjHH&(k+@}Bz>|pXH^hTdt#r?@+dzNwC2BGh!wkvv0KlVIQDfOD0#N{`C%Cj?Vm%&8vjfHrg;q(S1gA7(3Tb{Tc9d}MD(ci}AbN{Dv= z+yrA`F7o4cjjH8=KXk7MT_FV+2j+_`5$C}*H*YTUM0 zA7Q&p=d=D7IuX|nh$w0S{E}thYPaJ^)GIp_)C7RpLBF-opbRAAW2&2m1x9I+`8IR;{q z_zB+PU_#;Vt%pPr)z@o*q{} zZ{{Y!Pf^be`U%C$ox5qI@?Rwt;FZ1Omt2KgKh=>T@=~WT?C<#k&4c7>Fj&zE70%&<3?gZMjsd_Nc zEl`I22_hTTqN*$$ttvF@Az9s+sL}X(`zJj06VqZH-@~Qq3FyN<^o`j`l}kG($KG+S z9gHQ5>I)~M8ExSkT&=-$Rc39GC92X0m!G1#i7YE!&}6xuG`_WXwcS)_l2$>cj!)C$ zI)IK4xjBJNcHeJT_;#a}k;x*`iSss#th`w--D}t|%7n_x#pyuiWxOj+8GU-d5A)R# z@WOwx=%kBZ$D9RsEDAA?_xO;uR7xSi21GNm|s!HaXf62w$oG-~?LDq(nT?2EB)N+r!FX`Fo?X2wmPM4d1dc$*+%|E5srf1z-QStagj9bz$erTd5@7Wt_1{3 zL)C@!o!CekfGfz!XzS7Lof;Hn(ZTF6i<)$p5bIWZ)+f06q#$>bh~l4{6-vgL@JP?C zkS}wgZiLkc9=7w}nknR9-FE+ZbInJDl77oHAfI>d4?iX{MaXSYFI;v3f^Zy&CI4N? zgdb)>VRdg}@O`qmfk=(87lAsQdLPW^g+=s4Q6 z|2Rt#-SveWtEj-dqFL%utALQ;(%aUvT|QgmwD@v|PMSn0#TBXU`|~8Qs?bZ0WjNj> zE^R_)ar;k6KnAnxh*})^cy&)}Y=rMT+vWJ;cGHDtxpidx$|^vZ?&w|Sk3vp4;TLOmdoT0_W2zm(xEfWE!MQ5-oN55tN2&HvgG_FfH% z7WORFw!DWc=q^8NGPa*GBB|y$2j(}{8|;(2t_o86Ct+V)%4|jEICn1l9~3uDEuX1s zX0smev`_I=huboHFd+hzw!U2x=NmB~6&G4T*`1^+Z?-u2jqDwKC*y<*oi0bd1shel zka`2RU&pv5&y1+O{T(%f2uXR#Fkgwk$LRs#idUAgxq904{*jkvqu<}WJ@-umeCwi0 zyYLtzPJ-#QV^A?@ejXv2v3(Lw4R*53D6jC}NAiu+5sD6onOW!l7vb(fsDZ`8 z18h02f>)@f=wsb~S%<#-%Tg-xFH5S{|FZB{{mWvV6auoKH3t}ICrQjGHHuT-2q$_g zHHqbfOJ|znP%RZDlc**Bn2lpGa?YhVX`ap7E%dPy)S1&c9qU0FPFC%N@Zeky{0ZdE z8w7bXqZ5R`=n1jEX3xX(^uJur^$*Wel0*{9;Xzb$C^mdn20nOKk-3_D=dz>uh*`4e z)NyfJp3(kY^9aw&BiHS8aswm0g0Qn>xHTFNL@p$JIx4oqM!~JoB zT6=uwqy42?C(7l&2gr;sSte#5>g?~c1$i)pf-?e^?oA>YA=?vJcT=@_U5X9qWY5!~ zCGQFtWO*WR>-piLHG`v4Xs@%TGsWgjd$S9ow$0X2;%_i3hRuGoDUi-3beY6X4ZrLL zE!B2|w}P~Z&UX0Z&rKy(A1fzm6M+@mdH1s>w6A$U7#4%vei&hV#+y#!lV*4oWyJfj z!8a|)`zABU4(KF9_t|ACd&x{og*h8hvXtqy3ea`_ zceHCN!A>dAVZ&ft(D|O<0X1QdlXIPeunDa(t_DUaYer?t9aFHcb6y!ZR?au=d=C*X z4K}Ey{(oe2qyrgEOC9e>xyi{pr$~aGY*1*>d7&FRAPyeubr2LeQO2gHC~z{9Kg5J1 z?2#SQ0gId{NIpy7p=Hb^X#&Q2k7ZcWZ6|LFXN=6pS1FO5DPyn7#FURB#ywX?~h>&KtP% z5iD4MH*_<~VE${F{RPfze$0(iwBWTUnE!-y*1famqUA97>Tj9-n5FI4@}$vn@cCbR zM45f2L-c5CId)AHpIo&z#ct2;zIbF=TT+6X6w2+9Q!!T))Dyt@I8vAQ~}PAMM_O%Y^5wW>xI} ze^m0hleC%a{W-$2*+HetVd}Q!O+ z{<+EW_OQ?W1f0vn#oJ_% zDt7Y)y&Enn?VbFB^9hl$I{uM%QrgDO=ZUng5~5@I&m*veh{=oR5pm>I>|S|`s)XnX zK0>tne575PO`6QJby5~?xtoNV7;6JS9WDXqrK{_<3xWu*^9Yp>gotK(LbdA7?SfEk zFO%n0>u(E?X|m6(zWGdoz=?8gYwn~jg#1k>(a@-GCxgVJ=ljd zW?5e&M684^VI_|rycor$qrhjVN2~8BWxB#t!@Aycynub3OKeZbiU_4U{@aw^aQdiq znHojar_KC{h!Q`QWxse~-2e6UFM0M!Kih}8J>zyT$bkx4R2NQKdWfNE?}aSOTtfo4 z9oB$ua&F$6gjz*jMK(T4VK+`&GM#iLoi(zmIu|coD_1>}86EU%eks}zn%V)qR|S`f zMm%wm2_UJKR0$vvQw2e_K0&e~NUk7&J_dohEC?{lAn4N|==2CW6N1iyptB?BTnIW3 zg3cENSwRV86smUxq4bHtwr~Lv&p~NxrysdNzov=xs8bs_%h;v-qn!u|*9ZxBK|*s1 zTex5?&Os%BeNL!@2AVK#!lpx9XMTevzIn1T;!8c#J3YqXY>?5>0u*`3ltmDI31Y!F zf*3~-kvRmhh#>al62uOIXq-WA&9aB@gBiU zM-zfrS56Q;2%>5wLBtTm$tr@FV+RbMdN)8^Eb@rMi6*~?F^U`5n&NIt2(xXa5*`uF zzPw|XLb`Qo^2+CGWPpH22%%LiViyjHFl^aw%ae{Kg-d72EJ6=WPb~-MiIT-n)I7^D zB!A}qmoPLh!hYVH-AYYRPP5V7$-2ofn~X3KuVK!(xHYcjKgBc zR_mo(P1bQ2o*9ZIY2J3d=GBYIjo-Y5=zpWToA!1??^SA!<`8k}B!FRGR;W z1AeOGwfN}LimXR8peuNU`sjUrs$g0ZT<4jXt_U0YwAr2ov3U^ks9Ik4w-^lET7RO7 zS_2H;=8x%r&-E-{H_A;MI<5IuC9qWHdcB?xz5608Xw~mHlElo$zc6Jb5Mrl1|1ASz zXBv>3Z!2YYBd?U{79PW2X0^umwk*kY%r%+6b5buS;n$;fOkd!{e~58pkDIo+NeqZC~5yiwcd zdfY_h-D06m`EKevtn;;Fd%WS20=bMcC}zSRV@Zg#zKvtsH4+x?VIlHxBbf^-zw@il z`hM7C){1+VFgNDxxx&z;{gdmw+EgzFWlg|^%bE9lNxqBGHvP+lgECPu8MCq`hv$u@ z*hh-7Y|t=`7Z%eF{~a~N((gq=C=2AuzoC&mu4NH&Yz`i|@)9cz-q?Y8LyU5ogpItl zLzH~jydhhshFo>n@lP;%=4L2i=~F5S<&G_oXUUOv8KbY>fvfO_nt`r=KajQup{R?;w4AHEj?< zW&nW4)dhzO;cTQ6J8Cc^hS-cm_U0d@UoeLQLo8kiO-HHc6u4tN7O+aRuku}PEr~5# zvAu%i=Uums3CB>Ot`zC$TPaRU5(^f%`kZLHMs3Mb364Iyvfh>_cuooYs9=&Ib@>&z z(gG%`eoWEh_kdsfHb?y4Y|u}rBMRhu{nBph?MrGT$*0?>N3%9){Kj($25WxZfQxU4!LFyW@)VSH3knqxR1|J^s-99l>F(A&t? zMfh2SzWEx#;>+rVPDj-$4tSQdXghfR@zWfKuR=%3?s7{6`w7w4Ky>nP$&46Ca7i0~ zZ*YeC9_pYh1V3n};=mn#^4dk^4;OkLYnc7)w_-64|MhbhO@ZE)`&tAzAV~U@N=a}% z7?G(3^Qr7r$+f~gjo8&W@Z6V-mLWExwi%3LTFpyHd>y5HsZ7Q1P)AG0s^LR^5BRJJhpU5pmL64 zrV8?Nr%vJyoCd@6z539K)2Gx!^Vf{GPFmLM-1cm*D-xOZeE;|ZSHPX?d5>aopB8b~ z`{0kGCNksV_r7?$3H(0M;3+0y9F;8gD!Tgq$n$~5Kmlgo35TE6SkZiVMuV!*Ozzke z>U2=c5Ke*ah?wF)?}8^H%H&ZV45`82O3`-0ayFdw5#+s%eONGHvd92Yv7xiwYWEH`*ZL8Wz5j>&0o!VID= zgX(AgG4*=Q&aBibJ3}(Bu0?nFz)V(w$h7KnVT9i2072HFI<{dd>i&5fsb;%eP3U7= zeFHY<`5R4fnZ;kl{M?!uArJ$q{zLO+jkQ5@%Aq$NPVviKHeqUC;ic4Xi(0Yzd(%h` ztt`0RyI*%keBX8k3W(sD_9qA3BlwER3)8?;{VY#u-PkRMQM){l?|x@xAw$8nX2!ZfL$|A z(#UL}vud{bSnnMZk+bs!6rn-9GA`jnpXV72_SY$!Rd^7u~c@>*{NtgwSQ&)J;QbjU6t)JvCWHtXm^u8;2A??QBS zvJD@Z&EszrReYsFqGz_rxWZBA!0I>?%lR~>er7wTRw084@&B-c1?&{6#EIS^0O+3 zlcyq(72vFD2&mV{L|WV}-?@ufs^kJP?_%Eua(MMsvPS-xCBG6I1zFjPK5gTRiMM{% z24ohq@3Vz9Cq#mY_mJ99Pcr{k7soWF_Fr>=H+`zTL7Tg?7VJ*>?7hS!gTN(>@+p<; zOsKnZ2@}`-<41l$nX{h%VTp$xAvTh~0gyjUyyf`ABBtO${vR7n6U1rW(APqWle`tyT;}~+^LZa#{vpq6nN@o=8)UT3rw+k9n%R@ltFAt zi9StNYSbl-yqpx+6hh42rrrzfcVszzWoX-o%ut`lrwCJ=@=zYT4iUwF?ppdKw?0$r zEk-_=xD}3msK&F={&FQQ*h_$Wku#}&etAv|jUJmXG#esi#INluu`+u84kQ~&?_$8k$^Y?obgP^q-pTK2ijr4x z1YZerj&Xb+vDsbD#b3Im#G2sVMSezw8%K?KU&&p;2(EU7%sEH}2r?%)epKYA!SWwe zk?&Ud#Z_GBdTE8*eeph;T}Naw@*rF{2K(({U{~!>b%JYQUez2`3iGKPQr!yL42UBc zFA5??B;^W2WmdY3nvvn_bbC9*LBENM)&KNb#By_#h~Qapm|Xq?S4)bbxdEKqs=w%l zQySLuLAnC;HEW4`Ymn#SwBA}D#_cn93wN`wBsCryHE#TDZ~mjPuf==Mp+wZDYWf#p z?uq-0ip6LYX|iWB1xdn@S|k02ZCK>p+0nO_$yQ(Ap272+3k9W$(SoO&&fmZgJIsMb z$r!qKeA@}-8`f~gZ*9a6i3I*3>wwEjoV}~+{bV*Kfzq9OWPxA}`DF271?yFJR(r~t z=X|de8WmE3?e_=>i8Q3__qZ7pX;_1fYxOjPMqQPn$9|QOzscJd{Bu(DzmDot1>HG* zRZs-2MZwIvzE$A@!}kiop6|lIlD<<~7PXw-{4KgHsJJLz0u7PYovVH)3$jnZn!~`m zrF8F=gDr0Ealtc_9WzHeA8a34N3y@W&GmKrFxLxVk%^AIWe;`d2CINY2WvxzzTeJG zpy~ur-&ULkg7sE_Aktn~%0*Iljv94-$$F!=N@DRQOW4M329~1~6jBWVnv@QF@e386?KYMN-~>9|H!%7YJ~-zR zWfqFosQGu1By(CW;0Y}HwrZA+W`}4;wV13|zgLnvvB8**9!jtGB6dj+MVRdMN$6A# z$hX>JwFd0q!}=X?m&}hOD^>HeKfP^=tmN;J*%aMZxcOE**gIt&JdggEu!Xcw=+Upv zM9D}K|4I>%WTsyV;>(b{3)hpDweeM8|UW~5=j{OePY;qliG7z>#PY6^a#k+=2uZd!cE zTyW2-dDSdYzrHpvD{%AxrLlqqqEpusib(Qv^B(H!(8o5{W}D20N7EmatTdn= zfcLN~n|%UHL>-xs!J>jHxgc`8r>Ll=BM%%V)Jb(uiH<`g%mE70^l_I7V zo(rlsfn}Q;*oftuUl7Z&5A$M<+URZ(J6yDF+?(dP&{Mhj7UZ7mCv^lGWPj%oDkWIq zM#Y6QNzIB2oUU|$w(2SpV{biG_L*xfE&do7%|J9v|LK<()P5pIi zGONz!!P=2LxS7K#_$}wHd)GPl9>(@6L+rNVyWG^6h)k#BvJz z`AWJeqMn~$jEWJF%iRs%<@;b}u%O6J?@Wo>L^e9xtfiMkNl4Gv@bbP$kUq4wf8Q16 zD#%*n_}NY1KMjj!I7m3krS!f_2qm)ZlFYXg$Ef4!&qBY&$T#-)N$F0}E@qAcKge6= z^Xb7_bW8o@_fPxaf7%C&!3a-UOov}S(zepzb>koXC~^3>Tjf)$()O{otiX21U>Nx} znEJgdiY@ss{x&;CbVy*Zme0ySatwBiF&53>@znbT_O&m4wKX|50_I%~ePGCb#D-*eb<(>FM zY1!UVc)+lrOm#J-JF?<9iJQ#l;T4bu__cXt&g!Dx-%rmt9(?7o34exbQvC97l2 zhApxnL*odHSx3G3rS#g^D`uhTN!nj0{C}Tr6`!%^vx&~~F>vbPc^6^L>2Qtcm74i? z&y8bF4Y_dBiIIjUCWcMkmdso3mcW!&IAJRyAykGn4w={SD37o@cp%xKmHi3&L4vZK z%qmIwFqg+XpwGd=AQi%@L(JbuYeuhgtZ{#g)wT9WIM&uMh)l)u3-DCzYgNCyu>wni z9W4imGvetAC;4C-AllQmg9ek(wI|Qs2XmR(9e(oQ*80OiV%M2<25RavX!LmcQ1|wt zc(VB*B51(8^llZiM>?5bCZznExoo?8Qt`UNj;ec?$ys1Gd%YOeWLtLw_S^g<-;n*K zMHOE3?B=(!`(oyk-`&rY_&2CX&+G?JACYgcSUI>H)*x`;f5KmGzC=eSIqT zM!E9)O`@YI-)nTh?0PgB;KJeEu^ ze(8xHYoDSFjNN*019_0ssxioIcQK=#f5S`Ykyr)7BSRp zTl%>uHVB!wrZB+IMXu+JOn7c!!(mq4N7`0^clJGWSNW3v>qpX8_bH2P@ExUk;p4G>L_(rgZK5aI!HsV<4DKjqE@!PP+LA* zheqv>Ylxu9D4(s9@2GD_AFIEY=fDWQS=h(E%$?JgIM~4Ojw{{j_TCN*Jmaj8aO6W} zX!Xk#ILT0oj^YiNsufBWj{vS>_OPj%O0h=+JnC17VZEWg7xQgl@M0#(3a>Yh4c>lJ z8Z_8f5EA5}Ln{C2JpBVJmKu@V4J@0e{qULzEM2hb2*S+Ms80)y^3|B8`hdC6a=uiF z`>k48HpOJ%_-*QnYB^*&=#TI=Pt<4sroJblLo z%)9K_(hB6b6|#8k-(`-v9lM|1>sWl|v+u4jnlili$7U$b9-N%M+$Uh9KtG|_4}C4J zukh01$5ivK-1P@0I#FTlC*NZ;qC>u^Ar*5Y?w$OAaXn>xj@Z|6tWE21s$YWP9s~OFKZnh<0H{1{ixrp1u zK#eaT_4%^6w9}&~u-xo50FDYq{t#tJ2sllJ{C2o}{Kq!v?OC$A%DRh^{a0QFi$-mQ z0oNj%A4Y4PEF_;DlPY-PtcY-tgX8bYUI1EZVR`RFI zqYO(O%B`u&B2FgQE2x6O7CE?s{qm{=)W_;VjZPh~h4*(5C-MJ10;~Csmc65rlts(# zDQcd-e(l&lsvU~bWgAUVD@K(y>OGmAV8|_#PSDL($rHq?zlVUeO3~iFOo-i3OWU(EC$aKHq1>8yR8fDf37m_ zyO4^-ZG8pNM5fuez=VxWNRF4h|Ly6Iae;}BjWfA4s`Qi`M!d~FKUGaybo!q!Jlb85 zT*O&SffpuS_XApw|BmkY7Qizkm0!=cNp#^lg0-%Jzg0fS)G5xh!nhEgagldmeI z(G6_snU3F2IdYj?a0AQylzx-QlR!LkMuWmqfttxR_?RMnVvVfPYJ=~gyh<{=MB-*E z*s|*=Ies2z(hrfMPn@k!o^JHi8T*j~mP>~u_Q#iYSTiJrOsh}TlHG?6a=vp@6u*uW zcWSRO;L!_{wuy91at-vy8hIxNgJnQ7Y9;|k@$?Ky%bhQB2PqZFWnj&5X9b0|-%0U~ z5nz_}uubt?8I+@+H}0MCO7R?fC=2@0VBdslNW_49Hg_VNXZZz1P@#Lle#AhRV6)8* zvUmVijD9;T@q;z*Z}Hykt^Y<CY~zrpi@#)P{gP9ZsDHcr&SJ4&S8)osRveNcXg zgvaEDdk$cIZ}PP6bM$!s71L_{nb5vrTRZxEf{Oz|;nHq!&H1#(vGD1_3|RQ>LEP#Q z+jvLwLdCqiOyfY;!_YG)eaD7?@<2HI=xd{ zYZEINNg^60OiFKBci+8$% zU$vIKoWJdj)$O3WJw*Jz5*z)lgfht_jux_Zl8^aD6_Fq5ldwDc*eBhuUd}Wnh>!>U z^1UoYPxbH_rs(Uzjq+cogw@eeMSES!d=&@ZIT3Sa1BUCB-ZU5Go60p9ieG0vItgAR zI)L@oy365qOk?DUOd~v#$>3nIbDf=CbRmqnShN4l(~ujPw%_G-nrh0DZMJsO^P?h3 zgmnRl|2k}$vtIBiqvk=CAnSvI`6hZf)$lUioPk|gEBl*8uQMeLswhe{>DdyJocVKx z>`UUo4tmQsp}S;-7wXu4-|0*Fym{whD#jWPmXC#l>DL5VD99?vCOhs-s@IIQ>D&*E zT-M3+IT*!hq_XcaUCG>D(FP+e*_Bvc3i0Te4&UpJ3j1&5i*Jj5&1v)1XH>o=f2pPW zS0$53A0Ng&zVqXNJnjB{*4+4ys#|wiOrCAoYvNCX3ma=lK3lHjthP5D zcHck&H%fJHB`D_7Ps(nUkxk+bX*5iXU8a*Xk4_co^Mg>Hb1l?KYF>9^1(8;ratE~FN;VLM+uN% z1iRF*+g+jFl`~M7y^W_S;o4I2VF_5JG=4U-cYQt3$1z44e}&vJU4E&;srS9GOo6Ah zmt)s5z!Nyk&gQ9JvKsM&1$FABN(h)9Z%&flk9xdRK<5doi*E2v>GD87zme=1JWo^@ zDgTYNT`yj!;TET7+~~%z*w7)9$VQ-oJaxtInlej+E$v~p`9E5VBxam`LHW64{hr_3 zFJjua_s8oFa1>W3EjHIkr;0Yq9-mO*(y=m9CX>FK;)zohkwsdeMs>y0pUF$_DYghx zJ8%y$Iy!fLH>hXatemCKEDH%3GAc;J*Ez@0xS5YvZgk_vx2|vW;?*WU@ZVgx`dfr% zW&rJNl}w6CYvSSCx%Oz{Xg@aHNZa|x%1@)5ZEvKQ9D9IZ96LYL+1$OsfD#yM%!;Jj zw;tJ}`S;XGjvbHNuk?vKbT|n;%?K2`PZg{Sr5Sb(I?!KLs^h-&B6mE_V+YYG#xeVU zaP}TRQ8ZDwr~!plBq})vK@e6zBrHKPf)W(TEIH@6uqz<2k|ZiY!jcgXNs_Yy0+K;; z6v?oFuq-*;8UFXGZrxY+y<4wp>zkSG?{uFzJ=5n*_fF4~=}&)_+=^EkZkVK9&Es2a zNh(oD5e5L-)3**BWi?^@R?rb5uCW$Dk-WOnx)SVWHEc#cNV zwXMal{oA8F4s$B1<+3=9;153V&>U`D@XO#%#juwjEI9R&TDmkS!UgZ+G;YPN%^R-# z6O(R=6F=+69W@;^Z8skH&d$%yRT*PkI`fPjkM>NuRi@u8Sq(y)7vpON?|)8ZVX%}n z9;#i6ogwi#J8Zq+Hm~(-k7Z)(zHQb;)S`J`tGyj&wZB5 zixcr>Znm@$va`Qha%VUWT)9Ze2lHK1VS+_Bn;LFowwElgXz9~f{B*TPDZ5xB`&sFY zv0q*ZOtO5UbdG(z?2z~$_KE0?J7fGM|2U=t)uENJ@;p^lK4g|v-*GcUfpgyeU@ccN zL2TbOC!}*X@DuJol_sLG`+KBz(U$FR7}i)5e0B!yDWe241xZfV(Rs|TP^-kQ%X)CG z-TV(GwE3Eq8KHwL-W>NwrQCs+p9TTl{#QN1giGWpibW_IT3(!H-yo%xt-o{OAY(gN zp7(DKqLg%aQh7pHwpa79@F-Mzc3)tOr%+iuFm& zx|C%#?|V3ZL1=HTgQuSs_JAGG{r@%qcdNYo|E4LDfu?9}o77>0j2Uog)K4T|9ENAi z$`4h-^z}YlH3Sa$%ZPTNCndTy62hO)EtL^d(k^{N(RRitL@3fqeBc-@<^^6dOZY+e zA}jJv1MEXKWV^g)Cj^uB%Du-n&+3@X?QyJH)cqWV>BH{NAq@?)zXZ;&>_q#Pj5(K1 zu-2cu4gGGu@K0y#kL?jT23Xa7Rw1d)Tj`eLJ2ogHTXNXf`U%#Qu+oKlUs-b$8e9ib z24ifFH`sL_x1B# z-zn)o3{qA?hWa<$b{VMyUP+u3_lI+?DU?Iy< zi=2G2W5bb5g|Yt(L^!a@>YK<54CKtZ12-q9Ox+T7FiOH|LlUHD^Xi5|3iWcO->;B$%c3eDX1Bk8C!UfDJRqR_e9Fpc;kP4vpbQGnBA} zUv9L*W4xF>2ey5OnO96ZPE>He7Ysm%D! z`3JBT#@*!NLYEJR9mq|cW+!B)L0vJ{d*wSB&~)dG5ijJ&3$oeB#dg2F>ab&Tld#E) z(v@GN=}==-3hOM>7Zua~NEPthn1pE4k%hIRp7OI-?#F>88(=RO(2B8H=P}xY73;0k za%n|pRbtS#z7cXQYRo>drN76dl{*K^%pZ$gkhG9=)L=>%21_<>wTZh8+yt(tAg=`A z1PxWe-Hq3E!mX+1`n~Zl{aXrEvEOVVj4+U z3B`&lLVIFbe@W;AYxT@;x!j1vyc%tmH+ii{q7xwR5~-k8Eb|O_3qO&8 zj4n2|Mw6udEqHFOpFLO?O&;J>FkMGNr-w`!a^tV>034LT75njSl}eYnE^T4y-|>!(xsl6 z$Tekis{ZmIxg7S$B-#F_NU2y{+>pP26{_!pdnRxL2OVhx=M8)i5L9GVw~oy1kq93j zn^l!_93_EO?S%k}pU@pU#AX(Jt|<1YBate$@QPchHVYq{4&BhN*Mzp@waKw0h~Hs< z&UwYAUvLH17c9C&rxR^Se0;S(7xukRNNn0)iLFBuLo*X*Sov3%5An{`nAz?}<$KAP zp?urwKiwORe#YWO!nFvEj;QSL?9I&py!e{%!L%#>g}!`h$G%U4&*pLBaT@F^M8%x? z<(yJ5Q*rNFxqm#>58%Iu*n$xz!(J2TwMM%^(qs)IOVTmK0Nw~W@k%5R^`~ZbDB6zU zpt2B4&@+<8QKM6YwQ0R|$6a%ze)9STpX9-hd0;R9g}o^;2#ZgG5`53&`6zquy8TcKtlCRkKR2FyRAlS58HJ z`HGHx&22lb0ji?0hYA&8?chcIrzmJI!X82--uEM=4Cvho${TnJVy7 z{aY8lx25cn$v0W^sxye1eZ4}P7KHm6jFXVF#RdVoS<7=D|6%ucrRGGl6*gdSndzFi z%w{g}zFiT*#9hV2Y!&M$4!juiW7)o!!IfRhKAn0|7ViZABJf*btuQ&~5B1X`b=byasyJaC`ky`?HJ+%tj#2OC_jHRF`6IG)#13WQfYrpeQ?)fbWYU> zP()He=HJA5G|XE;R#T4&mD-Rnz%?p3+R%?mxybgvp}BFZV=G(#oo?2&{X!33f$$*c zVx(}5KKQn2(KgSw2#>vymRw?6N~!1w{Vt6O7H=({Xv@%D&9x|%Mz+j+39c%oNd2af z!7$a5or$O@A>#mzxQ#nHSxr=;eY>0J!ER#@K6&xuK#a`=MYl;@iF{g!AGK0eiFonT z=fiGj%z&}|jm%wb(dc&r&`jd7czeXXtkdEqhT2;Kn&QzcyApTb3BFNl%0A55cmG-R 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

    QhcGCP0YSc+vosOd?A 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 diff --git a/build_pcb/middle.zip b/build_pcb/middle.zip deleted file mode 100644 index b58041ca569fce3da7b9212dd45c757e2044b682..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1790352 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�Qk^3$lMmiego%1=36=N#k$raoropNdocJ{9Zu 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

    1|iS4`b<$$ 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 z%0DoL(v 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

    1@oiXR|0U-NCc)LlADub2|8 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 z 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

    cA`#_aevj>WH7Hl?D5>=X`@qVb>n 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

    #?=H`A-8dN>#9^I9vZz+l1Vm*+JsWr*rX`}u8 zgLZ7bC^+5QbNy+3_58Vh4qmH?@{bQAe9b2T7MmllCtZFS6Xle)a?1c`Vn44k5W9JA zZ>{<;Kq>x`quQsD=Q9YVe-+^vmSMZj2X&01KwClU^h&4k*VtwsM6aUOO_9D zp(}W-Yf?{MHI!35b#hYH+2gZc}aY|KbWIS)_qc|1AFj!}&>#I^i!(D8BFsIta z;f}RaPse}G@0M+m^L$OFt}scBrta%xoxRI;WgE)z#IF0MXJqcnHR096HDl-tHkPo| z(OtNYnt0DNT5N~l?(AuhQ(x}UV#f8U*~9X9c_Jaqo<3kZ-q4vPcA}&7o{!3kOs;u- z)fis!ih8E5{Ktm`21e|T1elS9P=a2rF+bbhy|GVyQU?rNiBAi=^ovsB9KtLORW9@8!%!~9f*x1= zgq;aF=E5jBCPT5;-?QN?roy~yN1!fGOZPElP`cA=!jsB19f zx~c9zi|s+l=$x(Q_Awbj8TX=iPP}KigzX5Fz}2wHMW&dxJtzlT2o13 zt37MWs_jgaqC0V&8|9fi{%&(7)7tK=D3oYvS9{fk4I|UuTKL&oU0AF07ijEp_q5Z= zgk*8Av7Pqi$S+2fBBSZ5B(=v#3vQ|=l@Gl)G{yTDzhq)%aFEMxD)&=@>6Lkh_!7rn?4~6t!L2;nHI4LgO%|Xek~izZW}fQl zJ~NV>Ku^Bo*Oekzh-fR|F4(|TFaig<1wdkAor@^~(6(~Ztu`&kRUpanLZ4er{dX+E zQ6=hFH0W5h_)~K+Z?&rkWN--Vs4D+&9lT@{OKfJ4oh2%2R5Svk{WAY%0;&LoG+VfT ziY%#jIh-k|pldWYsZt60Wo-nmR51%=!}4?m?F1+{A&IbRIjJ38vwUU|#gtL&$B9@lfQEk;7V%f zUZP^w)z2>%yc6;BMepGw04YzrUwgjf5i?LUGFek^k|haco~~zwl6};Djqa-N+7xqX z`+!OWBX-v`S@SDk*de;g{K>gg)^9slSf1qDSXeiSm_YAJ<1Amm%fZv3LOYke6VHsn zr?$TK8SQwLD%asS@B?#0^)!joc7Dn63^GIaJJae?g0|&?|Co^S;;nY5$sa7-jEiHr zDlYx8`JXHP*jC^ec<*-PACQ!W5*+8W{Q*O$dsK-yy9^G#U9N-9`ZMR&ad)uN9IH;M z2-5nX6;|0Obhey1jaIUUSmSjxn1R&b6tL?tzY)jo_}-OA1@j!4yMn)8PUwj z(|@+C+N4JL5_qT^bHQxK=S}^K1ZeDB@{c=G6qVgDG-4pb8BV?gU;-4dv)$gUe$us?d14k3*u-Sh&vACxkAqd74EX+lO9JQzr- zN|P@BSJ@))X?Y+V_C95YD8w{6&7soD44Vz>=B);ntJ{tn_|6UGstJxyC;u7Yrs$IP zu|IC*`LxJ~ufgGue`Z*Lwo&kZjOa_J9a@}x=g|M$>W>k{7bM4*O#eV$V3t09vO>{5 z@?EfZ%+g@paj4_P&Dm#=NCxP}DRu`CRtawQU{^m%recFg$BNvj14%Rm_i0><(u7s6 zy`o0Ptj)v!=qfx(i2=AG_H~NF=vSlf`aFzix&ZCitM0acj-9FEv3&^m-NA`B3uGX( z=XZ3!Lv-5ecBg=01;aw9_rZ^g(6p5J_7ycnKfgGQi=38n2h|J?N7Q)Z=jvB7` zdVS*kY>V5jl)m!y?v#fr3d1Y)Tv{tXMebFlZW%0U{!jSYQz zApBb{Z?-Wka@aW0v+>L~ao^NQm5_bYg)0=hzU+)seVjW#rcxLavw zjuFyRJK4yc=tJ0C+hiM^XFW%UwdGPYf-{ioxHQPVv%QgL9m=Gus?zs7Tls4mus4@| zo^>%R*4Fv@LB3M<^jB$>6J45cD;?Fbiy=mZV4e<%{?@t5Ym+Pc>oFCY&EmHw+Z`%_ zZIy%gZScdeEyb;8(^TuVH)GEgm;8f#?0cLo6HLgp!b^%aWUsOS0VmWAa@$ZuSX*T5 zE|n%XzzT8b$J#!nU|q_#lA>99WZr!tmF!8++dl|Kl@2G|(-lJX)=kb%{6294YR)5G zC)s{7P0ZEJB$EWfwsTF-6*VX98zmAZT+n%o{W!oR#n zL4MKCuG3rtZ*=9V}`6Z5!XN{&IZ0ES3dhzk7;mox6HVU!SHZ zzfY?6W54|oe{8J#W%Erj+nJh7Z9}}Z^F&a-m2`W3g3y?Scre}b(xMQ8-Vy#S?!yUd z{c_*7XikFBk-bj3&J;BSN0GQoefpN~Ona>TO%6Y6|6?H)r0-H!n<&Qa%PpxfdV1=p zBRo?DEP-a>F?~nrw~53J%#x>S4{9yuY;`7Uwy_pvT;o`uTM|8hW85FY1z`y1QUog7#7KEn&OdH-etE0hyPyHL#Ef$fT% zqh)9sycW%j`g_Eos@88zv1*;jdtMt}%&aKz)NQ4#aR&Wz5IV@219)l8 z+NmM(I4aEOyS3PA`#c})YmP9E{RY>3h%V=e;E(BxU#2|(Q=eewD?|D;v1gB(Sh-U+ z;?1!%wqZbkw`g__MXx-&z5=}wxtMaenGL0F`AmGQH{BdR(OQpQ*X4Bq{rIz$j|JzTs<_!XEueX{nrhyiu7-u{z&e&EfRI8hOUF)yE(eX%sBioR2n z(0%duyuyp&k)EwSB1F2M5SJk+*H#ivPyLuk!`5%}6K{=@h}69dGt#U>OtDgez1p~n zKu#7|WNXzi^EDu&q*92NVL+O7n+aCRJFnF|bW|y8XURyt+r8-kXEAKWQ(~ zK||ehbt(0en#^>v35La$D%)7bDPs{d6*fEL_Bjq7?C?Ss%UL{*z2|T| zbOqxO@8i0FV#3O^7so4={rBSAptZGQ{~)xgHD28n4!NFie7+`N_ENb~)jEB1DOAgD z@uvd!m24ms>q>9EKUz3P4DA2py0kFOQA%&)RlSk582mO@87Sk$@2Pc)Uhjz{=Dlfk~`d{0$R zVBU7`J_9SFFKHa4VCr3$AD$ZKlqQxsxKw3=gRe$l2OA|prr1F{dNZS&ERZ`(>@X6H$ZOC@&%FC{5$%S9grpt z)6St|SqMLvy0&1&vJqcw9lmTP9342YQ z-TtT0rahKc`PA-_Q0!*OG|e_g_-hQHKRh5&T??HiAa@21tVfYJEGxZPCn&Uq59LV= zoGYZ#br7Z!2Q%!z_mf+)Ae9ao2bN5>m{)HOp;#l65#SPNC}-6{^?Ho9ie5imZ3J?p zav?)<&Vs6Oe(rXdb7PJME)$*%Jn^QK)|n?Hn3fE~WESjiH7_B>FpSC=iShcd1Y}p6 zB}qPw=*-mFDr)$4%qapYG4sEBG{V!sc9J+e`%NM-XwdPD1lDJKebw&A33Exd1vOc| zCbloKQVTp#U@FB75bQ6n9p$g5Hv?TRw9~dcOxA&tg-1d8BPP24u^)Xwb{Hr@Y>m1g_pkoOBSaxc}mE zRRb4IBWNu(U+w;yqG@*x+5Zn1FRNrB1W=$zD4!=-Y{nV>~yW6=4E(jPy|?& z8}yCBS^E{(ivjo;M$!<0jTrT0k}co>f3!7hx*G(~UWumFSso=(@l>3@YMlK+KSt4JK8Ev_kgpJ8|Es(ctg;@6*Q zz>ZA-1d>V2RP0G=2w)6AIpcI)Qx38UL9`|DME>d7hJYFa9@ac>C9Fi%RsgJU(5WtqWb!Z{BO`94wq5ngTDY<-hzk|o8ymIr1c=D z%P`@8lm==lk?fx6D^X*xP-4xiJ1B-~SK%nBdVfs|L|ulfd%c#WS|>;*xYHQQX$X9w z4+gB^F!pGpI*jahyiFcczaV1vT!|XMK|cQ4}tsY zabbBbcl)3L<<#wsaRNb74QRJGy7Mk#>M{W3J3T~=#g`2KD@&5k&Bf2SBu#yxe+>4T z!xl)`2i`Gn|HdW+;EXzzW1)0O#qpFo=4dp`ukr-H5f&(oH>k|?xztt9bN8x;G#=st zbHLv#Zj;K9>)+}zb=3bY&2>|q)&5($C-!O3|Mz$}W&O+lX}37|qbsD`mGX?f01gF0 zLNE%S{#&^d>s~l-rh(%>>hVwXDa`RBV({|@B1HcB<&ZCUd1Gc5D?hLpv7JreAy$2N zBvE1nK)g|LQ;@}3&skajtOhfB`>&X3O=AQPb(tNoWy5>k|8<1mTSurS{S5%<%>E@Q z-z^vvd6>tGHcM1tA^-{M@Cq0jV|BcQec%G)+reaD0P5m?N2Gx(I8>4-N6su$E8YNa zyo`kyav=AMxY5juo&!#SnyxAH>FBrp|N6n*z1IJGFV4t>heE`zD~2!Wf6?c41OonH zzwn2jTP&QkT_N(7j-M3^$;;an}zOU|hxJr0hAn;++2k}6} zku?%yT>l?GP%RKi$0h{GCbhi6M=wkyF$skEC$i9J19|+vT4+U8MveJm)jIG3eo)>< zt6}{6_97mY7$#De-a9-4!RYRiz^%DHL5MJ`i%??STVSw=gMbn7l`;V$NAV?2=KtXb z-M4;FCz5ysM5>Vv8-Z^#ENNA@E=bZxSp#C)fBFyd@&RwPMdx^(RIRuMO*olI>6i7o zttswM?@=6qB+w0GNWvx-W>dGpsx-yoFnoum@%xDE6<8ShGGgV;WjJdU39zcti{ZGl zPYu$f_fqIKbp9_34a{mRTy!EM+Q1d@bU$9ABt#raIm65DDF*`|AYMwPOlp$qf<00afSRsH0UKBX?WzgDCunCiH@bw>=ub7+ zqd=$4+W%()Br#jL$sp~veAF@HkS+A-5##})UF*2TDBv5yFEs({wK*INOOE4I+}U(z zEjLu4Vb;>dzng}*HnsNqe}TSz^7kFkX)q0Z;82jFDOiS@XlFN0Fs1f!U#zdgS^zWW z z8vp--kN?R$y77AJHjV0T<9lAy_9}Er%O2l+fB5D6pG*O#KAsLpH2!f6ue4iys6p;K zk8@KSO8mmH}A)m+X`D_hFlYFUMR3Z_zJvb6Z@+Ijp)AQqz-INC_lLWHYygHn{#T zZNrXN1LjmbVk@%J?y?GdRhgz6_b*a1#by7K*4>4py9CG=2IQDdm+Nb}XMv9xmR*FH zWb0?5nJbppawm#Fm%MQN^r7;#k=wf8BL#w$`1PL&5?(mLhX*@<=0TiIKxXLw%&7bq z$cD*)N35qQU;-1EegESTRF$c&xJ5s*^5TP^HWjCiYXG^GyksxSIt5|Scb}fX+i4*n z6~#6ffkfp!X6Rwv`5Pdp_l^fDF@h<%H62<&rd09%#0A7Kaz+{*Ba)~=iCLY;v_HQX zu1UnwbQfA{%FtMI|C@eb1J-;FJOII3UQS4uCipj#NkVl3P(@uzg@dZ2-%9mo)mq{3 z0D;~R>y}d2fCS`GpT%t))vw`s3@%XtObEJv!-Jujz~u*JMTb71 z=N;*Hm&Dy=-~z1LSi8mY|1fnikU^|h+T)ioY$NM&j{cqx# zuCPjbc5Nmw^f(-}aK!Zf1jxaUJA;7Pn(+*7L(Q9oZQisD&IqRW5r0wHw7nEe^Z5k+ z7EO(5X45MNduzk?((4m{$vs`&pL$Hcs7W|kK23@(TZ} z=!o3Ry|K(UbX-MlCQPjK3_>?mu6xo(T?h?ge<`9$FZ7cZ zPfX>GDo=hX;^zzoP{ddV%n^!>(qG`?FC2J@KBLwFjM%$QVn$!NJn9E9T zEHQudm39O>nt2q*X~av?{sVL62Bx><(L3f!D#5JUkldG_Mfv?JaPQHMJZT}pbSf4E zU6ErZlBdaEiDa5%0)64=rq<3D*k)hSc8n7j8lMijth5L)6h6(%}dF#}`-SHYY)o0KFAIo)o7_DfkoKFw30AmqdooO-nS{O#+l(or{v^d8Cfa)d?KB$#;81 z@)oP(T?y?fK(4&Rb>-}H4Ft+JNa+k3nPw;QGa9y&6K5NLovA9CL&n?96t0EkyRYG1 z3$A1v*_LZVdG_~HH&@Ydj zZZg4hwo2z1*;%m{gnPX>`1VTE*W5Zs-jt{Hw78}u|Cv%>Eyw55bRr=e(X`D_6}V#1 zO*+Br&-QvYB>^jpzT*TrlbcE_sW1{ndZ>zW>$=r@jJyV16!_uSymbXp1);D3*N?VMDtU?w^Lk#(!9C>Qw@)=KQ zQC`%^;HPAK>avAAIZHZ%OL^jq5h9QAnrxpM^JbgptAKqg&Jk|{;330?JlBJlG2K|g zTEZ$HDKkv=dF_)7UUE z@d@~1Y0pbH@vmY?oyH9x9zvpnxku&s=Wp(@sS7M_J|02ZKmP%T9(;UXK$z1s;^$wl zo8yA3m4D@OS{Qk_+QQPw8aYMPH5dHlTj6|XahQaZrk{h(r56kSjj~W@!*@+b8 z-eZh<(;6sIBalHS3E|3~H-{k)QhYO*C^SHq4 z)GHBgo4VThgD*&i;~04>ITE2YMQd6FWgg|+^cM2V4G zZ@rE1cQZUs=z4)H6H`nQalIa$t=)^btOWI22}Q#Mql1(}_=a59m#AqVz)>vw205ITl#Qx2 zfZ|D~mi>k9D_O}*y{IAos;kpp`s3%zt3(!C4IaYhEeodidNBJ?8%L$_z}AP=7D0__ z^Wtam`J5Y^kED)R+l!-6*;tCXs;iuEc*J$Jgnr=9CvT`NQS3(mp|SyY&nNf8aOm%f zmNI?9y=qYm+wm7yXm~qHYl)p>^|g4?jh8FWp={i zszhvC8Qq!O@X?GNTy;!s*?Eg75Ezu#dFIwNi`gfYHm5kd1`g{WC6>0M07BFdvIpb7 zQe3D%m%#PBP2CHnL84Xa6Jt5HhOL1C zK}i)p54 z(uT@hL8WHMZ&iXY#)tQnSd_UwxIh0+ap4>%>IQA7obaf<6G-b3TAp5k4R7%W@geLk z+bTCV|B2lE|F^8xu1gk$atO_RZoK~P>w7jLZ4rOF39^|uI`ZG?GGKoS-I1vLMAu%| zXBt<29o3tr^NNWQU$zXI7!6lAFP8?=;?ESB_L|x>)yr~QDneN7jYFtX}2o^-6alu><5aE%p6_dqOwrf1~9waZnUCDx5&n zMiZ2dRlcsa&PIG@eiC=9ENu)|!28^M#tF@qSBfC1*Q!Li4No!uAHu#mAgZY8TM;R# z1y)*0LK^87SwQL7rMpAAV?hLAX%Ufbsij1^rIALur5i-LzY9Fy_df4m-+#M%=giER z`OTb}bMD>?m9U#3SGLrsiovojI(Wx#lq;L?9#q((T9fpXE_g}qu>`XSLtaZpPNg)I z_kF1dZehMzHe-}z$LAmo*~TP{mT{CsP!E6jpl}L{Q6Cm2xQvEr{hqOO>;H|bd7T7|%~N;smFf0MAFY`OWciIn__{j9MdajN}_JJaKxXv3?r z7EMNNW^h@GKH!EwdcoR6%%&`L-?-FK$LdbCJs4V8=u7ki{#Lv*W1V!C6aBF55ds}a@>Dm>&&gR^y8e5~2ARuTLV`)swW zMCz=Nvr3PRS?2riR-fYvrZn(sWr5TRhPqe$K;zSuvX&XQ*ldbsS-b;yA^^e40@k~0 zd&7XGtMtrX+>J|PQ2zh%ERrhvZ~4q}Zw<49&%_kcv7D!2U!71{M0-!HfC!qdd|Dy> z-@35U`vZzz0Aby0YoMiSX$=2(_TEsC=waz)w$5|ozZIXPTPlB)`;KdLsL~gR3BQi) zN_g|S<5boS{Ib!m8})cPO@hAFM&&st`ZM&#&$ESpU3V}FKdC%+VYaruPFPxdi0bVg ztw?!`I&LoJ^rmMO_Ta6mCiRLa*K+@HpI%uGvr9lT=A0(Nq2*J~tLsSRu=k+n&{=k8 zYEZyk8vj%H$8}%eJBq2G;rIi=(`ZI9;BBM0wZor|N(l{~SV|whCCQG{asOF6{M|bs zDxu@aT4bq^T&)O25&HAOr~o|>^yKq<4cf))g`x8=b^6T@>2?M8E8e4h7?1^R&tCD| ziZNxq!R>q~(~lvN17P--KsE(Y;;Y=xK$=~d-`O+&tMyASI^6ceIzC|S5z21qpRFAE z>dAU>zB=Lhxhn~W(i&@{~Mm_-RWa)c~ z3@Spp7;TudPxxD(zC~AdPo!2)>ujYs|8&?FgCI$2D3toi0#fnT^%4~@@fN))oKL=m zEs8}p;#*CRrV#SEX>#~&YJd6Fud0Uz_OenKx7QyKPgSq+ch?DJzUo$a%@vP}7K59@ zkcTNDH}o?Nm%TAbFkEWm`$eNi&s9_*QB@t6LgMuiDU+fgIVW5ff_k8LGf% zA+ymk_W9oi>~yupshV6Cf%O7mah13QOIrDE4xafnp6pBpm^g7X@q545n=KtO7svEq zCQM+FJ3iV=Z#qycNV}M#!vI`EeOgG=JU6RE$aR~Y|Lr+YI4p<%G?Ddx1s>6JupmnF z%CHEA&dan9o;25$Ot`8#68M)K&U@!Sp7XkO5r92EdYSLSfhDHXO^eQ*CO>uzeu0wu zzx4VCk`v^8n5n#C5&SSq(`zx`v{-ik6$SW;4pClp{}}xWyj*!ZU>ny+?BW`n_Mflo zxJLJhY5F>r!haWkRSwYSp7MWPY6dQq?HTNAN!Z;|mTt)ZqIgpcECyY+^G!db0kzJy zFEo7AKTQK#V*an8|HF09K#PtqNh}ep&^iIy#4)`mgm#U*G&ssw$s6C+<`NYZ2_o~_#akQ>vHn- zHc(fv;JXWYRkLy7w+TS@xELv`X#6z>ydAJG-2Zk>y9KXpS_Du+^^Q4H+tth`-YyKR zH+DDg*ckuDZ>Q}q%HVdQrwOKN@O(()_Pu@qG*G3zpa#A*)s=bmZJ+pPnmyu6i$A&TgM0yv-i`rHf>kz|3E_iKiM$aVj zrW~3(dymILC!OI(ap7ZeX79*!mxCoF@{kFCOnevQ-vC!iq);xlY&(mbNK4f|yn0+W zFSU(1T%y50e$w=LjU8!+%VxG(R843p6<9gwB9rlIpP7{%7sgu`%e|&oVSG&S@3_S0 z5ME&uItGstjLDy2Nvg?mr*Gf30dHyR>D(Auc&Kh1-+0eQT@w~5F}6RMS}gV_8yP7V$-gKJE-wn(K?w}dkFJsAMNpu zzna~Gw(vNo%^EDGxVhB@r~g^nFKFpSI?rmwrw3&xRl=_;uQnAmc79fsRnUtC06PWX z`H73RpLQs8udpsxd);}+BbsLsMHe=(gvj=y+n@JOc79|ROzMXi0u_$D8;pB&4n zord9_V!lLyo<_(^CGS6XDaIg|LYq)}yHXuZ~p9B zz@Gx|F-@+Qaa+4UJD*8<+&-_7r<+T$ zKmq&8A~u7(30?O(MYn@q$14Lk{YOOiizuTM@B$!}uu zU;Ywjq)0baQOC$VX+XP|AnBrRV zl(eFFSMjmUnDR$qK?n*1U*a&NQ>RU$B$_7Imf2Y`6!@HEt<3OGQ| zfF|OV6Y;VIvi6bNSY@=th}U^majVQo^u7Gizs)8QTUPe3IwWDpy*YJGjgeC0%B($u z^61E}`Gr1>I&iXl`7E7#zRVI%ydB(CK zJeicHVp9^n&YRO@9_6o=qNl|!j85RZGfT+^W4hvQ+;sv+XO+}5J=76_wj2R|`O2M5Jh$$vO7KAE;xkgq8Bap4Y;`aA zW{cbTKvq!a(w3}thcbFAcS{H+Y2_mS8a37K=mM!xR;mT>B{oohw=aZD#cGKb(gi0N z7WJF+e%a-z_u+jrv#!kdwB*rD+CpUbc^yY$T`@KVduo5eHY(UxTy_U%bWOtjq0?`@ z_d|Hjogc8=B9bQ*M6cLKhVj4`l^Iw~b`$Fi1RKs8I@+`ljZ~27K(-f+0bbQA^ zq3P`Wvf24AiYLtLL=KrRj`B;C)4XhB4yIK;&UdO@p}#H9DRySq6dETd0CYU$5Ll2D zUA7vL#GP6Kg)whOcNHUOYt>{tP+S9(0@ddunJ-tLxasHF`N1TkNcGfB#gu7CpzA7y zVKHIH74zLG4%n#+)p6~!1yjOuC{T|QQun#<8m-`9aZr@Ez~!?mPYz%qXYR00Kscj& zZ=SRsH&;=c#$xe|HA2d>*1BGA2>!53;UE3(S=$%tC?mZ^Eh^)dno6fLwRN(?H-MbP zPh$-KT{b)nwPjv)$izz1Q62s9T>8?xys_SZa_fu*YDAfmta)Qt-sshNUj5kCy!``K z+UpjwRD^-$RTpGSX2nw{CGT^AKjpqu?ZSD2D&=XJKsA+N+iHpTdh`+@@D~Mz2uZLH z-(Sz~jY`;VHh<3uws!~ZOX_8F=MSxNi9M?6Ne0ByClm6V25;)OQ;jla-q~}qsXc{n z$Eg4H`E?`4_(+(PR{yseN66ubTudBG!O|8=#08~*)5+hE_I*pEpzSX7VKt7%!;zjs z#tg-zT>W?E*~7!M6=dY+`&3e_$iG^IljO>6^~JS~<3(RmD_vP~`v_m~wZXm2Gf_mj z7s7AMg^_sO}= zI|hH`+3osVv{vfD@yu!_nqFrhh0p!S7DIEOUT ztVE-%c#F~I;-s{93Bmi;mg)L`l)odop5fa&2gl7f%eG%l-Ov}mvo9`biWUt)l-6Cy zqPjI9Ccac<>`J+N=n*%DNrC4=TJ6YP1^3E_EX4XxLvlyW#MW(^8%9(`{U$=0<7tvc zIU;$Cx07&U@YzO#gli|DUa3LE)yfV~^OPhZ>UUXgjY6IgBUUb-9TF!r>O@tvp^ zk<&ySe`;X%nb+p z5gT|q>$Ez2j{7~|sVDFjuO!qND|d-AWt9GcpKwqWJfzd~`>|*1JvYD2tejrLRLTxK zSIzf3`p;UlgD4B4ARV1(PssH?9==cz0-sXrP_LPm>?US1dVSO9FW{NkrW?K`|5s-%MQke^^38^fMSongzU zD1K~2uujD{u=!V1)E>A{w!+xf(5){=O8&2433ii(9%@rRfu7KlBvpOJP9=dT@)2xQ z$wD1TgyAv2@7ytv2FhzG!yDk2eveg5TVG4!pT^dUKR|MSa}5t3DbgM zr!g=p^FjyMmxu-+P)fbelI;$w2NZeC(JzSUww=#X1NJ zR{WLlF$F)Agq^)tCM3+W{>1Oza?L5gpo0SQ^81VD zEG$e=xk7~1`-4q~xZYZxb~26k>mkat?hFhlEVB12er!nuc+D~u*1j$9MOH6>{``{A zpRQ-j6Y0Y#>ARe#J@NZsiOc_>lp^n+_h+dF`&WM{@~i~~!!F;c_WC1h^|eOU@QVAK z(~*a=QBi9og^=)9Fhfr~&u6)B(wV*V%w3BfG)Fyxu|480*aG>)5$1VSFvZlbsy%=8 z*ai(a3kOQ>ErMc=FHpn`3t$f zod0a0;1n<|e=mST!`DjTQb8611jjOw6&QXcswxJ*ws4DO>a>A7t=F6L^S?shZHa0A z`coHXAx8H{zHO91LnY}1>qh`%OWjX#3HZMt+SSd68UF-@L(va0$`-L_pX5)Z0^RZG zJZbb6yfliA2-t|_SJY)WpaEVsZ~GxG z3%>-wNnv0hVyr|cZVsvRs__o*uZjO8bzTM^NbIb$z$}?9oR%1EK*{iixCS>;_ zh<6I3%aSg8=lr?_c6J{)Lnht$P?3CM>{hFjG)w;uUAD$Grl;`pn1_d^>$%iBhBdzO zOxsn^DZ{p0RSq=iNyiTk`M3+q>69xxOh5;Yna~t0W^3OvN{q)Fl*F-olJn(N(n1k< zJOz=T9dCNfdIwo|Y@O1v=BkJg!bNfkO9x#iqHxW0EgK(nmY{)O|Ov+@qbB0{reSxgn49jCGWLt<7pk*fxV=0Tq2(7rx%PUu*Y^pFB_uV zelQvn`7@{0f9xwWF~er>p3{Sx*~8kBvmP1=vp^g47R`=j=}a6{zDnkgB&-XJfH0FN z@dUuF% zd9x_}kpx`yec(Pb>{wR1+rS)ceg9n)7fR2=VqI)cYm(Omq;*l}^=m&a(pE8`>($oG z_~f~cz3uo86WZ+c7**VfqB-G}otyqbHwsT-h>v=;;scy5uy~0f!{5k7;Xa@R&J9Xq z5O-2;t_fTt8F;wHG*ahL^q1na_El@b0H$ukA9#T4_^traLtyx&z+W%vn^&EmR0W)# zpGHgK*2z+tTMDyW)arFqhb}r!Y-?6$(Ha?4<-QDt8kzmtYJ1XywkdiN<*3K9Ie5u^ z#9tYKiIb36Rz7LrW3V(`A}Kjm#bVPDw_!DtF!#d+!4|q+85o&DE`8Mrk>oZD7 z4X1-&9c*V-RY~>;adlt}wiHFXGRlxolYP`dU8XY@1U(92(jdU#W9d?83w#DX3{(X} zrXB=W)~srDtmJ-v!@@uk_EJXkmKGOO7Q$qJbx(U8ad>IsLI+yf8x+z{c~^ca)IxT~ z>h+`4IJ)=Y8Nx#vLPqPQihH}y781Ycr~1TuQfs+?Yp|c~vN`@xnt*ib#!$D5&P=ISs(UY{J^#K^3U#Q%lZ5!H0k6Epm64K4Xl|vgh?+1l>T7`GLu}+ zD<)=Nj$mIOJXg@SEzD<-5g9At`@s_f5Yt|b6zvlu1Y(Kr<_D=Eym3kq;CiK-!@_L1 zC{4F+?-^+D+>U3;0?2T5i;%@8-OdoEWgOHb@G`@q=Az(u9ewnof@|<9B9wPZ{!3d! zo2JPI${FTsG1~f&u38>dB0Q8kmG`%roH4nTBukm=BrmLI6qhb>JUdd3C(L;KUJST( z$v|R{Y9L~?V`dNU$VuzlO=V2`=;)vxPQA>rz=NA+niQ}^3``>gP0aArZt5zxZtvx zaH&8R5S9xO;=De4*H-6r8E5p_oc2E{HG(j(`MkovRI+=E(fQ5LTY|^VWSH zd=WsgD_ol?augvQeee&X8L-Wf*cr#T0&OB3?atz~03W@7ZEnlhlD|91w9ww%3QHac zaW0O5P`KWQ;9%E6XiO{4v4bUS?m3AO<1#5aV8CLI8q4P(J?95^VOlMVtC2|2A7?%~ zS2`fD!iec0yy{RD@|SK=0*88{keVN)(Y4U>Yaui2_hvHu)50VN&+@^L@47(m!Zo$= zbC48?KQhMegx3vs2XO2ri&J&@atN=b>+YOuwPS;R{GE~56A}B6!jcDo=Br;}^JY%f zXZpB1J+mg*QM3zVcQz29eTqMnL4yBI{ZkTRcG+R6YhmsaqZjXG+|YjB^ILGV; zuEp-{O!m1|k0F@+wP0~!l5ycSiBZI@zsMEZXlc>n?!jLAm7*9&P*<_mTIO*tryb>I z)LUC$L3o}UQ_ulNX&c;(!97a2RSgt1>v^6*_N#C1ficjRRh|pgs&v0M(BOcq62(a~ zAr(0Kj)A*3BhTcA$@{BfN8y=!y17DNR0c0 zAnsJnzU)BXwP1%U%V}5pA2%}9Sd!8*TihedF@T~NRdD9PzqX9|J>J&`aws#Ag2`{& z1Zc0v?&VNW2X86ij(?e({W^?J9$WV@h^SyO;5I_3K{g@r(A#v6Nq9k?5g?@Hmpclm z%_KNOha|iaqOc_zYAFOcP^>z%hIstVP=uhs04E(SJCt=ToDVq`hLYG|pI}$rg)kfK zB0gv`^x+-2;^lGIK$;TOLv~4S937WCcj0*whzME^VS98Rcs???RVfs9yrUuQPvm*E z$0EPqu^FY!q=tQEk-Z0U{9D|(G>Tnan&7eW0c?{Fw7cjm*mYOcQEJ;4xrYQYx^;&k zxK1(cPf+_o_zvFkEv^I%rffMFjGbTrmO1%%(3MKCQYCQRuUZu+_~CaEOu0LP{F4pQ z&BM4wXHHolg`KFNuIs-x`m`cG-+C6ATkNfzo7-Gc&?3QTcTQc9z^zK4uv6p`l2f7&_&pzySbAn;l>5Kwb*nK&TCBAVPEP--Xc`k=`y(|7~!mVA6vf5 z4x?QQsb+4LWxG3^UL~I`C~iU8xt!@5g6KxMk90sI5y6>u5+R z6ZZjbvb1QrTY_La%Ip+s+TRcFbtSA>H**>ap|T!2c3-}miyfoJV{vL@P11Wsu9q{X zyQE~I_so4OyB$)$+%d86tK+@q0fpS==a!j~D{A5hMq)O3_F68dfKro0iid#t$Rr>X zAkT(-BVRh{9<%z^6_0!+;n^Q)Sbx+rnMi zXZ7sxzomH#c}uJQ5;&nx5^7n_-1sGhK5YHHvHh9JAh+krEf-rQ#n}`Dy3l=|OkB?7 z=#nak37boF{fXfOtO2n#>twV~3HFo30gCvfu_?JBuduxCef~Is^2=6qG8cE?p>Dif zj_HnTDdB6E6Z7X66VmhuCT@8AwO(^?@tzOTGVfo5Sl0x2_QebHMjiJZLwJA=zed=G zKN<2v8$R70i*U=k85t_wWybMxM_wN2&K7TPmkDznVIYjeH#zo>}Mv5rYGnl`33z!T_v6!=a z^$+I<-z;-D?c^gfn8OA%I?59l_}cOxU!NDrE2`9Z@#4VzToX(WwcoY(N(~!yOJ2>M zw}^HdNRA!}$3#4i+Cfyt%v;xySAxOl=r(!CYL`TnOfQIPudYjLH>59DPh&{Po(2cj z-g#;0vSHueOZcel=G)HjIU-{tfCs9#cajAX8Hg0vnp4oJwfpWd!L2Mgn%?Ev5n!v{ zE8_UNu~&O?FE}Kn8O8&BJgQ^5ENChtLaHh#u$OHay}}rb#@vIROR2%-wfMP3ZK89fR4)Fenp9rm<_JC@j!nRrOq)$54eBtG|+vmOV;XGKk3w?|t~ax`Js zJKR&J^&MhPjXX>^&Iv;%_yZZzZFkP19=n3hZN!d+dBA6lIagy?8RpXU(Bz#Eshqev z#AEFZSI)S7asH&Nb>5W6R{DY_nYAP<6%~CZm7OCDvmo49BzvVpTCcYZHMG&a)hx(iP0%Rr zXLjYrZj8HFMQdm~p=7_suwc<2`AAzsWfIrt`GD+$x3|a=~SF zUj=jCMWji@%F|CteCV#-4OLX;nk&)sFoOMsAWPU)v!jr|qE^WmFD5`V<>Gz{FatN_ zxiXAq9#7g3xDEKEvMHxn;`wN1lM3Dg7_pNQ-<)mb++(-S*)-;5myv{tR}I)uUL;pD z28*#w@3-372qD%zIRPH%Xew`a9wAvOQ5hq;^pM>mHq;u%lwFw%=b262YjnF!p7)AizDYD zFae|w(G=$!j@t+mz$ScO!}K=%LP;y^XkO5wI6F%J9J zi&Ena0ld8Rsd37>j_#IkI$7vz;zV%3psJEO--Z&aJZ)LW_0~cBsE|gaIrJjxFr`gD z&AYfy$;L8I8?yiBwGmAX^ZC+lDk7;zI5fzDs=C7>?^}j7Uwb2s5lt#F3Q6>STu0_A zuhK%inv&$GeCVDV-jfZ{7x=teOS} z^4$qKg^8MSlB2A^Q;G1NB=|P5I#+)c-VFN@;2cKI&w~T|6BRCCbws-C{J^7Qfi!ZB z$8~*!yF`91mK?t7(eW^1jSEz^K^C54qnx!%UC*xX?jcG5k{dtcs_i#;>S&qQlKbiJ zd7S%Ei7MV7f+H!3$Jfmv;_ENIDgP@-L%afeeQ~0HD<6}}bR5l?iIt+}nf<(W@cNSS z%G4Q$<6a~+fab4tkgLh?*z&kdKgN?^1J2v~SrD=#=I*nvns>nxI;C~r5 zgj`k1dGUVdkp-vb!9gV-`$P0!j7Lc>@9e!m-!-72nifWHc=m0ajCYK8oI~eFD*a$J z3&Y~h4|cBrxm?}JX|Vj5KSX;+pMKxApW%F3K@gI}C;0h@FuG%wrAQ@(W%EK#od_?? zOm2)4Ad{ls&yiDv_k8NetfO=Pp-=VO$s!*iNUvyR{ea4kitsl_i?`kZO)@qc zve-}cQkP}Nf+cUyJZLJ5arqb`@k^Xn-i*N{$=u=PWG*vLn;LpC9Csx2=jhbRr#AAJ zPJJ_3>PM*e?cB#qDLKBaJW~YKT?_1yr44F*vr1yoy1@d@c7~A0a62xf3f)jnjm!@_ zqTkg`nRBX@-Iww}cFBdl9eVnVG0Q^D zaX>VwYfA&AM7vNXV@L>yMI2@Z&mX&v?&6TM zDvmo^#w4GFQ+%W?iZ&RY=k~pNz53IqT#kN`88o_e-wSYR^yBW%@M^o*Cqf^JaP@!v z3{kzTtpINC1;Qi`M@dLw|=0;toJW&}7IRV~Xcbq6wHIsQ(q>ncYQ+5DUGIHvA#?*P83m;@~&Ksi_$pU+3ic^$48Lv-z`(R~RwQ5SoxSYFhpB+YZoqcyop}!sB;U zgyq|`&e9oD1rB?`f6s-o&UT+9JUWPOqAf7*|^E% ze+~6cUww9st{e3ARe)U=T}UsTu^IeM=M@ahr#Kd8p>0AgUx|)*Y%X6=Qf~<o zJo*RP#{peKOaX5LzDxQAFOIq3NvESCcbl3Zj^$A$n0;R}!0;AP3!D*T9ENlt1Kv8m zrEUDYONSMGfvxG->~Z;;;160ayxzrrHVm=odSBVf)1PR4UKVqax*A&u-IuBYD)pK7 zHA*5Nx{%W!T=!L}#R=Qe!*{3lNQ#kM;Odp}`mrP#e; zhL**oy5Nl&1(iRmwB(!Uem@)x;iQ6pfF#Fnu)G|*S7^xm^_RJr^O2P#*wAd%7c)6c5$Pkl+w@?cO90T;L!NQSYGJW{yJWToKY&tn0?9Dj92cZyU-UnFugPb zjguS_uB##AKFtXkfi>7~<=DzF?kc zle`JOg3KV~_s=Jzk&&K@ku7QgH=!AdD)Ew%;2N?SDoF6f$6Y*T6rjpBco+fk`Gr+% zFB**1v(N)_D2Sy*7!#$dtFjF$d-ni4P%>p%@)OjljtD+iC`WL(cNz{RweSkYb!Sk_m%U&lwXe>K^Lc6X$2-&pj5#LS! zMME}o>0CNftB4}=I2(%$*-~Q8l}+fFx!dcu=)lLXQmkNy1DiAvRoHM#MzD~-z={rA z)g({P*lhV(nBz1eojTcjQ@gHTn|1oH`RVxTATt?q^RsL%A7c)Mbsll1aMnSiv-Jd5 zr{a0^N15=Iw2uXm4jnn?!@pBA^;vS!n77q_%pUKNCT`k~n}V`=)EALrus#n^eY!Cc)`Z()HymhgvnyqY`1 z(oqGMW3J^s&N$Esm=Pq7I|ayL1bVK1MH&7;O`}T~!sH+Tk)PAj{nC`CR3MY~WtUlPOicLq8Z zTlJ?i(6CKtSY~Mb(_PFZySnAj$>s$pjX@R}E-XZ5m+S~#n``S~n{b`AcfQ?8`Uw_H ziE)m>G>H*vG#8I&xCcrU-9VdEkN$MNn}Ve<-%m9GjPRH z6~kgracbtdG2s0$WxKd!%}ibpT-_AhDWox~{8)pNpwJ>DjmWqE^p~pCu`4(HpEMqq zbG@V_q-6lTv>kb8Y~ofNFr69 zDW)s;ub{QOL<(G+c*rI7C0%b*=wI7_Wn3t;i{eV`XQnreNx^QPw0@B)f1G97=nP#~ z5bgq%Q_Z~b=2iAjbEf6XOb|F9lw>8{8vGmHYJ*aOvME34tDH-@%<5J0*VVscG#Ddo zmhGtJkV6L#%gwTSZb2)Ah55*o!MavP(O}3o*Zs#ec(D2jUFIp4eZ$lnwQt_)B3k@F zWyq$&;bX52&l{6oPS&T@vd6TlIEijUlD&5J9+#Z?rC9a>j`rJ$F$-h9t#~T^QgZza zvS$jX`sQfxx&fO@_*6VR#a)+ZoGfURiI0dyK}tdjAB^AL-HU6?F%i-6q4XpOY!Xpg zWl3aA>>a^YT3UAOCJE(nBlI38@qTw=7CCeA@9NmS?ZoK$fH+&bHn480$jg+jt2Q>wb6z} zQai0jTAt<{vxaFkV3mB!+2gK`doOh&6Cd#7>q~c+{ZWC?gME)@iZ1q9jO+u3eC+GZ zTi8DIp?W`X2egyc?94fXx1H7~W^|l5u#6{qEw8MN__T-%EAjPSf4P1n{*S3?JcrKD|q_`|5pD!-y)Y@gU=zB>xY zpu9T#IBsjM6#lZsF10F_ebIIlbw${|&MqDM!$ET$HA4XB<7SmFIS7JCE9Oa5|#HO$dC1r5(utKo?jFC~^( zc~N1u6F{Gh?lyWHz@!m}F~r=Bli3~;h~a){opFlF{aCcstAJKn+AkZU8{OE->2+H$ zyW{GIoI5p211i29ifh`#c)6Rd(M6MKnbIbjjXz{D@gt`(CM6XQopv12TPNl;#z+llTOCJQoe1NhYUzIl+i| ztc7*)h3aN->>wIRLymEwOF0AE;)LuNa^1m4Xo8X72mHk?0g8yAF5oVD{%1Be6KmAl!-S32DW7pn zn59191i}d<>QPE7#O`LYwex*Id?HFH*uARMV)Im%^u2uBnFqQYJ|IwnLUT$@d}@i< zyJ&M^3VuUanI9C)YsWISX;4|#13Oc?grDF&i$>pkiau0f$9OeTEO*SNC1*ncJ6s&&odbu)99F`Xh&l&q0L!#iJW&p7%K zYmskepQ-e+1_M9-7?3Sx8`xM0%-hmasR~9<;%F>McZ7aqw6NXN(J@SBe z#YTIqDMoLS4l0|z3eu5H&mOgTyY_JmKnH(I!KzJ#ooAV!Fkb(jlbYu#`M4pT9p0hB z@1$1|%f7u6DB!-C`c=3*fRqTPvXqBMT0Hrbr@Xr*giYhwn5u4FQk+ukm;iIvO3qFn zzD1kK$x0&mv8K8qdRUe@QN2mQGhix&2J+#8bkK2a1Vkld;MnIujsdN{{U8T|-Cc z{=`Vb3o}fo?1|>Zyg>bYZ?(^#gf%H(!pyD=+u;s4yQXffxMTS+e=?aB@4Zlfb|hMS z`Q_%o0ixbwN2XnI-3s_m0Ge86D{mxOSY9u0GN|6<15;s@mv-6CV;t4-!urCO5pW4? z2vsbxFhi4J?@twl^KZr9JafOcW7M#$qWy{|7kNGKOJ!#>yLeB_jEnzGN8~TA!?l2+ zG-qf;c)ktdqiTK^u23zIOvKqfRiT;?owi};^9LqrB!~SJAHB(KGSszt z>$e#RX+upQZV#7OBFTJ?{Mnp7!Jazz_mF5QwhHV&n`4PQ7roB0m2xd$HE+4%^lAv& z--U&{3wDbghqA5U*)z7m!}D2;#V1=jRVs7UAsIp4i^Xg4n1&nk+M9cUzxKimfC{!OIOPe7>6 z8|=;aG*9Ll?cKN|GFdY_4W30`F`PXyfD6ob7sj##2%b6WMPw~1KU>)$ofKz%g@0tj z&%f5#W!%rArLmN!!W0*F7=C$fOdVw^Vfw_zPJLp}821eyPb68uKSH0xG6r-^e7hj=5Kck24F zJu@R&pF31cp|s11^afe=LS61;9bzF0Mh2cnCBh=+T|qNQl&(+lxgX~*L&~_ObC~!T$zg>@ zDnup7(h3RF+2YlTia&axv}tmg#A6GanK!4TSLjlXX%g^|ndVHU-Cxzgj~4uW2XVN& z^4G) zy8Op4&hi<~dlHBIkJlIBtmgLHhS6~o0oyY8dVH4W#lrM`8{U_{iwr=0Wt{kBN~arJ z#@NGKrS`R>OqrgFk7;lE?u)T3UtS~su)_FmjxF$@U zxU!xT!OYnfUic@@ZZ_C5wc-7`8w-tb&x`=~_cxO+1p<)aZK++u{X&1s)Ufx6HeB_m z+lEEG0QJX@mWg3N!h1GE*vI_@Uyy)1G3$GPE1TNBO97Sq0rrCiZny7P3ZXm&V*eDX zzBcnjt#JkDj8ACXP;q4}l=U#E9y2Vwos>id6c(4N#$ z8>d$BG0t`wex2Oy7p$&Y)+cI5~tk&zQQ1~EblnP%{sTz8G&7Kgq* zR6Zw@t>^mIv0cwjE6eL*2$|#mdIIZ^tlovnl4qYZ#ZaDIff>?w+|qn=d*3aa*?uB8I5@!HloV zL!H71nN#_b-_Hwa1nx{!ok~|$0R^Mu>&JHsJ|_6dGsSlM6mK2gB1ZXk_i7k!H=|;n zAyCp)31qauXDKenYG|!p5(4bu!~o|`MkvPpwZ+%VDARS;9}5%Jq=^4`FEXRA5HdnJ z?+O#7a{=Al2!dPq3)W~q@7r<(%S;5X0-P zqG-{65j`g8G*#1FW&IE2hOvSD#RD?bwMUK?TXWx>sDXa`wkD*0ovKt$tnkdTzeRMy zYK~8*KX()Cd(+9MW9W8U2A}E6mtXkDtHlEaVt>T5wXi40;|IbCjoNu`Zl`wBWg(%O z-nLZ=I)!2q-RPP2t51%}sr6y>w`K}>BakxSb5`tM!y}WYZoMm}^OMcBz3)Z&eC26H z?UW$Zn3U2A_oI1!&bqq0`bxrwH}gXci#_73&@1oj(v*=-fNW?N*D8W7zp`86>=i2t z7jd9FFD;}1sE!Xflc})X(SvNN%Ef)RW?IiXn8|~2a+CA?;~6j_wMR<$8`bu%H|k2@ zhSfu9zMj=4{u!r5&PoMA;dI#iB!R>TW-w3{FV1Yn1?T>BkXmTtqA~fav!<_(Ln=eU z{;+M2+6heeA9s%>ry3sA6l1)^U5UAOiB7VzW6dNF;L9qQWJiY2zd$SofjemIilznt z&_E>(KG??uf4GNKHE@fb?^gY%|E3L?z-$%$u<&D{!O7puO+yv+R_@<_n+R+b$JO)C z_qF|nQT55>_bkK~ay|X1GEoYKLmK=qA6(M#*4M%Kg!Z0@)To-3Qx`5!`nuJ&Qf6(G z<@pjuYlAP}P%36%Yt)_RT+vAS=^JAN%L!Jk&)lZRaFuVx+0n9UqqZF*?~3|f;1$Sz zBzFARRh_PBwmmOg+oK%=7y4T>H4Ihex9>>mae*P&RWzd^(ZRNHmtcuX!XOqLV{rtR z&~0U^lcH?&(_wty)8h+?rSs075xg!fyftWvkQpfVhuGo!}4e9j3a)GL^+3a zpe1Jp_K4DVOBZBHVN~5rjfEP^KM+U#ACLJQ%eUSIp(#Z-qtgEkKV$m|-P`c% z5=f3x$^*I!6+6e*?G10Ayt^jRN)L*VJX^*D%R3OQpsAexa59z?C^cS!OvliMQUeB! zsI3;FrAt07e14}Qgpq_DJ4iUnaj`3C%l70)-mQkZ`DrH%v8bhG7P>4VADQg^%Ca4mxJ4Sh1)8s;A*@`qod?5^=T(? zp~HUyJJaDVT7bl}II<~mO6i2R6{piBU@G8wo2_CURm63IHQgB*p)PfNGwP6oa_cUE zFG{J(&9|1puQRGvNmG1TH|||%i#o=t-1@@!oa0qACUNJb*)s!~XO! z!|Vf|Nj&MII=+gT? zOnr4+RA11yN=r*Of(p{jA|+BPvS*m`)^1Ue*JO?CK^317iXs!vzlu!T)DZtJjS z$9SvDgJ$3*UL@r&4olT2d8Wiis3V~6ek3im&P_{Kyu=Gt`I zv}F(R9bc=Nf{~kUP&amDNud0=5!bW#Vb-=nhWgHC!p1|*e8=)6<50Akkq5~ewq?hv zH%+g6wf~Fny7p=GqkO}MGm4LDNEHEzdSPh4$KkplaUV$>RkTl$C6`g4pyb9kc^GyY zfZAn&jUt^UzlBBn&s30&hxZ*n`8Nr(q9;n%NNWRRbG{i+gWdNNiO%BQX2zFKY#L4@Kiy#Vmfl{v<_9I9Z-FqciOxwA z-h2Tajr2FIVAmkFg;S{}%!kOYe%-{`H6{JeD?i?xMXDE%QE%?1Spfex7611YL(V|C zD~%E0<||46I3$ZcIMG?1ZHwBN4$bz+vp5l04S zCcSX>`Gc$b`GSjsj+_ebFF6O^xr=Hq<*ECHTdS?!XCop``>fFbO|M@Y1QEyRl6wWc+u%CZp4xYu<)GuIMF5XkO|hGlMu4`&*agmCH(b)-)=2G`raP3{EO zH=cZ#WaSC7bd~6%3_tGU;f??RgmbgEQ*jh+PUfj+X~!;d$t8{)w)E9iO|08G?lJ_g zORQFZQrIza>&Pv!pMJl#9`wd-AKj(1-tkl)kyzH0U&CC-toTb7JG_>;bM1O+Yhw4ywTlm7w9Q#K=I5o|d;F{OvJO)X zJL5tTi@AjLr+3R6HN2tiQ=umhS~N%5BeEtCp7(IG+PC{e^|L0tC5VTCXQ||Jt+GR_ zu#6Im!}??3%e7$-LR@&{HDSMV>`dRBij6IKhnoMv>t|sv*f!Iec2)%0qGJ96UluJ~ zza)_@84)F;T^41V9R|L&e2ew@@T-Fb7n6~cR4soXOp0gTk#k{V`y+LzbGYbO_dPzQ z<-E_XrxQ=?YkN#itGN}F)cAC50*4+biruT3wz@%cjfx^9Dj9yK4E*+ zYg((RsA3}DFG~1BWb)8jS5zh}L{zDYBGV|LqkH#M~?5c{+6)I8#d9p2-hL$=b)1bM4cPF!^CcXn>=r z5_vI3sVrZRx+7xj{)}CL$K@Vuq%2Az+ZA{u%Tu_Y(W@`C%OE#>X9; ztg#Ca$9E$~y>T%{&6KPZ@ZjY~<0ldff-hrI>zdPw5#;WL%4!E;WU?R|&;F9Jmue)7 zaFQ4f&4LC<=PP`sY@AzCa{IP zA&+(Lc-D^B*pMMrj62M^JorJ14mkW;USyy9Vw68So@Dn~B`zEIb;~1N3m?CS`%de! z%w{2EFg<%+*W^X!8yT=q(}63&qLxIk2F7WZL!a%_h+USS4S-=n-r>$M-^%>V*zbnu z)YIK3kiJ7?;gV^tW5$#7ok#7tib@^J)HWIJiZE7 zPKHgSZ@n%mGcwR)IGnoCR{PFgBdA9QkImA=Ni$9C0bdc|i!s5a+v!qOB9;L_nnMHT z7w9dpgLr<_nSKabP0t;o+iOu0S^+k%y{67_{`s_ZTYXqR)%a}R@g7C>M=!IT{1rS3 zA9ok2<}_zTV*_u-!ztw-9S)#kw!g_Tz^-;GxMHgGA&+6MwQ+p2xoLjjP4o>n8>y zZ+1Vg*6Pg;7k>sEWKdL_yK+U+eys4CLw|xpN2GOTyK$AqLiY7h%)n|D_BqPiJ`^Dd ztzGFlSu76-(s}WxPDD~_c}28ydQ8( zaZK34UXt7`L0LgZL6Nk{xoIooEgkpG0>~wPpSUzb$kz16@~%9Z<(;IciR21b&yRTv z{yVm}7)==WO21~cdsqJ>$~@HmiaYr0ufp$1z;DIi&s7W)t1-iBQlvqhuB++M&=hr5 z;W0-eLa_~7|0Nq%NStR$3x7ih3p-QTU*;zn4nhPbuP0@AJD6;KUmH#r3 zM7~2C-UHWH9BnOAxJ{3BkF$##NKb-$q`uZP@bCUWb`1ZnMS3h##HETNdS7MEQ+GGx z`ncIswwh^UMNk#{>0*kZ)RF`ExaTQTn1Sc2wWLfu`%6@7Qpu$f5f?3-CgDuYK~I+2 z{qo3ydJtPJ;y3~6>DCQ47ecT}H4{-Zn+&<|UT?srE@<90Y-6tpN!?`I=whu2HBWyB zkcn)TFkZ&-F=8sT)4g6>R3PQ+^3|_}{zUB5La@X;uc1_9Zt@j1+#lAep3}SyH0SMCc_(xi-smDGCJ9^X( zfVHhpDdBIn&b)t~t&2ejS3l!Zr&;oCgXL%_a;nhxN#uLL1X-k#dxtO~k8-lB-jIA66s zm!aoCO7ofm5p@X`0adW4#<8+PXa5a~pi{FceS4-blLWM!(f)GkFsj>kGRc(`i#EPQ zQB$Iyoz#p&d0l)5CFXLj)FqSzwat%qre-Fivmy!_;_TQ6YN;qQFibR%9#=YDAvWJT zZfYKBWywI2|O;o}z@32}Z8yR}uFRiz+B>`{w9RL3)o(q?O^= zFS}tVw+z)0WcrXJ8!N231Kp8otJA1)ou~)H+Jgg{UK_MK?_(hEL4|Z>pr*&B7y8^- zA+{eGbJZwBmpsx@ozxHhER4qC|4xABk~{SdHGvjY6Lc`Dq|>kq!X@}9RZw)g`%*Ck z1BrgTB2nU>KH3>};}Xs6>l%f%f-6h}^Il17D+@ye0eQkG8R5#Tyg+S=~fZW^@1UwGOSp-s3bheTb{>D;*q+?SGW zywnXB^_blXof7{^Ecd& zJi#KRLT~i^7H{!=)nuryeTI%G%`e*8iaHlRRyCZ^r`O$6r4Jf39p5uDU2pfWO^Bm^ zobEvixAmxPR`Uvki4b>`c;|jpvg?sZ=&}WjE#qVhdFS8@yubC^Vx=V3FP*PA%NyIi6Kt{aS;+;%Rq9nKG13k!) z3$oTZW&1+;uLFo5leJ>CsWCbf*btEuH`i4D>q{d26Gg1^jWiQ zsslJCr*KLDPoTPXdxaVccbwCCb$X71^~sXXnil`Vkgi}%Tg9h(*Ced(zj4$ye!VF< zv29u-5RLS-93MCfwWSyCehdeV3~=D@(x&00O-s3rHs3saxs<0O7!(~WH4x@Ih74u8idr)iXLVaPbT}=V(wd(x z0_YQ~yr3nc(=|5+xBQ;nV%s1d@}}S|avlkICm-FP3ZYb0K1=TRt37s-{8gOV31(=F zqz-P+AWe~Mk8{{!$Y-K`3m_L|WiJ#i`3kwxJv`ge!y52dkG}c}198XI73-qXji_#s zst7mljyIB4X7bT6Kbkd%k8(gXUhcMGsj8*{`(OQG;t;6k*zfL=1DU1VO|Na$pJCsl z*xf*&i@#hg`$cg89W(K~It?y`k(q0DKqm!E-L~(k5mDWvmnk(*3Noa&t)E82VicG8 zul&n^EQM$vmkskQk)ip4;_uEQ#ELF-k88zQS9dv!ykkm#usxyzg1a(n?-cT(nmQo< z9nViv+X{~*Z__zw6(4)o(t(cAd z^o&Aqr>4#p+?x7s^7>#eOnNOZ$MKMs=DxOhIgZ%raH=17lmKYMIIm%Ub*^!wVuEJd zqB){Fs$5M-frkFLuD+K4Hc-&y>>&AjHudM=C0D1B)mbTpTU(&hy@9S&bL%KFaZ|qm zFqZoT&83vCdHJpcDQEsu>fI9fdIF4y@u2IFf6Vql1EQfkasL5q&zw3KI#QSUBl>GN z(8Z8r=gSsRg^QH^9hZ@6KlA8$M;-J1<>$tI(hvAdCqr~N6uHG8M9q^{Ncr#g!Jqa; z=o$ePKAJF4K{<_$g!oF7M_|1!i-kKwxk4wnfj3^Xvr4(F=SU;eE2gh;yYk_pa3(8^ zJ^2}dDQO{B=F8uA7hQ%3N$)a)Hu`oBG-=cl?k~#z03D{W(6R8CWCXxWSRpin2jL6` zTFbaHG0&G5@&dbLrC0DtE}80OqB=L(2?Jq%4%s~(1FA(t%`Xaj$frr1DT}k&8H2-9 z_WnBSAAeX1t$wVvVdW#8n~1L;5j#_qM8YFBSzc+d6RJK{J#S-0Zch3NXNlE)dgW@S zN!o9EPdj4lR^L1tW&@M(hx(ZP?tUBiN7wCdC{NSZ*|R6gF!o5RDrPB{+3-6u%iF+> zgo%QYjAdoz3SdfSQxl)%UdP7 zEO{>hxioSys{5a56yjGH1W6ul(rsGauiN->DsKaPz?uqI)a+&8N>9dv$ETEdeg1_T z4eQPe^oY1zy0;Sxq5gL$+ylhUu{=th^cmm@XRNDCKG6dG<3eM1oW`Z#`e`31jBnh} zRad;pHXrlJ8YH(;s2Qn~1E`C^-F>Re=nKL@1$oos^z3fXm%3me2T@!2EDS;)V^Ub& zRn~Sd^5$+N_OEREj#V?QMX9dW8#>8ecfBwoOvEdzW$F+q*&*wMZbk`lusR&(wIJ$P zwvVc&etv}R-15%6?M=jC&f1kx@}-GklOpoY^Ig6yVP<_F4YSt>ItjjHpNY}zxXXM8 zV3-F@hge92$II-M+^R!?^uH{1wFvytGujpJz}{EtZ z-UWW3HG*pLi+(Q=HmUTt6oY0Lw`;k|_iDR)P5q}5VfX5!OMW%%*GW&5rpNk5eO}o} z^h&x&IbLvo*hn|9nZ3nBGPwWDrENsYgTc;hpbNXp%Gz0}$@Lr8&-xnj(#Q%Nc_R15 z7+a6hRfOvveab=jx#z;P_TgTh^Hl%a`r+b8fqtk>6itb{2%EnrxR7Bd)gd9yDpN5C zG*HSO)&+)Vf*EIJh8?w|$Z?1VU_kPn!?$GXm+@DC#shD2@UI~c+P*XtK50xe1 zb(DpNh6n@sSpoq(O5 z+zHRQ&`)Bk>(?dR$6XQ|&LgD73AV2WWCVHnIkRs&*J;Gb1q96B%PsmxjU3GC7F=~G z4Bp1y(y7Ynl9O5cQ;A6}@1Ls?_ArC8`dX3C2B3|zhFj9Y>_H1Y0yt#WU}X@%zM3X04=VnAt{$?jTWiI__x&5CfEWnd9rYyzJk~u!r1M{=|Ur4lo>o$i6S&J2#hX$kjCMU*n^&_8vPcp(c2%Wgt7y+v z#RpM=LAESK-DscOj5SnJL)`!N`>-VWcHcl4e>HKBGfC{xLn)PG_uO3w(3UFwzqY3w z01fy64G*RIZ}*>F%vAQWuNBj>;+?A&w)E1M`f(e>88n62p;9b=+a5pE%e&!$)-`fl zT|HBo&F^BJjoy-koUf6@R<%UZ)32Ps8a~&@JTfDSDadTam>0V8_vKc6-04Nl`R>s} zsMAPZ5@Tn#c+Pr;IZ=$)d2ufPax$_p2V|sIyIdyqhkze7uroa~T==EFbkW_$G@6WaBN% z#QJFZmKDUYVGm}#No;I*)C!jNJg4;{8f`PiJg8Ke+h>XB_`V2%AbgyafIjgq&w{DOP-0$eV;j_+qz$&5yFP zWSmA2>`d`1)CLdeN6QU94+6)H{(A)Q$HpM?1$*yg1)Cd>kAo*3M*HtUjF+3# zuf6NYuBdd@{%!i>ZN!}=BXB77u~J}mH`DE=RPJepl;zEpInhoqML#THFeNLpKGiOP z1@5C`aQ@{h`%m?AqC`yj&(7U)s$JP(i-XU7Ldn0S{O(u zoTu08>ZWu(7_j{06Wq&bD6dY$f4jinv(~5mCWo|Zt*`OX~VyA71c0pEQdMt(=h%64wB?-6QAIk1Mk^?>o;?JgLk zN4WHLkox!cCN^vEfb?Oao^5iuqwf(Rt(*Bq?ECLNuANi2-Me&ab@NA2)m@7s_8(wl zl!XK)++p^&XX_0%-`N1eJPU&X>Q>NVYVNJ_v{E;2Fqie$0au z^49ZD81Syn(PK(lG)xfomS?r-Gxt&B1fijTM}+C{5P4xvL>IZD$J+>GW{%>OeqYUe z)t_q&bRy3eHm0)DjWK=RIdXC7Negjo9u4?tdnG-EWj=j8@khF_mgiLwPXO1+C8+K| zPx|tsc=-imqf4pgevCQ{(*JeOL$Or`nOv@rwPVSPm+el7_K-eaDaCD6MGWK1FZ>Qr zQKFX(%}X6QIF%#^aLOvq3ZZ|eiOv^Y>?l9Tz;gv2#t^-??2_?@+w$LN%pd-O9P{hZ zn1>MyKFp~i%29cg47sQIawu5F+1ab;WT{PCvO+g+%x&mNSA%@PDx4{eKGc#ENXqh% z6w^#2%&wF{H3mzrf6{C%Zjh=r2XccDZe2fM1r~3c7-9xC$d-MW-@Rt~yAjkqg-io7DwJ`d1l)+TQslKOHe!tW!3BNRQE#*FvB{O+ElOg+-TFBYFJ_l!oR(;v%_|C`fy z4@V2Y1omZBfbXL7_Op;q@fZl23g3rmhN8Kl}2cq>uq~{wV42N_Q~wRNfnLj{&l1CM@ZF8sw>OXNY6Hm z(^O&(HZ=$*pHHmqMQLwy;MU$pPwBC7mS5SR(3#D~(RNJEMw|(d3qL~u`mS;hG4vlV z@wUjYF266lo;kLwg&E%k(vpzt5{SSKsDp%~ks8)5L7J0%V)gl}PQ>~tx`3e9{c`jC zd3y0{l=$$IoYdo8Hp=?nY^}(I&htQIpFBAEjnz(wU0y^TMKdBk!1tt8YKPkJm_vHB{4ACnRkbk86q1I~PJxevK%oH2>Z{NuMP<8~pY*hn zfw+b<5GZU=hi=@x}%OPms$ zGZ&fv&VDAL1k}>)ViQYAVO<=C9_^lSmUY?S^Qh8$v<&Z+-2piEbJ-x6#DLjl6fMK+ zQrXe<&`UjgW(9$2##1P$C!;#E=-kOO%+%u`Wu&4^4II^d(x#;^JhRrNC~iRn1}_uK z5Mb=no7QCt|0SdEIOqEtikNECs^(+S({l@ifj<>I^v5*>qE}eZfml*BvBwLAyof?Z z>dzVJ!lS?yYJkoGZ5{`KFxf(a(VYJHON)OGBA{SKrrPI*xuuSIE_+t+FCOE>p7}(S z1qD`BVH!pUlqOo&NxOB3R}{S!UM5BqPE)s^2kaFh_qVl9JGy3@aGK@%jUKJLks5?R z7aWte)_+~82cnQ&xCA8=88QTx@+?hp`+6j>DvXv%e=NPpOQQzUsS@O&H`MaAOYP#j zJ``ZW(yP11ErG=0d$_X(ypEmQswd@RKO z?47hgN>%ezDCfT6uA7(v4#2{zhd$NxA%`l~-~6@E8n-Cr1EFkw7NC_mGxNSG3WA*S z21Tcn?E-xBzpS;fRxO%^LhE(0=~9UW4_~>_PYnRUt<(+#VV(b#U`ZO)>GQo)q%L{A z&ew&gv@FU!ngE$ek?=Dc1fJ!)0UGDxM!S%whuF$xyW0|oDEZ}di6~4aHKlJ?L?O^x z)N-QQRVv7n3M8sYXjI2!3@Y8w*3%VjB{c-2f$owH5dY7g2H%O$TFyYd^N>Ib7uLMT zrp_Q}kfV*leFK@_8Vw2mK#Lwnn^UDxoe6cYquce|(25o+dhyd3vds}D@*m|pPp`N7 zjq3WH7HjbLV|?|{2(x5oc&uaBM!PLKLRu7vcwk(|lcnHWKaL6?y}R^Lipvb}pq59U ze|JJS3EG>0s6A)mM=w$JpyQRD+Z2FJEb* z2>z#TT0O)3QxhFZ(I#jY4o2{_hI?W=K({oq$mtZR2dZZta?^!%5Tdc_kY7$z2>9h$ zpI*%DiWPZI2?!Zd5Yj#pCo%pn3_#TCbZu1U0pjm5b|1M^K;>0lFpC6E(Emp-ZOG=G z_9iRJf_~51`Jr=B2omm2yBnEFqps}#2OYD?9-kQVs+3@=KKEE*TVrsu!-G5#A3h6% zInkJddT-{6wBJKBMUMxRfjNZiPOG3nm z{9~zIPKJkv=rmmgchkj+APgD?OL;}aIL{OyH9c(&jwRKibQ#`X`^6}-okzlcJ&fVk z$sm;$v2w5ws@$Mi)%*i0SdK%)D69>BPYiZf&l%-+Uq1S~YtEDFJhHe4jtSVzAiY-A z5^j>hT%T+M%3BJkM8}5wiy)M9O;h<%lldy}=`KZ*yY0lV+da(HMICGu3NW zCqXFY+3lr!jATMl#a_waMEdH`kjn9VCAJkkWa*b#7o(abd@;^{8k%Z<9IM4?Lk|(~ zOkL`@j2{7-OMxbLv`Pza5V}C;_>6<^m47Zpc}P1)U;onbJ!*;2`U~24`AsawaX{A` zG0SwzXsK5B>?LmtA5fLWLbxVI#N@2dNT=B$<#7B)@=so#^T-!cJfe1ogkbli=K6FY zZqJW9hj~EhlqVJU`>n};QF{Z4yuVL%(xpr+^Ax~|wpq97niji(VJ}%hJ-zQ#g~(DW z^?_?(H*h7VzcNR|a^C5sjJ-h2QeYHX8S>B+WcjKC1y}DJY=`HtWX{YON~8Pf3%lmH zfF!8#8ba&cs=b}|A=@g4=*xADYX1eUgA8mea2v|^@I81q&NR|tUiBEQV&>@XtpiohJ#>tCU2@S!`-}m zUK?7VX^)rp-yI$qA$v^)fBoEwxiWPfpg`(O@aZ-Y<=m`ueSyIv+po<7Ke9W)RCX~! zO1LHlxzD`%fHF4MOk*8-Tk4uX{nW>r@htZ!0muK94ke@@*Pzt@|S11~0Z)_9PL%z938 ztTw#JcTUG369RV9I8D8@oBoG6M=`G;1=@R_zWe5tQ~Y4Y^{pU>7?a$F+tteV7Nd;@ z3M|EyI2_~cs4%fJ{Cmaxv@;~efiOlPiKCX!h=)D5OoTB^`A^5)xSr@G^*;P-E3hqY zdp$Nk5hl4BmFkwFn)*DxL;Lc+>GrFr0eVQ|u)|?mlJ!6HZ3!DDi#w8h80(=BQbn=i zNeihdyM*evx`BYp4!SLc(Kh7}7|Ux%q1>3>Fwh6VZcc3(%8t}HSmKek`Oc16LN!?j zc6l!g#j4X1zvWlYgbb8w5+Fx`UC0b>KptDb{K#x1Fvy!c}r^nmT~S#h}k! z%x1GLe>II?Q%Br=F4*%@qOT3#lyU%UE$+uhc$xb(Bg7v*wScWj#>Q8`S90g6a&L(<2T^Bo277Ib*h2$`QZDu$mU}^iKW>{F6#DYVUbtDGs-6*- z@B)t=5qFMfVs#qpMv44AU~ zuz&Js{?lk!8+Tfd!CBKtC)R0J%>bU_t14#e~jLr*Izi`{^2uf(8-k>7xjRW}Ri`wSn>+7`q@xh87*B`;C@1AVW zh=J6g$A??WE^EOyfv`6>2hd?vzYxhNtymX}FGJoocrh=|d);BAr_gE**YvrtzNJmP zhzi`x%kfhK3GI^0Shkk^TLR6<&0n1|KB6OnsjyX8mF<%f4Yb3VCh$q4_VsRBs|Q9U?~mI?IVkvpu#dtubF z%zyIf6!AX%#;|#}{mH!{MoR-pM4{=KI2XBm%-`_gi4<)Nwwv&4{TLHy1t@V(f8g|#-UpLyo^*x`}<{Sh2hn(}J3 zc*o;yKkFSAlJY$nPGQGsx^j`JP&K~^rY#DR>oVIvv<=vovJ9$8R>aSlMyHO~i+0u| zALZENKd`$q(AD{?$JU9{b*ZhzWWtn2062 zA!|xkQ(JB*X!tPB)`&hpQt+N)KxbUf@IhDs`B zdqN0I7Ki0vv4_t+b6P^%i5?9%dUc#R`#49ue*HzZ))TbF_Mo3rlSELEH#Ysq_e*1A z->k9wC+i}va6VB2lK#HC2fjSSp-ocRp2B$9zpk&d|F!eD*wnHRiMz`kPLaR^t=P_c zJ1h?1@}i->plr_{IE(+f1q6QSbU#&_WpEn}TXm%iD{(blo?LkA;?xmHcK;+X|I$QjrPt5*|GAz_w~4EckIXB^_6!0atM%Ut2n+P#74{AKkFeSsxx(`(yRn z+ia@)+;p_$U}seWaZp6C_BA1?ImYH7zx-f3Nj651zEd~#;pX9N=~V5PmaaxBR{X?8 zwE-yD-eNL$Ut?*wN~+@WfO+WD%1zMkyZwg1VMQ8NXwJie7bBk@>_VD;Ytq1p_tm3= z)i1jjr|I!xezq(&ZSXDiPJKOkXUOU^Ym`E^#&pc$5aHup>UgTPxJwe8MdSPrf^2YOoj$>B%{@N?Y*J9!er0=axw?lKVJ@ ztT2$y9Sf7!_wE_>7$5ujkKZCx-z~Z{N_gD93=c>Yvzemh$AbGgvQ#1OKX5&0Cet^l ziLdU(4$s}BOSPPz6ux^%n?kB)4}dRweTS;b_edczxW&kF9MPoLJ-3aqiO~hdu3F92 zIlyil zI!2!}f(`=m@PJY}${S#Ei!F@)hpcuY{t<_EQi z=6has@&q-5p*xb!oL-AcGmz<;+<-~J21&i_%x}l=SLbu#&CDT5ET~q_>;x8uWSP+ zp@>z_v|al^?~pMv**F%iUB4Asv32{YoODk;iEUhHVo$wlJcZ<gQ zc@A=Nc6_e(B#4!;KgiOh5m`06Am9=xTIK7aALo|Pw1v#p^MzUb$1C?q)J?)sZD#z* zo_2j@i)mFm)kVatUfTo9{koW~Sz-Qq>1%BI8hQ~H?|YfNydbzUXaA<@gEd!$nrl9i z=zlK^O>x5Nkz$ZxwQcw0>SBdl%>C`hm06Fff|EOrheaqUSS$#JaP4XqqG!ia?eW!P z#=DGw%mc?N(@1bv6Foog3(Wg!N3(NCaLU;snO3q~)N9e+L)673UhH3lzO1C|X84*~ z2`ThB2nQ`r6Cs%%_>$%J&Qa;an`!uw6NL&JG`ecaf%(uTo2Pn-NGVwB{P)1i#Qz9R zy_KZ=+SWMH!IBIqblU4KuXONp<_r_ia**Rbk?>rNKETpxY3OA2j2xip#~2ym(TU3X z_BaQ6JnANPgPoal`3u{ojDJ*|4Qa+whMLo?f7}hf?OKH9Yq>o&8ql#U&B)`m_7$ZZ z?0Q5pmLT&W zyXy@%>kX!VN}uqQnyK<_({3o~&Z}_JvS%)wck4$3#HQ16zC4=MUvI!cz$M2EQ-=Jf zg-4RAn!RZq4DT&|LidB~cr;6XVDVL><-h@0CX8r%T*DgY%&YClHyjlP@fHxcbVYO?| zwpc|k$pE#6nkGcd-3WSJN`p9m>er{8Ps|&PyAZGWBtHyd$Iccg1S-ZXZbF;A$TyV>*1i03B@{e5p(7E6&qT9d&2o&d{5f_r2U z-Iqt41$SD(Ym7-Z6;Rmm38xaTqSU&S#+c9xOvPtp^=fVf>wSdzYT=F zy-`Q>8pMuG+x9bZk7;bMEh&Tm?7QH?ME2_SUXS%j-|k~3OsWU;=402i4YD+(j?(m0 zgQu?XaYP^SVstOnkCMdiP91*!dBybE+sxL}RsLx!I9$orcT(+d*x?VCUOF|}o37GQxQq2k)&jROjI8q^Q z87I+S*`>hClLBEa1|kWeag{x++XeU$i-)+;d%aU~t5*w;=wc%Qo7U30F%@&Dz=>6C zMmlLrFE8~g`<(1@6B)_*p~#mwzy8OyB}7!@9c(+a&fm@ymUIgl1v(y22vpAtU4CS1 zN{4Fd3i(yOm{y}7s{ZLS)}=lW*~0Mqb~ko*I#n-FuxAL*Ha#$z?ItJx%ETt+HV7*|i-bfzn>9!`#f8r{lVE3;rc z?mZ5fo0dt|Ym{8|NC92I+_XTdcAFx{Z z@YYKUX}pP-_wjzp?RE0T(VmjA$u*_C>IJWk1v73$c72#g?-`Z1K+3prDAqjl^^B*b z-sJ$@LRrLyz(AH?XZliX|S*MiPy8rD?ye4<`B=CXS|dB4bY(kAG>`Lw}gP8EDL zvww)2eOEJIk{@3>YE~w~1Znu2b)-MTgl?E?L*J6`;#P(~e{VOctqSC87+gMmS(Y?W zZKvf;Ifq;6B%Pjhc&k*E$htY56%B{a9XwY3oUe80{%i0)?jV`UcXtZQ`bR^?mT6rC z+jinVc3Dhi-#B{0R6Z@NeK^=3#>!sk_xMMjAwMv5!et#@m|?%>TRD+@P?U6azqak{ zH^S%YyK$m3x4|6kCwZxEgMje?iDnzI%v;NRu(L03{hivQGaZ=E6_CGAuhW?f9} zy(l)lm*WZDKGgen`~0ZM?g1!I=SXVq{0qfy>8y?bZtbW$-L@gMW`ByKD2-z#HKo4k zs2R+`&>XmNkC24~xKd{!?{I!V^vgxzpqK$7gST++Mz{2xOk3{09&2%nidnR;oyL~= z8W0WL37`(Gg_}8}4MRjgExfT!&%|qy^6$8)B*dJmVRfWMew4;C4QNXnlt+~P5&|4; zz^zqG9)+VMjiUv3=WK-i4e0$T+MSqqE_`NCz$~G1q8^bM_=Hvv6gn*M7Br1Zl zUs8X^7s6e=3Le}v!TJvu4HW0p*(`nonq1-JA=X`}S&l0HS^r1AnC7vPf zZP77aGc~8Z5Cnv zMqZ_glT;CGFJ{J-IWrz29~ZQaOZsp;J3-aGTw@nAw&&BXC(tg;ADc%x+T z=(`Z+{wgQ>nW@8w?e1uvxrG&{jvi z2aXzXV-Q;l=Z<>qd%*@stu1Y{tDvG*HQqqz(4F1xZETjBJLtCk9=3yejn$S`7kb{Q z-lt%uljnQ|8V}98HwU~|jHDqBQ-=aD# zBPO7_)BYF{z9Dw{$$2r_xL=?fl!~~)9=ZoVegK%FuFiVqMNE0k>3eNX`o?uQV*IT5 zJ=xeqm3RU%7Im}C&8^<;?&4?@DDQqdR=d+FAFqz@gkt|wyYWxXLhUO!<=F5PK9rbT z6&ckv@y)35y*tb4w5j}T0t79D+WSM~*?whP-~AtgPPqwcX?9_}{C??EZH;dRsQthSxhz4rK(r@-7(u_2b$DpB#{7Vb0T|6P;3k3#zL__m{eeYE zj*@tN+0G#Xty_DlCDyR4-UlcTikhH(I{;y@0M+>Isic3=Q}S@hD&(^4*~1^SVHk$! zIfW^CGNcgiRv#%8w)qd*xpCT}X7$^*l$A4ReMKJShM15OBoVZ8|MLEAv+X8KCtPKV zB)aWjS}yS(Fe|{ZO;l@U6KM-ylMR&X`2J<}G;Ry1u(7D?P~QzFV(!62)02nQP7#Et zFpWwTVf*vG$qY48Q%8exVc@67fQJE;H~9Q=;^&+329*Q1PgJ@=E`L9qwho!bjU2cO zp2+KNFw4JIv9^L8i5>V$2sN|ZrT-e$5%Im- zwX0*RY}cV+v?oKZBhz!Uw!VY+jObPT#y4}9x`cBzoH6ZcR8OrTBnn2uLlw53vm+o8 zh8_<>y+aPv=44$h26!CfE6|LT0X)^mbY_H;M=!7sM6c0@Y+|%uM~cb5ipA?O|EPlG zc`*iHE1ETDX1-Bs4dJTF&FKk_BT}M!P!yq@Lvkh^k<{>w*508}<5vV&`Mi>T6t8iB(mUIxJ!l zoYIG=^UXwAaE_*1xFM;S(bYb}<$6}j4zLr5UXt;ptHbWPkar%A3Z4`QB2aDK5%zJ3 zwuh(npw(d=zui6*anreWc5|juEi{2zVp~DphbtmsiJoYF`UE2Gn~tr8Yf=nkO}=Ba zM=dedmM6oxaM+H)f4bM|Bxzjdo6HtL%9Ep|g_aybi^QhqjmPL66M@HeL(m@FPEdGC zE^5nLgHqoM<#Nl!?R#j?{(GAfnQ>jldV~G5%QPLPY1Eb@YBa>cd~<~EV~8ZA@J@TN zVv9|AWd(2#-1YLOZK3wg1QTN8!Pr+cb=N82 zKr0iT)1vPDq#kjcbXDi3)?1I{zVX;BfxFY4y}8j}8ftgiwO zN!8k(gQ!QX!z=Xez=?o2Ihi~@I{8IeICAdhMkw|gy6EKroQIZT&;C=~2Bxjile>Lf z(AC*oi!oql1PInM->_+P;CsGG@E?Y@IrEX67v%iJLO@AmPGhNX5-48j58qcOdzK)uZ>oJHI~kr5lrjNXhsil(pMXDjJgn{btE zNwNH(FB|hW-DASOrW?QQ2lB`TiLO3&G660RlCVgub)*vHEUHFPlxB=`AWmZ64oFo; z{g68X9v5rVvwB8f?rh%wecX*uJOcRbk+3f2&iF^@GnPU1-95JZhF8Lca3iQK2Cxyg zTdNikFJgqr`J)#{kxeL}*m$Utuln#W?yzsJ$|o@~rZBO+oq~I+f2$v%h_OIuh2;O9 zm1UVtTB;p%$q*2c)Ec81xel_7f=zF^1jpta@1BS^nOYEl8SbxWA4#-vUid>OL% z1Q~0bwpqGU&8u!%?xXu*Asir}w*oxp3AaWt4U=5uupxfT20i3$2Ay$&@Gj3uY3@%;PG;M2 zE^ZLVWw?=Wa}H#TOZUpNE+TE2ZT4>)mZBJ>v=F<&QV#y(B0u>)=|N|vQ7gE9!&QUY zcDOfHp4egk&8Yim!e=pS_x&`+=pX@22M{Pb%%B1`#R4Ax`OG8s)t);4aQptFmasMApR~;8+*R)Yux}-x8kj|x37f>nb z?vxJc6anJB z44iKL8uvtn0ra{>#6YuUz)0I^Y@Ll{Kw9OV6yH><&Gp}#`~^y(E#>D*Bo4|p^U_0u z(^n28*S?POl9EuJ{PoWl-rtOZKy>Wan&07po#p|+*zbmZV1#*>mz)aB)WjxHHz7ST z&@1Ppei9jH`JQPu*0W|XUu+vO_!+hCEG^Kd6xsP8FV{OBq^XWgZC ztmin*jsxfFK*#`YT*9kb#G6%a@;oNaRaAB;KBe7x>_hFJjl&YabsF9nc-Vx~g`k{r z+{~BUs7pum=~(Rf{$^-xUIk&S3d@}+^qLO!*d$h~^+#{Jnd21E5tRq6PMtv%MBJZgR8Im`tmaDt=j*p zV(n7+cF-Wnku-~`8rY{0lvBHI+o!1A#bj~HRqv{(?HK{?W4=o(ZOYy5neS+pmsI0F zj9(<4_p;j75}}#hl(&R8x~UGTOtLNV-;PdS-d2keU6j@GQ^8@pQ$IHIcU|gvE~L@E zR5yr5jT;0E$P3xbR>pN{g|jvn&END83n*A{)^k?8>jbcgmemF`PSeC{N|tHqUDR@N zA3rM4N{2R_>bwRjYmQ2QvqFncHGZ=aHH-kztuKP;kh=tJ(t1=Bxz0tMOW~|6_uDw? zj?iHsUOQzoU2+pK;*MVV*;DhE1BuKbyMi9(Ci(ok31N3BswPeOe+a1ILIj`5oWmde ziV6dCFSo9b&Q<|Y0KNffwOOKRXpv}5osz!wqEr0j10ZFre0|bk(Z@bp6e`Ru&2t&P z(oiajd*|`KJ?M|);Kz=QA;q8V?|UzEZ&8>seMx#kmA40`Rr>%7dzL=tP3C{bsmC$ z4u04w9Y5ufBou0lr3$$ z>!L~=jU;kNA^3&HxSBfXL|Ep~fQqJ6$~RWL-#W@hxy)5gh5y@M@W&`}ymk%nBBNe~?Q|O*MYJP3B6K5RUy;h;;9uq7uoxuZO;|yYr^IuUYvWc` zi5dY20X*$prILWK1bp?Q(1B4!;*x=Hj4tEeaGPwd@2(eq|8s$O^nbNDqe;ojek!Nm zlUBtgx>eV-qlVjT&HM6-hgTQRw06Q`pDX(zgm-}i7+aeGq}%Q9`nrb1i<*6_W&OSU zrC)hkZ4l8S9^(cLL!2vRR`2*rv!&IQFjOO(Uz@A;`r?WLC`lpNmq;xMx9<8l{U(Om zc7OVNx2w*`KL%Of*Q7c&Z~epOrD0y3&tQM&OJq~0K3C{gmQtNwrfgKd+R$ojmH)UV zqVHaxv}m#!V{I4^w1wDEG@m^P>;3Xp>%q$k!ldt?orZm!ZaFg4=L|Cd<$8^WjTmn( znoee6{;?>6x6_c1H2p!2YYZSrJuOe#-N;%r>5jBEto_^rqI)e+yvl_h%eqt+Aj4n! zODbw;=3Nc7%WEoqvX}W`wyp%3eq(8~3bLt6741q|K>6!fEqQB=*WYvnKFOOW#W)0I zBG0t`IZJwPLcOkr_)eD99_ISHPu_^c9)4D>Fs&_1@*lhJo3~z-6L8ei=1DY?f#|H~ z+M#f6mN_xeMb25kE%pY;Fd$VKKh7|@5rxDeNA?M4+vdy4EYBb14ETWJi_?-X-lsQG zFzNv~$Ff9zKGjng=e-L6O6i*AdM2a#w}uttj9hlygReWbHas40eqdpAj|z&HE8$}# zqtj)H{J?w)fV?huprNANmpz8k`XB4rx3Nb0X)e`#n zs!AC&Yclysr(TO>){!Uyuj9w03QM$<{>h{9v8RZoA6#;_v1D#!nylp6en$(87V0Js z_+9sG#Zv~*wg3PMTI<4++#$P7XGu=I3D_5rvmidJ&VmpNJHWrYg$=`p+-5$S1KyHs zdEQDzu)bBnLfCsB__fcTp+UCNJJ4$W{45JCM&9PSItzYZ@!F%9nii-(>3+#Po)Oe0QN9Q6E4B;}*Ve2clKQQA!!m3{tKB#dQsY5d|;q01w3 zWNpJY5}+JS(ALpb5CP5GN6cWPpk;fg8neq5syGmW+L|Yty z?u@I%p6(!&@QR$9fx!yv>tS>hk04s)(YWm(UpPI9>e z08%v(IwhCNj}}@#F2S;H&C6Svw2OD-+w74ome_(w|0kd;VaPa0q?UV);pWups|1N0j6p$v*v|-WPC7= zocFI^u;z$i3*srwU0P;|RQ-P7XL=%sNX~Nz-@VNZ)M&78cgo@3xx!M?U#WeqLH-DR zBo@uL^*n*OI6tteXxzB2m3wCghgn211yXxE{a{lIGg0%$1d^@ZJLZ8h4K$%xfy<|D z;lfF^s*4+sxEj5*`cs~s|FM&g%z+)76yjw%mFmLUUFu%S1YmeRxb!ICLefVQtCV~0 z>TKTz9V%2D8*gJY|3H}c!TCtc8=oF=8fVH-`HU1)76>_G|M0iI!6xg}$ zJ($rU|MtZP*tJj}Z|pg`(i}2#3k%gtG>`ex3I*UA0akl6EjXv@N%_>{%h=JaOC6<` z!i;sK}=-!zP#HfUhpZW@wW3bQAFTMmZ0ast{BT(YTRfVYI zU&P~cY`WBeA>=H^?(OWRr?DD8zk0tETOj0V-2ZND$48+NY9-&mO|kRj_cpr}>2$yx zyFdfx?Jum`KL2|^G?qJToJ^Ci$s{G#HLXG(?EZ5q*OAY3rw#WUbTvc8WPTn=;U9Z?#n$|p^1-4XNZ1(Y}Z*t$FkGPQ|)7eJ@KxZBmrsvF{sef4m5n6zDKgW zLXXV+EVKE;Xwa>|?sTj5znMyNc$|TB0#e+nwI<2_=36KA5oLmnRWTsyiLq=8uWYN; zbI6FA!}it%0GHt(p995n(7_e5_ceD3up%$pV8CTB0?I^(bbc$Qs7SLM>Eb?NO1UiL zdSsP-nKh2nL3!;zWXqX z72RoG`b^lvkPd%sezJw;o#+wca}JGdxyI0}f~2&AF3!OF|5S(_T&{d_bIa{zV&L$CtR z(K zg#ESgKZa!g?I;n8>&SdVwvhkpDmV4+(CPN3_(uM~h^(JR`1MnP;S>DTNli)PMj z3EEUVoPJGu!U4F4@{nEX){{*gXI51M7@9o#R}~HAxp1fXR4zqfk7UUGQZd33mf#Mb zwItB3O}-Kdob^>-L;QBs4O;?8O>!~=8i$x$Yx~j)N>Mc4k-Le%(-1Mx z26mshmzF@lb83RiP|}O9;cEE>*wWA`#9vc~??iokI-l40yKYm-SK!wKKMQn#P-p34 z^3ndw%?Yk~rKmDG%ooefnS} zTfe8u%Yy4MX$n#H*{V~C>4E*{(Rxj8C#HEgHvdz5(+JLQnnVUBt)*FUHwQ!5mTfxd zB;82QdS3Ni`UU5g13caTey~%pmjAR6G5tCy+lds}2Z@|uc)Rw)J4ruohnjGJQ1fTj zd!_(*hWmae-!fU!o+|Tz8JJ)`>JC~ym!os+5Nl|o`&)H2FY*UK7rj@bR_0)S2T3W8 zg^6D6iZUQ4c*jGbfxo=p&Z+L^7~k!72O28xA|tIbAs!fjWsP#TA^-l;vBgRK(y@)W zf%~A}u|?bB%5pI0x;^1;#Q+F2-KETRSMSV!ekMyiA+4&!mEYRIVV5^}#e=q2`!rlFh7!GTqog3%dt#wtOZ;?@Ns{|mL zYW7f_P|6K#KOU>4{ARVC!eZ%OAncyqjlz;wm^+?4rXEl3256L5$S20|3;8PCBqeUV z>pCL)J+T3d^%_8KTsL)`siT6l?YaIFi_1<5+tmrk$Htfd_ zl;K4gS%RgBG6_nHi!yK_*4dt-jc8?>odSGS#f zB@NO{aGVR;`ubzNN{_2kPB6()Km<gXEwc_gFHo!|J>*R^MLbv^-NdUQHg z*s)-aa>*kTLxzqbZztvRa2N#Coz$5U!X(mY=hgng_kJ9R^x%XuMuz#qWn2t;NrU`G`F3R|a&jgfp9-3L<;yO`I3>Lx*l z#$5C_&mp3+hSgX8H5VVdSa?qjC5`dEi)Ok;mZCD8nD~e2y*&WT)DQ$PV6q}u`rK@<3EkETuc$^i!tnqIm&fitkHcG) z$qpSIOFCs!Zln$^|toG(x>tzw{{7>Wg;onA+?fqR} z+{R!q!iKP8S8aslV3CpK;2QM-iqW8jPBmroSanN*s$#?1hp0!I1W@9*x4)Kqn30~W zn%~E}=X&9UdG&_Q74HA(n(_h=BDgGn>8w;f*82F0$&bRw^vDMw<{7d|^OPX#FdE*t ze^g_84CzQy?o%FPWAydoQy78%#JtH}gtejCXQ8MCLn7rdW4tgmB*Pr*o!AV+oAIhF zW(p6=jr&Yi&+0FE?(U@Z%}f5PwQr52`LGsR|5%c%P=6b%+VfGZXdY}A_N30KW)&*< zab2rPQ*Hkaf0*4%pkR>b=JgjF{yw=0M+i@$N1Bf3PxyM&3%{Y1(%IZ(Fx7tsj~W zoY7Er{cvpTi}Yk`l)IbVpyz6|3>>xRyHNDMM+|Btd9e>B3@j$e9@U!FD|cRZTq?Tm zv985|qO;#cNBpfCqc#7%aa}MJ1q#s;h?m6!fgAnak7}JaZAP+c@hJDjykK1_`M=od zziEm;lg<3Afrt^)$#5?gf4Z1)<_D~0#M9ozytk(PCl*BJ_Fy0~%Qm;l$4Yju5*P}* zi&=a7gueXwqlv*Q*AV{n1@c-aSyc5XZ_az8E22{oC`&)qt}oa3piEQNfb= zDlaQTRr~;m(4WpwgYQ+l0tF!ErKnI3x&IfS-=vW9Q*X$6`UmdmEais6Jb#bB3ui`8 zsxH^ULx_tu{|F%W z?kMVM_>_N}*oF;}Ir5-{q7?QM6PpLV;u&Wx4Y%md?4^-c4%`*cmRz&2sS1M*%Y&MEq{kIqmq^Hew9>AU|B<;xd( zm5$Dhp?2S=neF9W%rWsnJCCTr*0ZZGZ4wNJ8}Y~-yg5m>){|dx_^);)#uU$kv}qqH zXo|kehjYq;X|!jT335B6f1GD2GnGwSIU1_$$3kQd&i-maoyhrhoGA z!0fV7?x1)N73Ob0m$%^cPQ7=XOQ>+}$LfY2;O=7C(JjoCmk2M_^u&lcB6s<7?NF@e zt;09hu68o6PfGfiiijP^!P^|Qbjgl_>{wRm(*9+M_t3!A2FK6t^vt=adb{B*C;I+u0t{F-^3NP>h(%l)s_%pK3KG zpi@r0PZ$^-N$b}VT9@*X^7JfEfM9FTt^A}{n2htDiFR}Z9jj?OCtU+QVASaXD9M^%bSD~%Xufv$uv}2v zDAN0s+DzcjXgT*ws;%HJDoy^t&0x(&hZ_UYuGS1rLan1ZF;rLew0wpro#3$korX`0 z*qin1pGa*5Q{Sx$ecx0T3zy4J9k0=36Rx!l2}rYy+ECi2*$+DLMJnRC2lkA0G6`uE zulcOo{tX-1Po9&AZHeO!ks18Sv)(3lO0{bGBA zdo-N=IY=$Cxl-g*tRK>&$Iy73NymZMjwCGX7E;L^H9=AI|(NYgF-kKV;hHzxm3&inUZ#6C5>ZrdqVOlpl$ED=AgmLdQoMqoyY|&?H-{ zBk_+nxqvo>tn99qa>=7!z;JT;Q-(vBkSsY`7bBDcbP%kIaFy*qC=S)@${z7( zS)u*R$ND3dJ|hy$wm~b-b5|GPF;u{^69doS8mOrOniQJwnN7Rn37h!Zw-s=$hGBi2 zobs!(FVFnp%r$Ul)(=$XPZ%`V$1UYJ?=h&divEXBduSts;?6m!4 zCM(%HG&5CIn!yq$hL=#pGFiqu6hq1H#~JkrHcqRiQo5I)I7eTdFkkxd^!!_=ZHgI# z+hc5w5A#M08>BHH^<%3zArXD2ZQhxi$Tci+;p!-Xz8-2qTlI#cQtOq`_fD)Nd-XU+ zAq&k~x(t_Md!`DuarE9C1&l(SW~?+aCYqmqL_%wLWajjZhqLQp8OyCW74MBvQrfSO~#w+D{jxewV51s3l)Su35hgexJA_YXB&(XbS zx=mCpVW;I30uk&DM#6g*PF%|989G#;@s3abSM_t3k6Io&mMQ>gX@Ap@t&)peTuf4^y!;u$-oTr@I}LAG zA|_A7v>*IdqGCwBc0~YQB;kl=Q=4C_KNM)wq8jy8T%GCk%lvXBM(&Dy+4#wE2juV{ zBaPF$a82O3cuA|p@OJf1lD@NZNnm}XUON@I73Kt(TOHBxd^Bd)Ob<*PJ6@12#q#Hk=fDbg+f zVIN@+3Fml%B79Wv)p%$Jjx5l^&!kzl0Sn+pki()?a()fQBOt9swMgV!8tBx9?E4kq&0;VL*wTc%HwhwCRpfQ&WdTYQO^)JldW!X_8>4XjD^&D*_PtrH4 zn);3T^5#O)W23^A`FZxPt%&lYymu{0)r>H&P!yO(lZnw$ZsYFiikS|JX_^&pinQg` zL<{4calK?ucg6l2pj4pL^{p6-*ZwYw@H1r&uL-I9pQ@Uw=sXowgRrmk+bWoVQ8H5O zyJK&DLMdOaTRHYW!x|AIeNz52<3*CuUryz_4>J{pula}BrLOD6DhDo^G;g8PlNFcJ z{KG_2>XBzj8qA@6W!(!&)!4aSVzDY+Fl*r(3xVnH6s13PF9G^Vec8iH%F^%agU>gi z=H=7GUP^!B9PM(78hUx)&e3t-65FK}3pSoEBz&#J^tZf{ZgOei8$eyr30X4GZ6AlA zU3FcCto-E^vxC!DvGlx(aj_6-r=Al*#t$D@BQE6L&R+ zrn;&C)*CMJzfj#JZ~Ux3yIO*I9K%usNmQB48c!2pFmUWW+&8!3fx3?&tN{7v}X ztC>bT?n2VC@Y46iYFTIi7x9onXgHs0mWISQB7sjhax8;w#yz^o>8&x3@t`rbQ5 z*aUlyPFi9g<8bFbuL|#vmo4bGfOh=qW*8sjM%Zk6(-BJVK0VAxejqTkfi~ zp!(l{?be6!vdCnwj&A$1!i>OsvYFyS*ytuEs|cYhGi2?1`*s6&%inJFF~x{zCY5Dy zxXft^+_GygxiRhW)$zd3AUAY{Ne_clUYlX1$qgyQXievS zzdxNek|`~ONCIGnI%UU5Xk5h(p$9_+Ofg~KM`51hz`}d7wCjc2b@lWFb}g2Y9UAjO zyT;Kt<{L%*5QevL+5D!I5KX$6j{tXQCghhooP?Z_CE$6@XZiWMG6M|v5r=tFC_%3b zA4#H(%8VOGMB5&||4vV1a-FFS2qgsE0c7~`AYcRO&^pS=lDolbo4?2ijC)^=9DbIx z-Jb`^YF-8l3OQr5iv;YrfX=eLzEI}~JCDmV2oXWV+#Z=D<77$?t$U($Tv8=9?`=wB za_`i*5$5s2g;-Lwu@vIK$f2H8N>DUr8Y+H04qeBG5k(oY?7$Mv_D!rnb#kaSp^|=C zK$^`$huAM*ciPn8B%=ljNt=85+eKy`3L(l{vT>x~kw%>vWQ)1q1QVo}?ioMe5hvLjdlOcXSQjI+(x`12{_^@_;)@`*@^zxln@-v2PCSu?P$H zE3~O=Xy)NcFpvu!B0;x8ubMnBKHHf2zCd8yJ5{{!d+8(+$_Syb89M*ZL}&kn-Mb6KYd+f`ro=;ZFkgNlIsC0}c!y((ts z?hWE+#fwvc4X)ZpF=& zgJ|7bCp#Dy?0?$NuYR;Hspnpyk5?D~>f8Qx!4H>aE0%U2`L9dr($}1a70?hqx)lNR zUMo3P%G<$a)V!oBt!*>t^h6U|V{#n)Iw<-wIS3`M0ji`Kz&Qw+N@@LSH(gRr;FDjp zq+astYOH>ioWK=snH;YRrra|`$53icXw0UcI5zOU`;$dQpo z_;Lt=#B9p@?&M^_YFt`AXTt4KIdO7?poqvk2I8XzJRaXsPB@AY+AqoAqmC!xP) z8x}7;(@MG(&5buDPL~ELbeo$|#cj_D7^`HHVCs0<1n1fDkZddPr?h&tm}aS0xz&^q zd-^SYCF+fBA(qm`HAsfT+dv4}^mp#H?6A0EltnfxmQv!5sLIJF!^AY1X1q&E9QcI5 zbt5W9hR3V1m8aeV;L2Hp+1P(<8#nnnpVlv!WDDM0M3147pyo}~ zTuEod4ntCSMTS!R*0P(`7Ab<%_9_|k-AWaS0Kb@XKHT}2Xs5(Nb<>ji)Yc2u$q#@% zayZko(6zo~aViV~l;%AN(GMi&AGnd}&5!A_yDuD0=O)>(lsK*$TSdMu*;U4l!1u^3 z6^gcOS`GN6oC>FJ{I?JDo|5A`oZlL&`+hjOSr=$4==gh6ru5g2bnbVzov242(>XI4 zyu|UHzbZvz!L|oqY|8K-Twl21FspTqeB#Z}wZ~>Hx+Uz+Gef{(b8I9{eEi$b*MM^V zkFMmqmR^J*2lJ)0QZFj9`nryx(ag--R?5qn>n+rNKE#fmIz=TNnN@WZ zj5vfB+H}Im@fTFu_tbboX9Ibt@=9XTN-fX$W@qNSR*k}YNx3VaIzvoCAWaUftgcjh zds(C7dIEj))%p2x`ye$R(o(fpA4~A{7nM3LO-Wv}lVG(gEPE|fUqI=;RAHMC7WCAf zU=nh3-IJ_BcvAuLHn|HAN?0xDmdaL-sNh^rAw%G6oXaH1UQa59@Y*V^rMdV9+eI!>} z#Wtthm@WI648xRZA5V$IZ?4@AIHws0K7-V;d}FpyHMg9vZu2vWLvhGoI;G(6#ETv? z)NZvVt~v*AY2JV*Nv?4ZU^hGbrN5J_**@C(wW5KNDQDMso<}`TD0vwba&+7t$Jts!Pj>IigqeH7-TC_%vWy4n(URH$ult_)o=X@{HBtPP7 zlz+R#W-G|y$NS}~+V_~3PGeH!oFlZxdoJj1rSIYbZ_RL^Z&|kaKG8q%Q)fC>p)4=#V%blwV}2bQ z?C(T#*>>is0bOZ{^%2b@_YWc;YR9%iIz^{M=HogZIvWvf1mwH5pZ~1Q^9VtwdK<@= zysTOGb7>lHkw~od>7naS_CFo-*4z~p--%}fIiApWFG~NhwXw+dgsUcjcniCMmf%mc z5WRbDY2+@d&ixUjBVuo!me1}*^kn5k9{OrH_g|8Xh%G+h@m!6i?;m_3TkhS-4p#vq zc2U8;wj@mfpMso4!m=#v!|z*y3-KAdyL{RskWCI}WM`8BBlJ!~^G^uf`TuZxrS3VH0Zw5J=;&79M3TB2V2UH>-vsF;YyX|)yf z480V?m3GKa6ar;Lqqx$FtxP`UOK)EehAv{mfSLS*ZYH+I`E+apU1HubTx!5%>}dUe4`zE z`*pOXCLB#P8Qw|#$L70VNy|GYaeN%EV);xgnCW-f4}fl6C;8FC$>lRjYM_SI;?d4{ z*^eQHUVV9#B+#p}`rt_6r(;dS3g2ROd%YGu%}<$q3o|0EWu$Z~RH?d@sqQ!@2%em$XAW?^e%DTyY3iCs$=I*V&W za&VgMB2Mx+V)m&i69nS&AV**Naq+S-uxp8Su;cJ@S?`SFje$9^P@Qc&UH@t=Jdjx% zue~~W8F#bW5i>fq*pMogH}*a&(f-K@S_cR)$;QzRv9PshLMa1{mThnRThc`5Urqrr zVQ2?rA3ac)9V#Daiq__oY*P1~pScTF2Qx{9F!TzgeehpZ_&c3R zI6^X2?tTIRg$3$sq>h274_gJZVtXKmUQuhoZng#1-FwA;-RIifOk=KaLXu>PAJp_x zyehP7>Xe&rdyv#2Ft^B#G{YW;19tw|MxLEsR!dj#k<@E)~33Ye{QK36R zeH2Vl_9v;%}iGEn=e=?5=B6bf-niLgnr+SfY` zY(;tX#+ykk9)v~o8H^lK4&3OHXdVzy`!sY`kNi1Djg*C<{lg66?lDz&A#v*gc8}81 zwDoCaik}&cG3|jtF8WR)&gP7d3$Ow$b3-XVJFi6U?5K~sZ4d|mnY5KuO$o_nJoE>Bcj;1cjS2X8RYX*mo4F#tJI*^L?v&*E0v)i5i)hxIa%w6!Ln zg<9J3YpE#ILsi`eVlo@oJ>i}+gT^*9qZeu|1H6m8Pulb#>`D`cJ*4Xp!H6&V{&7JdAC;b4-*TX)`z-Z4Q){%q!|iEC8o_w(r#ti@a_5+#vsmrL-9m?R zF(0=TJRXD+jt=9NO|pIe_=dZh)V=1OV-#!b-W~lABnPGF&Oa<9e@J%T?aEE+F z_TGpi;pVJA{g=X;VTp8r+6q5a;sZV^adZx!w{%B<&De@s&AJ+o_yENMlY+-blFEk` zzcRtgWit3KW$8GRDhQ#vQ@O2$_=HxsqNgkW!S4LaU+u?MHp}HF(B40~pg~x+R8>d; z0v!-yz|hYy8KErO`b9_<$3c<3y=x8JS0K<(5v?2_+^G8aJcw#np|W2J4#^D)5~&jj z#v20z=CM~^LZtm4Uos2rW8|hQ%mt1Qz74FRtbot}5qC4_9p3oJ{g3P(Hy()w;u)io zIBQa}_lcbd?LZ})F9kloDkQl7P6wB5>1ltW?1DA7>U`(SkxiAmj|>dkr}-#}467Wx zKeidrrDh>ehB-G{CYDwJvj&KlbQ~^`_kUul{di$voa_yx&!fXU0_64cG7W)883+ty z8l0l`r2)Txa{v9nX>Ws}v3sLyt<9Xt8vr>T2|=TCc_EEPpQ`?>|b@q*O9&*Co* zWCCKE6WJ>)6rAl}6Q0!fA>h)NeBNhNbaFV1cIZM6-#HR^eQRFc=Bf^X)9+&97>DX7 z+cbHvOw*Sb6#iXwzoiAc<1camh#f0cm0V&*l417qp$ns(YYWz)r5y|Oam39A95(!3 zGPu>Fkb|-0o1Pvp;qAu?BjL*`CHUdFy^JuX);s(b$+vPTOT#!FS_f=>oZ|3)2{vHd zIbR2qPeOO%m&PB$&Fcd;ISmA@*#N_*L~E;m0wr*3e8qrjLTH-XX4%odaKLNxYOjIf zGllOL%-cEcmZ!@|Jhsumv+Ea1*QdDm3L((I%*$1d>A!dV%;@H_apqj$Mnn8o{q=2H zZRP-}fnn3RxX!Ym#9&^-;+>h6;QJJyL%eR?xUxeXK0AXy7BSRj6Rxh4N}zJ1E8_+G zgi}8PFIpPg!4DIe;bAa!sX?l5iB@dr1`NI8kIhE*)V4L%aPxI#(0X@ke}5Am+cTw` z@xwroMpg#XJ7X3P|9^=VGa4k&h`*j6NF)Fsm~!oVu%FjKmZ=Ng1{4|*Df08OX$Yd7 zm>u2}kQaEp?u`n74I*KQ$eUF5d#u98FJ5~K3~(GM;sI{hRX6Yrbs7PWk9pPH@-lrX z^ChMdD8Li!w;x9^V&(?5(>#yIa7MvU>UEP#^oyC^U_%4{71^`+UAPImx-CV``z1=P z#;73+4))8i_^^grt~v1>${GUaYBAnTu5o9?eH)R?V03^l`Er5)TG)!fTc4esb_hJ( zWh(!H5cGe+M6Jl}V(&oU>k^~r+nU|lr&1n`808R@YBr*>s*%jvv%PI}_4uWX97-{6 zMM7Gh6@;3nJ4~Hl=$T?~uONQ0j>J&#%QLQ_`sdQvt=Jp&RN4WpoanEyRND?;5*FET z72pg)C+&ZhZH6OLupzME8S;}{Nm9R7f*`d3{u^nF9h(}!jd=+p=nALzT0c(t7NiCk z(kkPQ>60k}3)BLQHHRi@I`tRtsM`wUw7TJ2=TVTaDZH|?ByQ#eS}a1sGt-cLJFBd~A-cPYGi zD@E$H8up2_8QEf?1aHUo|Rmr~nV$!IPQ-}m`8aJrU*x9bm8__e(uF@PQ3pXZ_ zKrffgzZE6`NziM>+*eTgH|EB0n;^AQ7p!rEfsB!fu11nj$@izz!uq&Fn$k`-*JX@0 zK=3F;7AN9msedNj)%Vhz1mUimi`;2oEM3qjrc!;=ZK5?(QlVU1Hy?A)HK`wJo>FLu zVnE1@r^j_TcU+nmg#E$~r>#IgQsAfGGm&z$3-jevZmAf|V?yZBg@@}Ub8)l>+ii=? zTFTTLCWAs2p%XLso=`eD!F<-w2&{vKp05JasCh?&vx)wl)(oj@*IAu#opP7WFCW?p zw%+(SYgmG-{GnPc>5J-|XShUAn4vml+_)acdO^}{#mxXtn~}ol3lf&yPYvo9ftSP2 zep@3lkp^(ew&!qn7{$v&2MX@==kf~gC{J>V_mp~qromPNl1e7jF>0tDj#`vffUFFE zIjF}prP>fOj-;v%)R9UpM6&1eD-NVfcPSv8*Y!V8w#Vi5M&fI?ME!g?SY%1Z2 z%0>hw`wqIH0%!z6{!@i{s;F_U8vheX( zW$l~uqgg8G%mMF*L`(>P$ensdccm#j({z5mgzZxJHp8$_MQp+jk;%LH%+IWdxcWcx zHT6Zl#ey+jXL5W_5Mfjp;{>{6cV2%%fp{y(N4~0>`jfC!0&Bg5rx=D(y}*G(O?kI6 zLq%W@-Y?45=79ptM4z80JtS4sEG10KMQsH|UOqYFh{?=JOH>uo4n=$@1)|VHS6p)M zqpUkVsx;M8X%-r0>m4UQD}Ux%Lk-y8R9a9sErGQpD z1*byLjALfkmzqYMG^^)yu)A%#Gl>Q^8VRBxRVHU*2Iksuiz=P%TAkVccK_jyp;jAA zrE0Lx&RoieVWa@VR+Ph|N%y1G5K?+ppYKcRYE^t^;h1j99C-wsa0c@!YLAcUliE(K zRC_bgrmuYz3;!F=l^W2URv6;kdSP^v_hV^{^b)@-3vQ#a!hB7~WN%NOygtaRtWd-( zG)}fxlcgKRByp$fYHBbJ7NAN{wru4>$?M6daHcrxo~mNj_KiLgZ}WI!`L*tSkW-@h zuj>BES0ldb!Bc^aHKhA9-B0MY4*oo}j^p5NM@@M_$X1ZB;+F)}DDF4OO4nXz57SV3 zALsmO1?5yHw9Uz$Dcu!8#{hpM&1V^wPEiUV4OiC~^@w1C2w@@~r)qAMQ5P!y z)p3MU{l9IxyoU~Xfb%gL_gJX2Oyuo7BG&qpAULrRW_2Y`D~5m(pZU!(2YG%wRq$lX zOmT|1(%M(ysQ@2{Q8l~bi4A@yKKQfRLJclI9W)Q~&g88xR{Zza{O`QzA3p=WGT&{- zDE4imf-6qmY*uc4hFx!o1$ywStHS#0@$omep|;6Jn2WQ%f}+iOcxT-fW5%s6;-@_O z(qcS+gPECvETZ)gku&L1(2n({9Dx?X@iB9@M_d4!|uE%6*3ih7K&LPGn1DjjJ$Q!DW+vE z(TU58eiIG465yjp#kh2ydB|jRPHYCx?WjrOnIZ~Jc}IiLTu%O5X=>@`!vMg&l$5iY z{Hd0BeSrZcPs`V(AAB?tw;TI@wy9M7=ITVfGk|%uAk&|%&$t-=aN*r3!YiFPdQVYW z_W2dH);rm(0#3v}8;4NmLAchjlR{hl zou%Lqa_BH!X%n43x<|Q@sj?i9x2M_a_gY-U-cmelbU*0>N%%wH1z@(1((WE05T>-Tir0- zN+Iz!^vk2M5fY&IK68dcnqtttY|D10_*%qot>Z+BT|YU2>IuCq+k<^iZ_^%RT#Ady zivk*2y!y^`=1L=+xksBQIst%q$3o|BiN^SnVUH6w<91_ZeV6{zNYK^DnM%E#ozwKNML0{FAh2Fd3ZS-rv~(L{Q}m%v*#AMfp9g5b3&I6+80CD~d7nxOe+|-Xt4T zp&t5C-Wwy)Y&@)$zJHiCFJ-4XDrY!j7W|-E`dKeHV`}UN*y46R3yrc?embCJI{-i0 z-GaPc{mjCzEeL!YRx9g-InA9Hgfl1_g<-d!0Em(-?z1PVX+GdpwF!QUi<2b$Pmjfx zVhU{C)M$40oH_0&y)k>AcN80lf)K#>l4_c`_f=O6lTYQH>{s?x*L~!z0pd`n>6)aX zCNY$XOFzA*7XG^5!Ca;+H)Un{1|P%)KO-8<_+|$LZgT$V&VOR+%J4u(7|(7c`Y8+g z)flVCn{_U0!ut`6K`D6j0Y3q4e6oug_3C(U;~JFj;IUs|>h8M9IxAH<%!ofIwTl5j zX%E()GUn7K;m}f)nX<;NdAu>@)@i}$;4M`s9N*yqCNXG}Ff-2b%q#ulL0AdIsIqHk zBs39zu~mE6f+_1R5%Lvy6>21T{A5uQ6k7%inVW8+t9t=?{y)LQnaU&F9mNB&O7^VP z~-MCgMd9EG$5H!K^j*1j(BuPKUosl1tLO6erNSvq-w&ck+(YuEy5 zeX)YOl}}nChSyfeKtnI5fWX__`#Rs!k4GiLJ-t9a^#U9qgN9mi`cDu;CP3_NL9EeC z3KC4$>~XWtcM&!Y!0+8k093>Q zhj~*-127pq&8ZIB)p1zqFaM?=5$e2{_fv(_bp>q^18^?@_{;_QnVMv+{~MQFI2+%< z+9*-IAJKr@D2@-F@P6FT=*;|XZ`rV_z7`&>ga&DHItsu+WxGL#(`#=1Ql|%L2FXuZ zJ>9LG{6D(BJD$q-|NouL$T*^qy^3U$J+ikr#z805B_VO_?@}n(GT|ZBuR;)@jk$nR$ ztaB_8`rMf6YF)lrO1z;7NNu_<_Ruv5dDRsXZ49ry<`%psQ$zl? zf@4XJ5EDAo)5^|1&Y38bo1}^vrS^a7&&{M=zTiQf{fTDGC+-VT68V$8a+s@-hv7Wk zgc;5THQbZ7|#pn$C)y~{);UHWmzb=Au8>NyJhf}+c?)BYQ@UE}+ zbu7tY9&}=!hP3A;Om5dBE}LeyJHh7K4HQqe`%DmCSFZN_JnBDq*e;aa>fKh7X1>~& ze&}GYDBg!@V&kj*m78eCJav{zJdmHK>;@g|I$Av2!6&Rvye1W@VpYSX_ICh2N;b-)68*BY{1e_(IA>d9lVX;?pn!OuWY}$SX}KLnHR_N5zN7=h^sp1 zTfBo~f{ii??NjJk>{4URGJuZxfdzK6GA1YUbxF`1{}j*1L+eMfQ+)Jn$&1XZ`JQ29 z+z1%?8}{18{r4wUX#0NT?G%O`RP+e>gTZ8r1*p&<_$sfquI;<%q){q8&GKIV??2VQ z89JmAJhZ%>KWsx4P>+9&w>@&uiWU}Xm#%L$NPNcn>1Xew6$Ln#=gY-^w2sO&^%G9277zzpgx>J`-JKfB)uqoxq)_{+E=UxU0l7A&xWH8L=4m2Ee)w`kU>I8{Z> ztD`pC9uAYO!cB#vGgLv_)^`be*RJET=*L0)n^XOe=PRE)zVtP&Jh^HTIC*fB@M$wZ z>Q}x(sjnW7XFMkaT$Q~PP)7^37#Z8Wk4A>B;e%FHC2muU_vNB?9gBA_!v&0@`g|c4 zqmhUHV1)eXPzPe$z$p7{Hh8C7nhEx6MquQ6_H+HdWwd~xS@|mqMBFL|~ zt^9n<@S^N%}n%|b?f=7H#Eq9xCQVi*JEov*;7hFNHOmlLD z%~Av}Mp5x@@gB95rSDde@s3(-j6}n)s=X&*Lr&%2miFzdzF>A=ikhA+`CLETacKQj=!{fo zdZg&x#2qqPEWAGY)8@dx5pmI+`6_lt;8&I&2Ajv7L2^z8Gc$Up3f4t*xO13L;Wz!4 zz1fQ4hRJHu<85(PYaZhE;zfLDbyEyUjh!AEBaMg4QJibH_e2qou)}4mv#f%_qm*@% z*_v6TrXqw@g9LoyVqY=QDUBuFpm!x0yyYfe(*l2r)1tNKEb>B#P8$v?g#8NR~RsGCh< zPeWn{>_o-;1El z4yCcT7(ZdHQ#3bxzlhPT0L9b&gi^9!8HOXLY$=cuUiALWwH4quz9eSxG$e$*J+$(H zaexU{bff8DuH}NZ6h?U?*k^l?F?wCf}`wg)bHB2)J1qvcE+g@ zNA{sr)?sl@OpQ(j)|f|Y&dZUdXRfS`xda6Ilt|X0d0Frao=olzSX(|}gvM_<0+MK` ze9S}0l~7Z2*ZKqHJc9Gg$)*+{@k@rltr+bZk7bpxsNf<`NIV}PRJOY0Va_^>6A|Zo zA1H8}McVT+=%sY>Z@ELM~uE|k5ymg&DvJi!=pAe8L73owzeM?7$$z(-~|e3UEk-er~!8p z&W!qP+0I3-9bHhC6hACGTGo(h3A4$1yBuHCqsgQ825#MF_ghGcXR9z-e>m;}@$KwH zjj=Iz8l&$g1$g!+Z{}u*Nb+mjv5(+|5yLJ+xp|F@W5mp2P+R5n=&SLI7>w+C{Dz#a zu8@Gc?PnqPi@aa$OC|o$O!53Q)Uf%*<*>H|BGdDmBmOc*`3-zwsC%L$ifE8*-jU_N z)PI#HFYHfUWOsz;rl&==VG&h5KiInvuz+QdmavO-pOgB-m~;-_?{ z5)BD`*l`@AMvl^N%ir*yye*s7OG z>Uhz!-3L{s{qu=#QmycQyUP>vGRPmNo(oY_bJ8H9J<{*YcYx&SD2zj>)9 z28xm0MsP~(c5E+s>3Juc!}9Z%Y~6*}eE4E?_j;8ScSPPvrcwA@^U|UKcv3DZoqEVH zozG`u6{cEl#V2JdU`?FVRk8YVDm#r>*;a`(Yw@&OxABIzhKsDJ?PrgnDZEnf6&A^F zNLtIqL!BoMY5Ju8yRX-zeBO0unELhE4i|uj{tB7vZ9f}uPT|?U+Em){A!2S&-6lzb zohtMB?;=J5Sygwsnt~I${8S||vOmmpBjsv$Du{I9wm6f`L`+zZ2ndr(y|xzRxDk9R zN?+HQQ){rRITT+t<|@0`JxLlH3+#+y>2mPW{Dd?HvlV^RxgfVrR=y2=6Zp?>{_jkx z#>wwB21)cO`{rbsoBYS3gKc6yeJX_#B`Hj7tjVn}l)qh!sek6^{F7BL7LPCqq1M{F zup#ZR_^jc?RxW+96dJGKtwAzgBQWF&w{l;Knb9FNG!z$w6FzuC@|-TaS%7>XFd~BO zS8Pf35?=o;Z;e3>JHa8D`%_O!w$~pVL+Im2S^+L!&Hu80BFihdkXRKOT_zg1o_&sy zO)6U}G$f-UjE25VtKl~J`u2D%(cY3Jk9z-v%2lmLp$sk@hnuLNR z`7!YnNflYNh@%$=>-emTrUjMwuy-Q1oXm)3=&|~3?LO-V_oX=@Lnt589yuJJI43mb zYU>%?4_!~RvcfVz8(SEANog%Ow(w-%MMg`uCol&*OldgZ%Wo(k*kHc_BXwJ);IW&k!#(p#7ca!YqZkcF;i9}p56Ot? zb<)L5TI2}aYmyWcs&hpB6I078e`+gG)8A5!Al}}K(fCxBtRB7vp1`Eu>HXH!5jHC% zQcSAyu%^mk@m9b$@JQCcxzfW~JZPCLd8b!xw?nX%_m)}4B!ot5!NU33)UMq{?V0uQ zd3t-JSp~mU6>XL?HJ8^AO(BKj>4T*3(4+hZ(ktT37mAa*;??TX#`l~aAj>yQvkc_* z^!Z=EWryYKycu64)X@(@H%zUO#^|XC9O(|gd9{Mpd_g{G-oP|zr6(_vHXDfVD z=uVF;7qhGK-wfZ1rI^HEL((B1(>qp*N$|HF{HQ%(Ud?Gu?y9p8>N+@v$~8d=wqw)xW-2Fy1S2xoKZL8kT>wTPtj}eaEz= z1!H_m$SuplmfuFGG+34N=;v-%z}*eEO~nJhLvII`iyq2`@h+D?z76AB(?7d&ZP~*M z&-!q@c3O_l^V#eYdrs7~SLo?$je^Z|Q{IM7IENRUlGgt&C|udPKj~*iwAt0rxLds0 zxcQnulzyJ(Z3Am|ZH((Fa@w{i+14vOA#?GR#v-NT_4smS!&b)jPush7T(Yg>q65Ny zWN+7}R_3PNzc*GVrY4mwPE(qvZcQ=gar44eOy!uR~8mYXTd!&Gw02bpKO(obSECV)c5P$|ec}>NDYdTqjrevLDLnM0WXQ%JTohz4t=+19Uaw+J>+DSKs}7^MU-&V9SQbrr8$T1R!Mk01L)BjRH(AM0>+Y|%loEx) ztXtDAkVTx%fZ;9hg~CD`HEVE}ye7vF+r^rD(O+Puro*Sp6@`iZ{Ms{BKFhNiMExQ)FXsm~w>Dj;RHmJGmpy8~`H4BM zgjFx<9Xi&{M{G7(1Xm^5?zsMWzi(@3^F+CDx1&`z*F{LjW!%iqsjFUOoIFa;I8Q=9 z@GEqfqNuf9IYP*yCe(JiPYgGYV2kT>>^G;KDUZ`0u?L5Rvv(FY!&W2&W^cP#_|*4e zsm2KH`|*ilx$H!mMW5f=HuRejxmzKfNjmEseQtN?ReGNIo>5>|!;Eg6Mk!dT+8}UW zw(8(8PM_`vyI&fqJMQ+VVf+PElp^|B7U4+7mi!-XG)H-Ak9}_%`+WShshkn|pQPe( zq=Cm_c7h(E@eWXa6BR&6CSuUW$CY~GqgbqnoeyBf~J%9UXH#1|bkfNWGvgEf+2%*$7 zj~rfY&y<{{dLD0BrfM8N%rqs`5B!ku=+2(|;DiBRY+Z(Ej)SM^d-LY$m;n}r0{$?H z`@NTL2?X$hKkXk^C#Cr!&U1Dp3f#2KL*_*6iCwrJNE8U9ng>-@Kg9_Rf~}LnGI8gJ zn8Qxe##UZVW%x7Pl-X#Di~Y|XGY&m(^{EmGp~R8 z;`o3dA!FR@kGptY`IM|ES@-zs;d_+)qs#ab1x^iA_m@0_mcU*^Ja)qGj!xhTWdugq zXsu12bsVg2H@`e?i4n?NqMGU1mS78^z}{~p5p9j#92CK_O4u=#XOo#YMgB3bmgRTI z5VU%uXTP(uon*tcK43m<{?rBWP=alvki1_agl_qrT_$=tM}Lx+LEu0WY>`|84W?71 z->#sx{;h60^OI~y%;X4}FX?i;Z`k7sSE?Qvih|Pko-Z;OY&~{t-mtpE@PIj+dCjpn z8R-IWuOWm=RHOgNnhz}Rkr)?jbt}|Qje5j&H<3tvdV(iI(z2Rp@NM|IUIS!g>Whmr zkI8oEuh(hl6-?h|$S57=@6qzu!DqQ&$=a_3y?i$JJh%1STq>rfn{%OzfaIzB8zu3V zpB*-v9;bA;KVy|(6W!lVI_&pxzq=q5l?d~*3`AsI{JB_A)#H`#^F7@Kzq0xz*b ztGF4TR0R;S%Iq3>V1$x9l~jF{rd~l7lOiVmQzXDQg$ewTlfApu=Unz(uR(~K!CqAE zXoVo^c$q=8I8zO)LUc_b$>Hc=kU(}zZ;f+u^;~gBxP3!2(vtX#G@Zpbvsr)TAX-1Q z&f2kRJ)PZ~2C*m&>|r`}Yi;imjqZ$FG--ZG_M+r-lQF&nDFk6SI69CQHQGCa(_5R+ zHO_beD4BtIOn_e-<+Di650O|EvHS(8u_98-GUFr_GJIQvvj-!MlIEHtQ&!>08Nph^ z0^>P3`^yss8Ml!la@Zi=4^13{AE)fo#1k;)@GgFz&2+02Ra<_F181unrW(}czyDEE z&2n+XO-9H)fp2Amyyhr{v0w^d?1;fl#?GcLl@Q=S@I{qK#?2xsfbsPY1>nghuWvTD zBnsY^AxS-I@*yy%Twd#5gA9Yd30ZicsY-z{EAmdVSUiNBq{8!F`O^`Pp1IP@5v+=@ z)E?dyQWYVEkpks}LUu#K#pA_QB`dQza&bMB8{<+1wWBOa=jG2>H_Zy6BiKkI+VUXp zHu5|uF|VZ8CY_!Zb?*!h@!FRE*4p&`PoEmY>WPaD|4yrZB&)3~;ozWwwRV%|O_O_XLas zH@$5&2nW%rX}&7>-s_souTe-?rDwFGH|Kv>>}+{tjz>oxQ7wyia-jwfoFSCrv1i^C z-QFC+81zoUp;OA6!S~*MyS%f0uY^YClWi0sVt;MkuT+Ved^9|p`UQ+$0mh0f^^lj@ z%pf=ohRORf*%{!ZN4Oulq@S*k_9pql_wQ@3K0ggpl3aD4P_581XSb&=aaH6u)pE}n z>m|ltpF5}2`anvnx$a$rzghnx)p3lKR?{+dCVe(s3A`V1*Bh2ZAuw*in9crfttK>8j;2FT6?+^j7sm~FYN*Kb$P zgtGi5yX9SqB$z@|mUPdVm9=4ghR+li1wlA8zt0Ysxi7`joC;aJAyNG>z}%alo*P?& z%|wNoYlY?ke>dJx?2v-FCYd>}_m~JaHO&LFvmA46ob7Z+EBl97#PKxLWQ5TaJ^?aE zf95mDeL2`d62q)B04ER- zGHG|;L|^(=zcoZ^PPq1T^En6ok`W#CFM0xRTc&`H@3IbbH@$bTa6b@!i7Ag77!|#r zsVG1pWm2*eBTj(bl`J8}?Ec_A6=AfHcL4s;k3eZ`czTAnQP$YDF_mW)X|2MMdd1Vc z+vRg?jab-So1U8GdA>(#wR|h|vdHy0}PDG3H~%*DjKsgQ<+zSKsOK_t3Y z&|lWwvwzljZ2mcXDt`SwIw7geZR*<+Qa8D+QuaBfb>5Lo4aMTDy36ZG;3+~%#rU%5f6ULfO!5OQH5Qw zuTWu{!~l`pRVzrY_oy+nc425zX2F4roFLb4R_!MW|0G0=?wv88@4S^w*no@(3ZIl1 z&KXff8F<6yzX^8cNTs-hbUv0SXk1sCWe-n$67w`?j6A%5g1zCm6%RihhUL&d#~u!Q z%?DXZg&Vl6d}FL$CYG&`8iQuQG$!Hv@%!okXc?iCk@~ew=cVJF=imc&kKfoHwsLDG zJ@-{B;HM^=Po^GEvAswe+pG=SdcHNA{?I0Ngj{s}2&ti6^fiiDvVy6$_27(>43H+m zVX}tV;c^Q0HjI>dMAATBAgjJox;@9l{xBsoi{Ym(oiDui=+{S`gH+6ePjCbEI9cq1 zjDf{lD_wWdU^CJa1`6WALL@>uIOZkfX$lW+uxZ`bq+?8LMSOr~`@&~Wd)FDsDxP7F zmcl5+qbqd!)mLKF3Y2B$V3FI=gpw6)sZP@Jg&ttAH#Jh3eUWzXlENQU(qn~VIdv(& z?>nsha-Sa+;u<9{^;pT-Z!3S-A*ZZaVE6?b`YzHezPecrpS640o>MI-c+5nPUID(X zzbd*?``#<6Z>n%!M|?N*X#ow#NXt31p_#?Bu}N@ zZ+kCmXkyO|lzJ8y9@+IJYBHWB(w%T5R7EWM92WfX=VxX-(n5#fTr$NRism;$Jv6`h zZEq@J&uzWOr~BaGgHOjYw|9iOx+MXD6~SjB(nY}qQju~aR0ea-=_$Lq8BQJpXoD@x z`0gE6cjl*^OLJTdB@@hULjLq+Gp1$$YLuc+9g$oW36X}lGY^Zir8wDRlHpj0v79bg zC90Z;=KB2z#j>bRK8+vtA9VNnWAk?JgP$mT=JegNK>Bhr-j>Qe5*+yNuJKW-OSNg2 z=E$92pJO|3*!(k6YC!R(xe5Ngme`FTwu^?@6)BOFYj1yUkhfw7n6s<~8Ghss?-cAf ziL)(SqIh?SY@W*Qm%0=PfHlRa@3Q_g-*hisCQH@K1NZ0JLn4n(JeA6k=IZIOz^x#x zUu}_RJ7{qP^o#T2s>Ik`WDuqSQgg^6ps@pKA;4qAzvzL?y(ApOroKY?2bzoCt%$fqYCM6)VQ}w|@)BvVd0mV=GxR?8+&5%l! zH~ORa-9?9x6Yr`s%_Ec@144Dz?wN7 zyj)vjO&6Tx`+x?r{Jxs3@3^=D(^XJHZ7e4TBcYZx;71`8ZBjDWmU)Mey1biZp$G#1 zjTc04@SWP@9S}4UhrVf2dsc^B*+X>8;$ISaX~2exdBqNHM=10PpVbIOU!3Jgb-RDB zIua*1dw;;vtR&*N+!6A?LYcQFqLirlDfTc+Rn)*S2bz7IuLa|#=-U=6Qh8CPixe>p z+Qclvrt+>$QR7J_DamnVqZ#)X@q?uDs`(B^;oyzT|9vcFw;=nTTMp8#T4tG8nEIz!Kt*Jb!X$NGY}I0lP8g0(WRAI_1>++1 z&O3r3U}xh5*f?2weRyzWFwlP9tj>mOitIHCpOv89Nbp4x^!k*`v<3m?WL4J|!XCJo zf;QP^^spe*mwx-W9KFOq7t8qXQQ=zVI@@XY7?k$9hGD9cmoo@Q!R z!Zi8SGOb;j0`<;BzfRtiK8)U*_FcpAzDrW^Hj3mi`vd;V>7c7}!W~aWmv>`1dsaig z)@)2reO-ozpxb&U6_7)|6NG$}kDDN*AN2!|cyvmv)`vKK5@1vB2>2+7 zxQHkGMVyZX9S@?C8@oT!+AoaZ{PX(H=nf@g@OP@6`a z99=OxhDJ2W7Y`YPT+C)_wb~4_O0kv ze6WXuraipvJ`Ok#yY!_&P@B)qz+%b)_C7mPQSWoiKt*0j)L2eZmAt{r3k3$_QZRTG zT%N<}^RKeMln9MsZ);WG;6ng%n#nZLU;(#EzZn{17GOCpphhqEpV5=7UymLn-E&m4 z&(`FTxeqBQCF8WJXK9~crL8k6DVlvmuecX;=@7^r2RvrfU>4f|!x`%On6%8K$r1*P z2mD~?K!oA^ir#SuG~`}=x;s$9Z&FDVQ@Xl{SFlCQIx=CmSDSWv4v!WXZWYP) zt^hy=sNGIAVqo=zJ)FM4rd49KIK+{WgyAGNE(9bCSXgDVWu2EuZp4|PI3!qI&0GCp zfv;(bG}V2Bf;Z(DFq}HvRIdQfT$31Vx*pjXB;kE^u+Edw$7!*1+{e5T6)h&c%|&=H zF}b5Wsh7-b>K36~)h9J9An;-a>_*zlEc{;1-lofc_G#MV#k|YP3r#x9EG=qK_<+4w zhD`(in-j*;V=U5~E)AUGgnP?oh0HiMxPeK`tjg>aH3 z=*7ns0e39cZ?2Gil^4?gl|n>&#WkEJ1-^2tH8>z1M6R~cjoY{~9~FeD@Nx`6#_+@C z(Fu7hqAw&>Zs_G7*-Q@IpO?m@8=UNN-=&L+^)Gl62pHmh-6C=FPvt!Rv6Ef>h~U4} z!=-vfJhPK#V|)rI0bovPV{8_n%}gYKBM5UHPKqPy!DQ0T2eCIQ)GZ;z;%dl!F0X~bugtNd{-!E=X&M;`f7EiZ zMCIJn!S`lGO70Vvx8(2u3cE*w9YXNy#b{2@U*013mEt{~MFAM5s8eJfsBS^^S>9ap zZru|Otl>JKX&eP#XPLh~C$6!UG}XWk{8gbU^%#>#8tg`hZ@KC!3#V?og4xGP@$3*1 zoNga3%M6)Oz+_J|Gf;ulq~J?1B)K~L-DK9_f(rcxEbs^m5T}44FGBe597!eTJiy4v zW9nVjHAcL~y#Ki^nK9)x!(58v_s6HC2_k|)_3~~N**p`}PCq`7{BvubM!%4L0+&_{^_WLlcBXN;#i{TSk9^{mo_Tybs~E#aLXYlTWIb)!{1Z+65Z7N zUhlJj=>9y*tX21r77!6?4Z`1%W_WLm9Yhx30UjJz*og%?G{<*xl~Ra=3rRP|S~Zuh6kUlIm=nDRFb9 z%t{*U>=!7Y?ruKRRndMf6Ay24xj8-IQ!tpD@ar%g){;_fZY(_mrR0072XRh>$l z2!K_tAxXInZYm{#xVVq80u?m`#FKUY+*j(GJ?dX6$C|#Ij$&Yw{doPCn79f4Ll=17 zKn5Rcg(BqsErV1e!g7|HIZt3k_5@S&sFkdZMadvkGjlDSV0j^&1bcv?90{lT%**1^ z6{ny1>@E*M*15v%{}o|O>HRR2G%wXx9jlt1CNAHA;haa^l*QZFWDU>AXI0N5V7>oH zUh|6GS_Q1c*JsP59S?szVs1krrXpcFpx%^ zmFQC3$eqRvArtejb&~9GQA07wZ!6z=u_GHY8gZYGITvwm%NGJVwxPEKqW?F{#}cLb z(22-?{USuc{7npp5~x!s%JFnHCbZn*%a_e9X_`H)Fcg&=F1Qgs|WzkEmZHL)*>~I4qg+e zZ~>)0yB=QNhO>Z~J5oFjs0!3DeAq&Bk2yY%095|jES5u(d2mAET@=|RDGLJ`Nw?`< zi!L6(GA+?pYXTqH?gWI3CZ)^^Kfoehrnh#&4kG~ne%-bDOmY2NgV@(Xr7__%Xoh8= zuh$b{%R6`XKXOASPt_D!Ia zE;f1Cbpxag>XrMX0F$5{YoVZS;6DcJ#;_$ve*pN5eAT{|*!_XWXTPJOP{v6+5Fk3B z;{~6{VjDDjRgA!Xj>gth3LA9-q{cDyUfMcS@eB7CD+Ee;?pn3BeGgfe+<~Q8a!f6L zO-z@*&ctCY`gUSR<6vIgvlP)$2lNcsa?ZojtI)lcLP8Rg!@g3JJUQT)nAxY$3Vi22 zhYkEssl*)mOEd!512lWA-;>CNe$$}2wK6a34ZAY6!7Rf`T_pcrxaaD^#oA}=Vj}A? zu7o6Z&!`n<>eD-rhY!kLiCilpopKZPl_JjO@-Anlxx7<}5AWxvDi(5n^eR+=du6pL zQc7A+0R(sS6G3+HrD{#-zdTK<^Vk_uA} znDXLzN;5)zyEoX5-fa}Jg6ozmdI@R))MJOPeXZkl90D(TA&CxKY?THeKn3KYj5KLD zL_Y>YGg*ePcK@{BLN_NonYW)(-=$HObh_ij_W#QTfH3$Q;8K6~8*svms(>8tgEN7{ zLn*KOXwJ^RGlu$RpeVd70t9jSTd)fXGLSNyUg@*aXb#ukRxoS<5_zgLUKWv?3Hs;v zp(xZOWy!Yt054gwA*^N&SZ#dp75v(hvUj|t$oSwW zP$~N^caDQV>VPByx}AF%pNup=%X8Qj^a<7^2w1&Wi6>~Q{|?uHcE!`s`KZ6ak&#Y7 z=N^aUW#+{XldeV|8*Mn=G@#Y1z(x5{BqSsV*oWaX20Qy?1!X`i%RcD414WA0$%|{Y z4Y~#7A~|bWBEfg=^(PZiX-1ZR8D(_chO<9;ekTLM_W2<+1-_mZ1Hy8OnkS5HCZ0qe zfzKIuXn12v<)TEd{-^lAobu7x%6u&&%SlwvsDCG8LM)G6n@WPOjKe@$YHbwr&bMZ% z$6?ogIFR4#Bv%RL;6Rc|d1V|=?fI_N3sn`({`I!;rkMPd?p`^|4${(pHPGg@gB+I& zlk*S%Pqh5jzcQA23Drbt@<%ZeFPJGomIDBv$_7`D>Bn>mgIsMAN<){gkeCAzE%|{M z;R-1=LMv|6}|>!usG!6-7UtiI{s0gSgsgtS`V?PIHj$QdnhKQ1E381hZvLza0Nf zk6GR)tZU+w?>Whj3|xwPhdLCkMR&nTa6+T(o#z{0n`sI9K>h1I5OQShe@rZ?Bs>FH zqRb&DqH7aK?t6i=5sb;QpP?OeWgI>mXba((#{^pS@4AcQiqh1&4P0|e7>U(;QUK+3 zywGHz-$+gRe;ZVd89t-KRxBx$=l*xHxo3+RgK|laEbnsbd^R{42I*GTx$qO}J=FDs zGEwpfD~cY-IqxTFz`R!0EezQchDf9CKQhu9IHec}w$87bf-=!8|x#`xhjzyN>X4SZ0P;r@jZcQ*R{CmCXi1Io0ia!R~Ka zs|g5k5pRvmyTZf{V6Al4vbXkeG4oLRCts_YU-{dK@n4lD2{w<)Q(n%>m@I>%m&zk7 zw-S6C90AKqNb$WgPzMrjNcJ^T$y5bKRvrtivUV*nQ5i$YaNGTJbrj2Pgd5M-7oH}K zG6xj90^=Ll-}bFN2fRL#C93q8sJx}8qA3F8+M6e{wOPZe8Pbz;n4sDPjQC>h&nvyV z$l7?+{4*zmBLu_$2amb&)Ay0qZ>tPuf-Ap1LLy7;-`;*il@|SM=GGnZnTp0)9GJpG zY42{@D52d0w?0$T-F0E7`ooSoC*+2?5=n&{x@O0%N++#5$6bR(rmb^X>;n%S&MrEb zBZYn|`Q}R2s;a#r8*=od#WJkK@FY`Z%|Td*ZT$|^OIQ`nXq8B&rTGu=fZy6ngVnLK+2m zSWnQDo8~h=;}0do5*JlMUrP}iz3)q;X+c^cxVLnX_|D?-L3U}d)B67)ah zOEcJk$;2nhB5JMM*}W8~^PM@@~|0 zwUQJ*uK+qX?Iv*&V^1>gZ|tE@L!O53#VL#5D$A6XvW47GjU@4SxOo`UBejVk##(2} z_@4>fJw>=Feic-jUVVg$(5FUtpi~nVR9A=&?dfXpX(j3zX8$R_HFVb;a`8N`Itnv= zoLIp74}v}DtCLMV? zB;#1hYp>6@*3-d4jSFOgR2`IgKY; zGkn*aac_L+x9W84d$qwnGrAqWfjPx3a@5^`@C4z-x`O9&ef{-rZ@H$0U!l-0v5E~2 zK1VxWCRQzPxKp&UX%>>)!>6i?t>FhU2e=ywK56srivjhNog}*jt%W9Z;53gHemF0$ zj)D1|qC;azthSuw|3EVgdxPBAJl?D1Hn-{8GA9Rq57`csz;a+1pXev7O$g+Gnmgg- z2@}2t)q8M6Hji@qJRG->xR&j|DdfH9ZeSsWRrjA1%XFszkw^dgm>E)8^Cs0DJy!Pi z>MD84KMZbn+;Iwg4@Nl%i<9#?xOLcs<*&e1ivmL)ZyAE?3Jk&JkQy&@%Fn#4y0?3f zufka@DHTrL?)*>s0b5-dnD0}W8bkHURad$j222#Rd~?_Y4?m8kQpo$|d_bj?qty2+ zyaBXcxbjVT-vibAnWc*>OaSLnR^u7;=_iSG+wT^tSk$Bs1EH7LdFFs1P>biy(j8P; z)r4Va1qgYnb`L`^D~#WB?cDvly*8S5&IDw9g! zsI~TrRq*EB4$4lAv68?WOGljuxga4exLIzRH6GPd=%M@tMfQeKwC@v)RxC|p%<#r& zuUkQR$7m}-E5hDF56Z%;R{r!0hVnMsWsCb-n;4xzC|DGIF2$cph&@=sN11z5Gxrhaz8Dald>cw+3Q*L+HsXVFM?C zK?TY@wzTS~KB;R_QDb|(rET~tPqHCoMfkCo z^LJ1qLtD>OovD+}SSw4Nn5zhRaLAW?GsOgbLD8JCyy(OGcbl)WEUnn<^u`3mv-gnW zvWy6<4?%2s1S~}=bD95U*>xj4ps|I0f_xX)Yg2{3rVbYdol0k~$|st+hyYcJmQ1i+ zb7cmoLEh4BJTQInKg6?R|4KYJ3&Z{ch`$2#7ju736#@{Dgi*4)aLUi}tD+s}_pf66 zwqzOF`-}Gmx$#gxP91-sd!Y8LHPc^#Qo_TqLIa@iC>Xh(behyZ-wB$qipSQF-V|;0 z5JFWMcY(&nQZPI6601uqQ#C5dok~r{dkkp{dS5AO!l^N?@RMqTPASa+T>SU>;-|hy z>inB2pKVV-1&M$#=jMMI36z3u_)OtiYn`k=A1CPzss{#FSNR_KzN&re(~W2Ut-*_b zHQ0>!UgQ09u9Snv9smnP+L1yQ5ZC2aB41_@s^UHa`O(D*=DP|Jrr?Y9H?JnF+$2T} zcEeK3m9h7=z{}D6RYi--M=|Jd@8qI*XbM;Zpx&S5kH(2B@P{rO27ioiOli|xaS!Xq z+WAX0VZ*8-Vc~eIxANdPFx_$t1vR zw^)CLS#Ff?#s>(yO5m7EPchqH8UezL8U8eM;rvdVvRv;h-`Pom_0zRgAderDs9E-$ zYpNSFBK_4T1PCQ{whlJepr-HiyxE0)8lgqIbWdtc(pr~xu(a(w$A)N&BZ8mdC@hpTIa(&pR(HcUsQCfWMZu%sR47UThWoAF>6P-zJbY0WTr{b=g zM4&2zWW6Bih?i*_cgkL)chtM?O5t*5;OP|y0agP)X=?7K?dwy-0%ERD>I5zMnSW^6 zFJR!`ll>(2FNoKyJz#oK8$)2oGzFO?x}o|^;2J%30$0jpzGaKPaAjI)cvuNnssGD> zVgTis&O&+ZLTc0Q{1H@KdNFy6Uw(f)+Jk7hm;V%)EpX2ls<}>6p!=Js`jbOdzQa2e zT_-b&$b5L}#>2lOX3Q@_L(N8)(f6a0im2|j{}o30-@wwcYz4!=2GRma5DvNWTz7@N zbt6y*=jFHH*RCkxw9CUfY3A`OI)zmXe{roeP(H^TyP6NUr-Ow(azjX)JMaF>VtfG8 z=z~)QEozkYJYQmCMf~;7;8RW6UQO{2fi*)VEc8z>0ZuyJqQ|5K=^kq%pLk#8NGSIY zN~-YQWFBl0*2VvrX9hLm4fo#s9gvA!J5MpiSClURY+IXO3nX4G&m~@@uNSle_*3n) zD}M^UTv>-~7BmN~40-@;gHX6(+?!h8{f1KsQVjhNYRocwZb_6)yd z`kI;FYV)Ej6v`A3snN1d%(4IK(2ns0;HW^E34Ds1sGvm4{7sy>Rl(LwKk7{o^luyG zg38iRk&`W!lEWm-T6thC&{wCt_KulM;t1TH+{`nkF>=%Wy|JF<1Q-ZRMf->%aP6CF zYpkw!S6ay+2_KOm|{+odPjpb30Op!fZ`*Rv31;y!wx8pn$c+Ji_TSb5EqS%0}y_z=} zIiTQ(PmZ~AQAtH8>Kwcy$rbN;vm`G*fCX-gZ7Mm%{6sNM$a0A2GjRCzXzvA$wBe>u z<0~(NN_~u(=r94zw=B%~{fp+s)4Ys6fkrR>ZFtxfbA9Z4>CNQBe1Oh2US%^Vd#T@> zZyQ4EaO5FPm+fm>ak1U0FSvK>qEtsOw;OWgWm=jJn}4Bv#m;NkB3FJZGu z4NC5o`t>ha>y!EqI_wC><;RN(#(P-$0j5#; z>qC$Iv*b^g4H)A^<}2Jpr1WqnY%N?=no$1??18ji(bnP`4IrF7AaW|SkA*zMx08uH zYN3ZVlVX)N_Zy-ogR#>QRd@CE%^5XEc^@lWL56A(Q`Wo3 zFWmIX&hKebip+nLG{=J)9E>KFc;rrc;vtX?W_+|f9}sh*F0m7y-LJ(kp#~KF4}9Cy zMum4(?oQh!ZnmevTl=#~C12*iYiqyAxsIb6{j9xsfKAJ(Sux@#*6!$a)qC;LA*%P; zgNgAHk6={qZ3Gue*rDl&EKg^#%1=Dg;S!@a%<3MZdbjd0R4L^`{pX0YA158vQ>-e3 zZalc$+Pk*|EVS!|2y3DJ`ic6$#Uv z_YmY>XN+Xnh}eW(?+MXOU))=%pkH>}`Ouc7oeHzyN^C-RD4mw*MJm>=x z$0L-4j^gSCH9VT6mh$RUfU=5AKKqtoj6>+!uLwOlv^vN?HofcZH)6W%u6pvm!GqYT9Dsy=i5SVjYt2J zjN1P4c!3`iEd#6i?5>ri@$vdlp|iR}L@p*St#07j05uHvsRj%U69tASH$PCjg zgbS5<1)e{!g7PS51Ca}@S5Ep}}cjeV(JQE5+xVC9_qvi*1nXa75f@mh6 zq!i@T5xs(Lp3sgvR^cO>B4}fD+~Xrk*2+j^VZ!xy({yv!rbcC9?4Rpw#7DzgBmB~H z(V@FmPq-2|o#8NS^}4c2xx{u0bm(Y-?9^QAN>z;7=$C0dVOof zXIi5Yij(;u%G6rp`zH$>dUP$qp~R{-RdvCJuQVi~lx7ur!jOa*5SCT5T7l&@Rq750 z7@K}eVCxR*a%Q!JATWOf-`CG|96Vr&&L7)^Yj18A9$-Ux^+&C_F@1#;b55ExyYZOQ z9dg!kjW_wihr!02oj3{weerPmh=`J{oSuu3QLFgbyE#~N!=3sWwt9hk;=Uw{#AuRJ zWqSj>uc4b>lXt;dBMZW6lbEx7Z%Fy4Wr-jaBBA(c$4As;T9c!mPrPCFe~`EKWmZx( z$_NjdtaU51lf9)B9~yIj&;0?kLKGWvv7W{Os3ErAclI3OK+oOYOw`J8utGiDbxN^L z=iQ*A^s-Yd5ejM!`<%v%bd7?V4rkj}+jv``Q)^@{pcJ9?Xnm^CLCufehft9C(xr@E z%j1uV|KORb0a%8%Z}Y}vkpuaf4wJH!W4IQV+#!fer3!a2m9bQ(3G>JSLCuN{ZA#;| zBPm^IS@?RfZs(F6^3M{k`t~M-Sy{Z!h zT{UIqBL@ul1s$TH`*WM}AB5%?M$-|4PJYj68tb2pwjS!JX1ArS4GeCZpIi!+s=O?F)GlSg>W> zO2|Hlxr)Py;;D!q-=2-u6q)Ec<-&eBf>TM4B zSGnxa+o+RlP92!EB@^oIAzU3h`#2Ir)wM=%v&nx`?{)@jy869OQUff#b@vA_Rj~47 zx03xD0k&`pUcZb=Ac1-nO_3ErmU!zpwMYFeCqm>Ib6m|gRrEIHR-JR!5Dt+pXT3Gg z0qNFynx)gnq`{{{BkL>&n5fbbulP3~CE+xQ$*7Nh_1pI*1iLVAJxN9_-TwMF;VY;} zU1+ZOk#3#CYwd4dGj@{N!nB=|A(rt4vVV$!u?bfMx`aC z1qOx^0qO3}p+iBsq;o(zl#uRj7)H85TIp^W1nKUEd%)kl&vXBpnLYdLz2aT(UVEK# z8YSXgq6!VKfU+B$3x!3^ijMyq6 zaNiE!3j2J9S+qbrjAzoU2(ZIhSe`v7ygU6hYV2?_jUzIw5diL426cNy^?td^xSLK8 zV73yqDx~woC}6eMR_WhXF=ySEGmAQ%WlZ|8Dqy}v=FU}Gi84wj7rVdvysa=Jl*Xey z0-L^~FldbL!>lkB!i1r2cb@>l69j_OV$!coM$8v*O_->4)ssI60kwW_vGS}-hN>bj zUYSYf{!j=Bk^fMS%WQEbp&DX)Ug_mAQEp(?-BoB2$Eh`4;L8?d1j<&%rn4#sz^zQ5 zg+%S#D0A$UQ$0S2+I_ZoS#--)kV$CL=N#njUvw&%lgUNwFNj;{j#R@900N|H_z$`` zK->TUtp*1gPWcVKpH1IUWAaiHEfYlxp)BeRx1sBroQ=4rFOpd$K2@|tjVzueuB`wv zkErQe8Ts-2Zq8TM;|i1oGuL9OCsSWj0ewiz+?0r##6@gbe|^m?>aTf86t$R8y!i(n zrN0mG&fR-yMUCpy)!3rax%b~_K|mgG>=#XR^waqsTf7}6#hU+ImZP#%R!A0Dbn3N1gneU+E&i4QVTPYwQdH+$Gmhcka;XHJep6DQTPR(y z*&S871E3m+w2rA=-!9FnIq@*NMk5v*M>J@^m$Z@H1%NejX3KBgtD_9Wsn}}c3>xoe zzER#U?z{+_O1B5L3FPSVm<()hBrKZQbN>qV@4y=8c_WYK6(3$AO%h$OAW+S!AF{wU zYam;oeRfWrrWo8aK>K<*)+`Pez#L4mTwjVNqx@*F%asO_vIH$H@|JV*#o-}SnRc_wE;}6 z-&Mh=5vSiPt!A=lv(~{nU6H2XvP-QR$7hJApiL&n|8)0>eA#9zt2`_JiKx87N|E+q zD{XJ&ea3~CXR#RuK(AghsU%<8Y^8|ja+vmYer3m;w;~ ztH1M>?s*t5%_j7$^rHz-W9H-=RpSFv5Q~Aeq$TJQ`aSG32RWx@Vt^E<{e}F21?Rl1 zL@fgev?0O5@ZOb1-S4N1QUU6Q>c59ZG!;z?lx;ax(_p=ca`nJ4T}cU1>vu3(e~R-h zvnbtGq03}j9sojGdG4OP|XmP z;HCUJ&8q#ix`gJRR_Pg=dn^u}_v^91H7&uJ$RrmKg`&$2ogqNbYQWOJN;<5O+Yg`> zZB9vZC$myJqCl(q2k{l}@$S=-1ev?oDw1x*Qj_>5zaBENo4%~Xal{}U=x1XoQyR6CmGDW4_X~0Ok0EYtT-So=l*i^PH+fC-R$d0` zAZU|&H-9U}UB4t+(J^=1nZ|w^bkr25hV-y@`r05B$k6_Hr-$tjDR|HP4u!yYjDb@D zsRu(~y@}?N{;6AcOG{fIU*WX9XuW&CFfdk9FkGW#11A+AP5Kk2=zGt< z>U$&~j&B%U#a93*&vsw~cXYAwXesBKb`Bo1&cahnr&?~`OCIu?jZTN&TIFw6%dcG^ zyJr6a0ePuo`KQ0%xngOr8uXQsaQ0|GFkQ63;#?VK)PQ{af)^M?vep~_7kBK|uzhL^ ze#A~YDhJRSP@{dI=jUV3{!^!Hcs`efnNBWcie=?RnHs!hBOstx=hAN-3}ko91utGS z>`pfb>`WxQ?F-DdD`dzGZ zG1SqBW6$73Ms`@T`%KH){$Wh(avg?Ghdf!d&`#-q?BHvX$^lrHfwHY zLh(>DPye|`jk;#ackgsl0laB0+Rb5# z0;$TAIK095NXmiPn4el4150ks2oyCgmnH6495qVOlnr_xhfgUVkNR{ZBOzn{3}_3t zb{k{;tgMTBHc4xn#BZ=xH8%K7El<1syx@6^tZ@c!55<8JJMPEkC@-VV0zI_r@GRg$ zBLAE4oEy z%@8%=6J*8`;;q+<-jK5C>!a?v7U%R~6I8_lT~M#s#z}L?jMHurl99DfLyh}-DMi@G z|9P0w4EQtkGPmT;@`pr7SUzi(pcmqWQTtvXw-%|fjxTbw*Fp0Az%O=&A`w0s_AdRi zlMs*N48&U4_K^MvPr-Adq<%s#QtEe~s*Vch*W!j}niUOo8Y<$10@ze>+(}+Sa6THJ zTQ&c}r?Sc{%7NuNT{}TvHF=CTQn#4mvtLWB>H10fbgp$V6`dwSgtn=3k@RUt zJMhER`#<(wRXQJDzDB{0D~W9eoVbvY$(D^%=9_08gnJ41spxVYqgc)osldX;Xo)L= zwR+YyUd?ET#cZxsP2@)5Mk$U^O+5Q|gV65H5oVSg*Rxu(oHvAMN5#h;1`StkQ!2TT z@`%)tx@xsmD7XkHx>u%0ud;^59`S}~u3a=qY|MX_XX)TN>ecewG1y`#w#fE~89IR! zNco=>8AU&61u=ClV9@}cJ8xy(ji>0MZ#|Q0TdB{KJTBCyrqGL`$d?0^t#JO0MNhjDxX!(LFOt|G&q@p@Kb{gDrdDPnzq68|~ z|Av`||t|71<{spq9Ev{{mie#HT8IX!91bZ=7Q;!^# zM`l^ot~cMIG3Fz@-LGcfgr<@Tj?-Z&ytKv(vYGeDgvK1Ndt^CNw#AV^zr(ueD|8wp zzs)&@2Y(4YbMd4q8OV|T+~@X8I0>cO4|&+h`W^WyjM)ZXm=2&Xkyk3QsFkJTJao$ zqmBv!>Iv$q&kTRgk9Hh6jY-_wlk6#8F;pbt*%5n($MB2vCRRJ&r}?UKC6Y(dD;i0KR#H93BIfnBWx-GO5?`VGUAyeocn!E6ejK>jL-810k3 z>}YSGkl7D=KIB><3Th1b=|Xdk@pOygBkU>h9;eyMOYuNg0x?jt#ur!DHzJ_M!uB)I z^IJ@yLn0l_i^hWBvDZN}&VtcMNk*HFnrDN|Bu?`n-mJAJuKYbT8)@=Tu9x_^n#uD~ zpoFg*i3(ty;P+G6o^9=5UxN`v1N;k?UDIicf4w~g3#?h>5@Al{!BDQR35Ei z`6uDzA7yRc;f1I0tX}8whkw4VZe}ApVw#4cji(I}PG`<1HYoimq`<1DeTEk@q%kQ# zG%fN$_J^neQ@!e^7d}j_7%*dg!)ly4ob92};@iXQ>4iCK7H5qqIB|{0ry%FG;3s&O zsQz6)uclr7Qf%Y45=5W2c)H70EWMr&4m#`LU}#Q9C*BKT@HtC5AmczHCQ8or*~}W5 z;H>KeM2G$MG;N$XGv|1yUh~2L7{l3G{4-IY1tEK%Jz5xTL%O~oiGD^q0RfG#w_(0} zcB*~eNq~R8^0fas#PiGt={J=4i$zJyIc^~r8NBMk)X1~o`A(%wdxwE0OD;xWsU0B4 zgzVy=FZY-{2|doB@vd^FId`On=D?^*KIfQvLM#ZVtmu{Trd6wMO?Jo*x)oX^QPl4L zP04AgdK2zKOJZGC@v7i_y8y>s|H$yp`!TxjQ7FKGV#nQgW4_sRcShf$$8YC#o*lYr z^O+WFDdR0A_M5uVJPQ|}FA8%>d1cix#3Lt8C91AgMl1O2Zu#Y9*xf}}2il&xkDidj9b~|MSPtozU27KR~YY)|Gq5pGM zisi-^v|BnB;f0TQ_BH*ULP}_qG9_b&2;a~;*@jHayWq~wq;g*#^$Baz$|%mUS;Q0Wf8FytX!yv3 z@D1&F>(wu3Box4seel(s*biy;b?3d8p29syJul=zC%hJkjI6iW+l|Y`bk+ZTQxS_S zHCxA$^1(vG!jUTHJR8Z)&KL_4qo-0q$rXF_hVF5w*wd#uT3E{Dp)%6Dk#uxa&QG`T z#DtZtzVz_cZP6MG*t(t_BCnkXIM@36rrFpUcq`Igx#Q;FXtgLLY-_g(4DlC)MA=JY z8m#MU_{T@f(sMRZ0bfy0-IPKrQ}+$2HheU^VQ~l7sTs+l^drt~U$b(~7_TKtEwi}5 zNh&t(Iu)Y!dbkU8Z@6Qgv)LPZ(pZCg_Q_2N|C}Q@a-TH#%$dSSWk*zS_O#`t7%b|i zQ+J(q8tUhy9Q}KGKGxZ|@35ZLQ#GbA%G7NHRks*#39~#5+Zwy4=|0r^{Wc?}VKru= zYNvnS9)}*!grvg^l!S7Xa+e}{w~Ta|NR*??$8$;f2u>>H&gFwet=e#Y4d<6MV6jQ} zdvf|Jf2BTGkZwhb&RjFsQh|O<8uxOe`_=*pXC*5|#cjoTV5wA!;a+-da%7UYT>oN{?se*| zppnYd-Tgeq^Lc_pae0+~eoR=T=V=&jB}c2h`PDSMjeCrbJ{fGLiV8AU9^tFe-uh5i zg1aT0b$A?T?Td;hr!gZ4fzP^i?qnc*}us^zl&O9klAk(5PfaL%^uf zv*JATHiYW9Jkm@@w$_)WziakKA68*7oh*Rl%}DwBk@AuwevI+QY=X0V*x7Gqg5bsQ zC2}d&%YDUyYH%A%qZ&zJ{3NW5i)qq2`w?KT;kkCWr9vUj3!MN;ljC`H-C6Jx8uL1v z5RJ$-ug|-b&iwpGJ;(jwRha9eDcYi zUaPnM`5l40(sTU4vdtQTxzj)1k)QD&St^KFO&&7@>^kK>Sy}Q{xE_oSf0_0wWc>On zW+F59aME04YmvM>bd=%TmIdy&;@jn2!|r2$V9I)HCx;s&a<^#gW zuB^+vQ7t*Q6}oS4Prs4}o}9JO0eNt9$6QVp&CYLy{-h^}p|S=y28&)M5xArnvlFI7 zui-@AHw}Mr1m0IVyE)LSg$z~sIKia}@}X@NSo5x84L!VDz%Pc7&1hQvHf~CD9Oatq zka3NRq-}Nop*tv&SHa#os#+<~fWc4IGT~7{oa)3+mwP-N@{R`F&wi4fdtvJE6>3D& z&2Uya6H#lPBA4x?)H5pC#$&&5YE~B1VrMR`U8=K-DfNeu1jn84EJw<9!Rv%`iy97E zeU+a(*o0r!!Wl^-Bd&C$(F~g2k{Is)pYKGhrOims9l&?5dIW=2P(k!B*l$sboYw6t zZr#*I_$s7oY|37R;CW^*CwQM0RU4Zk8QT23# zt!lhG@Ym?%DRSx@U3sK)@{U0Z9f9}A3b}LDp1TT#`I_5_rcyMqPf|Vt9&%Q`uDM23puJaw5fnFmx_5&9F|x$q(UjQW zC(4`b#NtZNFI|`VwL(y^`rS;zsOX-)sDjSmnljVxuDLYC<*d~2k;rsB2r86Uk3GR&qh- zP@|a5i<`l5n(C2^8l!?K`i5G_1oDJvVuw&>OiyOb2&{iF8ee^3}+tnGgp4 zD>nq+GKcR)DL5b>+tV3mwNZl)-i_-%@kDWb9|d@AKqZFM!3I{kTmbhTo~_5hZ3^&= z%)GpDN}sjAt96MIYk1WL}i-rE*K42S1T&d&_VsX#0= zA791R=EpTeZRZaaMVq><`qR?o4#KO_*T1ZPBORGjg*yp7zlvzzE?ljv;@b*ZyHY~U zbsd2Vh)Sh97Aw@OXwfERyc!H$+R&;e;~lC=Zhm<+@aQj*|DS=b)Dgw>`8<%! z!OM3rnWURJ?W;cN^uN;dus}HQV|D%ejDUwR!y&s|Wj)nr1uE?rCLpr+kHzD1Kxt2Y zHGlM;QiL0k|FC6mby#D!1}|oFy$DJ}fYK(P5#N90<|-0bq`P%pX$?DPy&Pz4E7WaV z<7ln$b+t`zTKyJxsYZI0_#|c|e{%|yLg}aZde@OK4NY`LVP6e>ARD_C&u5elE0w5< zqt))Wd%b8St*gaXPUP(_HZS>()sejIIO|7 zqZ*^mzB{Gnyse1@E(3;nd1x{lsTIz?D(>Xbsf)YNf#Ypnt&;)ZCZe$`ij!MmoD}ek z%kT!wB?WBZ+b~1tbV_QIGVGv%qyArLM$AI&C-4u!Kwj5cg&%t|!yX#7Z`zvkh4*|H zd)k@_gm%c#&Wr_H?!eaIeR*DW9o+zPUu2~vph&W_{4B_86p+K`r1(tF6~(~K1Ig~! zRiwGK7~i3LV-GC>d9C!?M(z0D(#CF?d3}`eMNVuWUhfzPt=lf9y9xGBrv@+iRFru zht{~)t;#HLGlJr9j`v8WyjgJ4cKTvM8`qT=oqi-~@#sAupg{89*K(zij_F4*Ql#Xj zi_0Y}#>+AnDY-G8>UGy@nsaJ;d0O+|sp%ija0Fmd)9nn7%sV`TQp1s^vFXcA5)8T8%-k%vkKM_6L$%22OjV<7@%4i?UR+hBp-3UheZjYEnlgg}?TH8z_ zh>z{HFC5f&5dRxk+Yi{e57VgN2zPXhj9Ua_BFRDrVha)&2Zx zVpX0`rkA%DY`l%4h7e*FKk*>eO@fePXNS;Hkql~Myxzy?B02%?Lco3Lmt>#%m7~f- zjeXSpt1V6zaSF5Vl+DN23hMs;z*Bno<5?!$kiWpMvRVd-TW`C~Ul6P-Z&s`#8Gqc` z_&Omx;XyxF7a7p-hi9YMxKt~8HQ1H&fTc9C^HyVUiW90&Gc?qhdvgWm{TRPi(mHyZ z-9L$-c`J8t#?Qf#pWS-T0n3a$$6>$%isAHw?6g`%30Y~HalF~*V%|POS ztEj3&{WZXO6+l0HpdZjCu8r%?XUd;Yt&?lI;6695UdA}|v1Lz(KTUW`-dccKJ{ zK0>{%*yzYFHJd)?wjy)6J@{*N-Te#Tm(2^Id_(W19Z+nz4Jn9HWx?rntH&&0VWl(# znz1zecWNSYk=p}I;r~yon%K>MTD3a!JvHHBrJ}-yXMnWDXB5`2{7!_Vi&hzBM^A76 z^KpNh`k^Ltu*IoA7JA=Qy~J;3`_wwt3&LWKr%?%Id{IezY_W8S(RueKzS651;kZbO zf|h60*4R%02U$ZMr0Pz7HL}bf<~`yraT7ZU9_2W5Wbox4%6D4lY~10AySBX|kJU#) za71z%xA5C4WYC7zWP;VCZ`dEnDmmogzM;ZV2FnlO$XkkdNK;vxrmA6<1Ad&@yv)Nu zVir0Yiute8HJ5^_>DC=+aoUejbC0iE$zbb$q9#t1;JxMSaL^7-WvaO~UiKpoEE@V^ zP5kw@X|Btw&Yi3lZfmCyQc`T}9hSOM(BCf~>ZQfRaMzVONObCWEN0)N#E6rAv?!JM zf`&G^z$L{>`WhSiYm((-ZiGtnv$nJOwJsXg@$mqCr%v znmywOtbKDqJlh;Kk{0q)@X-A5V3SXfxD4uIC?n@%5pCtk>y!}J;~?5dQD3Lf;9x(D z*R0oNF-!SQ0as9-VyFM{5xFYg|IbG|+$kFB?7ida!-#teoS11rXBBv;?yU~2JBE~_ zaceL2wW9nUCqlsya*GmNl!6eJb+2f8wMcaV>p`icp@`RwzeE*tUf6=5XC2Vq9xB-D{o5T zza%f`#$rGn0I|P82d^6KGoJu-+f5fQB;5n(qK$hw7Tip;lH>zvqI&S>dtcZhV7-zL zn83E=$8&S1$t+X{EnqR3Fb3>1>31Vcno|YknXn)qz30TxA$2|eqMSJc8?}u&V2uG5 zA+%E;$#k~wy<}r3IUn#wAeR}a4)?1OFhCARCM>?1&ALV=f@r4ufdHr~q4IkW`m>@c zNGk5V>;MA^>;vIwKjoM7 z&LibFq-eR(@Xz~xL+am!QX>`kilHHZr|1Arnd6-1uho;~?AXRP+S9<(>@ABmjeF@i#If02>=L^s)G&=EfZ_-G+g8 z52}qD**57d#|cHrX=FK~qM)NO_*qa%OR)mmz_-_(l|RviLvsME~u5<0}QVEl4LpT?j z{0`DYu(da@@%3XUgo`W3V*Hn+K7m)w3R!gAhr{jS)y)gNsGtIj!t|p&a#jSsDkMZw z>jDvE#B^~GHY$qCwjK2RG1E6sMxM{57Q;tWF0>wPyauk;iqq!iS#*DS>QL-XSE#l8 zc&VGZ5|Hpb@XMUuoK`7_DV9(9IDm!@3JaBjua(;B=v3|LQdKp}3Q=JXz8mJLR6DUr z6G$5rBGulk-u3yJ`Vk~UxB4NNt&CTvKB^a_O<=lhTg zJZ@&Hro(7EU&5@g;Pw#<&U6U3wngiI2g^Tr=uXz~fFt>MMYo1jj8J>#@qoc@g?)rx zpInX5dwtAVDLVVq=Etz4Ix<9`tX-K7p z++~iv`Fs*3*Ala_mv zXP+&2u_bL`=8DROxz}4~w7T>Qi7@~w-m=U-vxtj$f}M@VG=93|?DO}0m15~tX0C;k zIl+0Q?c?CpP+(FyYl3q(cdFnxNSxAheRHq~XdX2x+;ykKc{tNF79&QSxPHfU<9qPp z7>_L}2K|T(s>XOuoy{c2+O1Kqn1`fTjRK7i< zt^~WQP?xLq!@;WSY=c~EL+Z-U*U~AS&5P+eM>`wYI@oU5j5}B3T^ogo; z`KmaFS679imyYz|W7?>aQbU9;RTwc}>(JKdfIaA@e`55_Uwqgh?%F=^bIadOA3I^v zkgWfr>c*2?ykxNi>1E+B@FJwbnD)^8x9|bXB2o6sLr!~T?*dfAL4m(x!TJFv1uvIu>fIY zN8JBb?qw~zcCIy_rbfF@vaChSK$`N^aqCyv}y+~ry!f{9BCWmJXit~m9!m4 zVZ#FUJvc&@i`UxNk&lP@sIs_&T?a1lgz2k+B<{8N)h%6}O;|(Bl0H37%5SAm-tRw< zQrN%#V2}+WsHTpVn`BqC#U@h>BDR{ifqH1<((`2h(jcJBt5FquV(HXmgmOh61C7k0 zq26vl9kam@5FX;82(XtHt4uaxLZX@Z4vq^iUo_vmcE8ExPtU0!yDat?a_xaT{m|76 z=6rmLa5;`Y^^C{|YG~8!$Pd6fMd}q!-4|1_7U&M-qiqs)AGnTc}z|zU_RJFuk#o z_Kp|!J)__kMJk`JHIUeG?E<2G8z3QK7nYs!+jhW-T;fZD;jV_fOXKJ5lnyL~QBA&W<-ai$}2u zZnpK++t!PvJL9qKUCfL>f{DC*Wmt{{d*-X8E?k3k#mu*{EkkbMDH@$})4Y49g6_Uvr&R)2;3ps16jw0t>XhZmq2kT}SURQ<3}UG^`u{g11=y<yJPD`9+;Se_YUK zqo*RmZKgc#XY79t4VDeOpAJx-+`DyyfnQTX+hw73HBs?)l4dBY2$dY$@Eexo{|v;R ziz*mR=Ba$?xqEorcOzKGy)HlQhg8O{cbg2xBeYb2!B@#tba;D8~>6XMA?t1V=|uiOg7rvXDDBpVAxuzD&Zp{VBFp*#7?I}4nWNnGa;jv6J>W|2~?+eYCBMTIDA2;PSe#*jf6S;Pz zc^Gn7qVccYLDU5f4ChpBfKhW!AjVH$Ro^}rOZAr2PD%;zTdj0sPQL5!fJtg@K`%A% zQQZuECdqNqVU$NFt^wZC%*O{qbWj~cb$7^G^aLOE6f?bR=yL|$_u+WAL=F1>9_;}E zwTg|OB3yqXmo)aEy}#y?*H(WT#l)9HyE<(nv4c=@GjxK(mS`k9Wvjo&_rZ_hd%p^u zeMTjde@w>2Z(|##VI}9lrIa?uJ6t?@ErUwiWp8m|$cj5<1+Z8ycoS`AkKJq+^qxm^QR^3}gMl?6t@VQ~|_hBTN;n8cqj zKZ;P+FE1KVTKk6O<_8Q@pp&(JHF??Ga5(?r8cdJTvM|kif^KjVn_208hYdS=YtXuZ z+v=b98za|*#2cwW*Gz4`qEY2VvUsFe_=)(~d_!q-MpE!7*1+mbY5GF{*-kT^>P7r1 zMsAjk;1a_%Z;ZOv_)ass!Lq?}UoCAvsSH!XY4YAs!lxGpGZjp*J#r4?mH$<={KnYY;~6!ps;) z#gXXyrH;TuB7TMbcc`3T?igbJdd1a!D9r|WI*SYeHppk8dDGf5ft8nyv_#?{EM9+} zX<@3{Wf~JIzpI!^BK4;(LI1Vq=#O;7duJP-ueqtDOTbF>@|dcE)mQ8yWW!T z+)m02WIKDMKi0gHpkUW zuPa#$UA^QIbMB^rhq=jio02wsH?Eg4yQ1UNQ)^jibEKKzQ<_UTOj#SwUEC8~p(8;e z*+nPALFP7hrlL&;S8v1o%~dPa)hh8$LV5F39VQGnh=w3{{POzmkbZOi`>}V$__W+H zz7g~-?o3|h5=z=bch@MaFMnHgX~GfMOU8-De?!0%-?g6Qtiz6FD2ackWJb6G&z62f@6N?<5PXhOgNlf$ z7D@ggK0P9$OH(l^YLAKkE5!#m7k5L~L2eF%t-*^-N?%9*eaoCVKc@3#tyA`SM^UID z9#f|25J3lS!|7T7hUR!>l6HKtb%*ecdQ0It-78Xp0zCffSTDwopRWV2;>PZ{UGI*h zG2Rdz7w!?I#a-=Z1FOfe`grM8->;5x$E1WY{zU1ngh z__+3zs|p)dBU|_`uxfF|M{*31zwzYuF={oLHzcj(U2Sk@zSOJmc=wE~=Y48+kqW8_ zk^8_~)m`B?C$&nOK7^fiN}a`}sxGVCu@(K>OwtOQfjqbINV=CV8*1wAGEKM6TW%}g z?(d5--Eca6J-oY3OpZ%%o%p35$pQ!c+ zsYa(%-LW5cvp6~=o!b7rJEV{QB0$N5NPksA(=lTHZ?(x}sYW5tXJT+KD{7mgyu$F(NTMN4(f36>UYh-!M z%Ae==kglZOzH>vW_q=EGl^&?z&%Uow|5pNCFxs>s`*n`^}gy1Ti2K2k}7otGQuPLhBz$o0uq$Pa(y8+DhqUrc^A$d%Fg zo&oi+oH+Bg)1gCGB+2K)RxfndJ(~G*{o3CQvM^9C#E@0vY6v^%$nS7@ZDX;X?%5>! zlPv~Ji%5NC#n5qR-U;0Hv&kyQcVK_e@!FJ@dkt#26tTIpdf&+g*Y*y9HCrM4u;gKO z;$nUU$2D;Lu4_?t4Sw?4f`nH&{cg;gWx=qIq?i}Y23i#P?0!{_pfGu!7rWo`wDTA1M_n0JVqp#h?iDrQ(|}lu_CMe5 zh~$LUQ~;&9&mAtKoh~mrW;M`l){ztKH0!cCD+1o1R6a*y@#c_G(B*C(B%JU1Ej2KG z-JOXIyFpeuIxNcexDfQ*49f-2PyYkn)lx%yrweY!tRR}i)tcV=>d*L?J+HY{&3#`T z$%I9#hh)z1%lWRxQp4!V?G$iNuJ>N|(@c`{vcq|ezqfP@9pM}QQpYz3QLH0=2W(L( zTj|AX&VL89*|g1O`8CnH3zLdk1<*vRuX7hrW}gP-E{#tcKm(!8adzh2ydOCRjSV7jHAJ zs^a(q?nWz{2)hN|&YoK(MT{Rllz&RO@l%+qbcNPGMFlomH%I)Q*ht%-igO%kFntCc z=WVuHh|E!T1l}t!#R^Vx&{u1Pt-2f55___c_v@oc*NV%EP_`Vu&a z-W5@>oIX9(#JoqFgIXhtxhk8^f*kpY%+5-_pElv9BWICUq%ZxMh}P42fXVsK{f|Fz zlx@bt!>%j5AZRQ1S~6dp2_O^DMYP1{ml}4$pCZ1K^`#~M{bn%VVQ|9~FLXaChq%e7 z3Ww!x~fcDQtu$PU8f5SA@}_^8?Es{{LZM`_0?0S%9L?R38|pn}{h7B?Uv|8tKuz`ipByNrB0_y--nX5PCZoTyEO z?r*g(uT?3Z-^ZD9O^KaFSMqPX(Y|Pxm{XjQVW#8@f^Ubx$<3GCP0(eliklNLEn)pt z#Hr9nvs5?BUb?$v8}0tW?vmu_Ta_v+Hk!IH(L(3+9=f-Pw{OioU>wnjA5QZSx3IX7 zmU6ggAr;IZoaN;;JC{uVr*e1h)wp?i`7>71)B=K}3ym>)v|oD5gUI2&JzE3dyrRLx z-F|J}Z88g{9uTG;g?Y2aOno_&^ccB;o(p|4W8RG zlCOz2r{%5&48dQqd~Gejgf`{|51~>R59P4q9qHc#&v3Eing4U|T!wxe_UVAa?nAJFzQqF4KKC#2(CnKiF9_~qzP>3fV^T2Jh~J!rlXUv?E0 znQN8AOme(&vgu|G$ju`+hN^IrQnAlcnUKpN?|F7A6_8iiSg8@7ugMvUHX!4Puo>lW8@2Wp}ZkXEOI8-A*0M zbKHz5>b%f7Eq7b0@GDL}BHJ`-)*YY7RGYqJ^>UDhiWUZNie2n+ZRQGzHtw%GE@ke7}9v3Y?I)nbbG= zG3;AQVwAfByeTb0t2C;{CAoLowz`7`r|nAG7rTO6v`<-LPb5qG-qFSCzbt& zXe}hiyRB@sx|!iyOxim0Z(|~kG8Q&+la5D@bTfj zs2^TyZ~JL$2im+S)oNjBf(BUOvfNwztm&PKDf`-yo;Z-y%gtyJo@aWeP%X@T?hns% zDi7O>!HR^)uy|*hrD0{K?Nz%U_#J!n8YhnWnk!Qy6&+xd8)G1YtE-RQF_ zr>WfxHw2p9jkU+eFMU*e{IZDq_+-%hEW{mA+)7AC)!{AM`J7+4_4EpUCpB zp!9#&4qg*Xh;Ob|uTHFH`TeoZ%)AuWzt-3x#qKuR#GWADOS_kdVXdGXM`7m&hm8CF zM($DrVSqVhmm8&kE}?CjXKi+!ka`OUC#LkAXE~>wPo#na{&^H`mlb*#yUS19W0gt@Odj^-(4Gy0C-Xt1Ng) z^XY6Ly-y3bJKGZ}SD%}+CDsB>wUhf$XOqaoYfN

    $L-pn{E5v>Fp}6oVN~Zg*|(cw)HpJuHHv$mzujlB|p)v9n-%#vEXd{rNi?2 zlif)wr}%^PdafTZS5V1 z`?idu4D3PcxQ6Y4nn<^sQF$=xLpo)KrP|85JK;my42@!Q(vhz?s7*dv&y$slZn@tO zXwr3*ZTpyr={)3pOYo;Gyb%#ZmKMJW=tVtNo??#k682m;bPRlOyl%w;D!pSkOJK^< z%@+?j0Ew$*mP7YPw;Cpn^b^DJ#Z*$=tjUF>Rs}shpl;jYw5Q-`7(h7wFR#;tTFOhD z6`Lg16G;!`-_)3R5`A_E9cj3#M>z)BiQaG!kz+*JqSt?U*q9LHl@5Am4l+iM@&CR! zZ|Y8&@^-+7o%tU@3GR1O?q~Yx=@Tw-iII;VB-z&D<2WCZDXeo{s^l%Y3>t&u}ne6vkrX-~`mN3nOAU(F0sro<3Nc ztB$EFhok>30m>&Y=#>C6|IW@KjWl`7!?Z*e=={Pzfm&>u`Cs~6O#i6jv(1~)0@ElX z_tG*MB_jt#|0v<1lc`l=>HadB|6zTOLK{Gm7DxBL?cYzw8A}AmV&ro{iqMOtl5@Y z|K|In2Se~t4ufTu#&^Xo$ZT9VMptz>QHO=Z)9cIdJTYY&Ef(+}R3Zcqn+{EtndBXR z_|ZPG*tLl&${qX+a;c_$T<#FiQ7rqvaw4YeF%k2yY4vfpswKnIGum2|ET2$;r&qK* zu`S6KkV@3d5?>q2df8(wn&JG36`N!3)a})KvDorYlfIGrPt6fM%qJDM?ocR}&O~a= z$GMdXvcbp(hH-c|xz<99ZBw>RAxyuHPj$3g*osMW858U3WIrO_oM2&taX*{RULx_e zZm`A9Ki9?Kz-Xn9>$I1~4-Uf-zO$;|0J%v*X7O|>I?7uAdBHnGV4nK21WS=5@!hn> z1#7$zyVCF)cgW{af6df?;3|n1bbJ4@^`D~%RJ7$L-Ddp$=eKa3$;JGYsDY$Q3hSWfEev?=sG?}dXEz*#L@z0x z9J$dc3Wk3Umf$N^`QXuf;)Fg03bi_b7xQrtfzpkkaqjHAi8he=Wt?Dgh`u<8Rnc%M z@#VujSrHw@UO0#asTjS3bOW=;w)NcieVV8`1VTcpW`X)Wuz6CU(br=*fJ_;zjuG5( zPF*T;q8^BL7E`*kZ1cSlTlq&Etbjvza1gsuw*`DR*Nb>n7=iX!f@+PI`m3LZMZ}!` zIdwPAl|xBA@@jP6b-X@JmcpyR^+bOx=^KK&tqFKv^8MMbTG^#><`9kaU%%?ke8vaT zIp#?^F!2xqn`Htm$sHZFuO4>hwG0QFZva9XSup_1SZDim6nj(a!*La_9ZtEBzi4bQ zmV!bxZZzUJXK85lr~WM}T+|0eVI9TboYfWL`5oStugUG_!m!;WhwP3HJkoz&b;3dP z$TVKcQR#jddyf2-4)}E{cM0l7X@gId_wTGCt3K6S^#7shx&xv7|9H#ZWMvb|OtM!( zitrWZY>_QH#91NEjAUgMA$Oe3IV+r9G@QNnJlolR&(ZHc_j%slpZESepV#O8JP++O zHi;OwJzA5VXR$$b!Ye1tA!ij!~Ov(OXdKKiKau-u#jJUtU~@kHollsz}W+ zrcAkR|B2~`cZg`z)sUYaJ^OIS55j-pMQ&s6G1^Ess!jzay}HohG{Di)0xe#Ni*6i@ z3K6T67n$kLO@jqTx`C_*YWD02cKm>IGiWaNSl*+x#5;bvtQP>_bRw}&2{4)UfX`CB zRx_OvQU=dSE7@zE|IzO1%s1_w%Fn zrTO(}rw25{>adeWlk>n@gO@u}V$k}88}0fp5k9LTk7%d0yV*cKSb+|APbPQ$u+>kE zis#OeITlb#+K)gb5Bxw3cE{-dHM0$nSrE&4KOq5_W*CYaOFf?rsqrEmH-hNMAeTYSp~n$l0W`Z7uKA=uk(Xu z<}W_9fMeqSxW_2e`a0(dN16kCj$rvf%>cAB6G0Pl33y+D1%=I z4o&%0ld0)$;+L73A7^5XbY4D0HLme?(?Jt2{U*#SlbuZkJP-l6s}(PT)xWYb%|^$K zu>Cl81@O-%T-~Jgu4hRPq&Jl%pti4=#04chbs#7#ZnA=G8!?j{ zhWF~BsmGm6GS{tqHn%FPDf6ttMIfiFomD$3*Vqc97U4>(DD6 z103p)kL;VbGM`3!zx1E+yNV|@lIMY5P1b#@EBWm4(HCx-qf(g7sC_R2##%}(KDoXG zKh((>{x~-AMSomP<%iGRFO^a2u6Dc!F6^eYB%gMca{^&teP=zQ7tnMn?bc_ zk(IVe`;SeJ>#Ld0TdB>)Kq_vSRMEcM^l#QDB*y|z=I4Jobc8SGPzjJCWH-?xWw(E- ziK2fEjeXI}q8xM`yg>rk(P*$s-Lg3yCtaliF zwjb|0>gi58-pqmfz;7dA$~{|ucE}{h8V@|!%=&6F*w^#`y?#Y5(FMh2ob#eBtZ9=370qM>4e zC^xvlQJ@VM((!SV$o&-^SM+}Tpuqx6`maC8#4V}*m#RU)#)RaAr%1qS4C%@r5XT`{ ztr_I#ci8+3i^geY$5O#@$*#G2Q*ZERt?^5Ur?Q`k3!%JhtEpo zc^)iW9Sf2-M?cf~#gsS&^EQz*%F=00&2)2L(V(er%4Y9}g-pSexdw&(|CmGnDtG1V zjJ?V9vLI^)5jF1pK9FpnE?~EykIa6JpzDdr1$O zSXo)qE(cg=ax?m-X;r?OQmjQOqt!(Ji`u%t(nbcer*4>S?%b*l+V&rx#wWwN(c@>b z1isd$7`yM*6m-5^lJ&08kBcFGozbWeI3;67p+dE|E%D*NE8*;*je=ZCFtsVK+dM_C z9~bN^dNnrJ+sK(Oj7)O--m8*01&;khp_jf{hh zpsF=)h6{B6;pkU{nu1LaA*8qbQ-chHm4%**py0uJAf)v-Xz2^@d6rgzs?-7dv49QN*4Nz^QP1j_B4L_6Bd}P)PdL1s_t4jkb&bap*%qYUj zePBY?w%@$E*lN4>!0ugA;h=%G=mtFcCxRa-khH%m4ppYlnGaK6-aDav^j}i?=80DO zvp5Z-(VqF8KTEq!g32JQuCJohtl7%c@%miF4~N$~Ij3p8o6K{~*o-{#ZQ-mvpsT_nx+u~>tb6TkB0 z&Cy`tt2sYAbUpMmITWaTc2BfueoiVuO^SQE{W?~c$ljKPoSRkOf{^>rHQB@mYK<=C z%+B5bm1Pc(aGu?%G4U_2iBPPO)A)}*Tl~QE+Dz_zK-+i~$&sn@ev9fW@t+{ra>}QFnjS%gQDTc`Fm1C7knIai<)IZCmRH`8=~w%Y-oj{; zo(LM&11YMf^IOWO86}3z2;Oe=@aQw>``p29pDQ|eq6(1JZ0)f^Z)G2@LbF#^UV}%- zU^A;ajUoiPPL?L8tI`(ZQ=^>9$(HJ6bq_xxb6zJoax9B(ph?esA{SPjsJV`FY@Q5| zqlj(MI~!^5H6#iB4j!+XAYxEEKd5Z8%AAIqIRhs+c*Ge4?dDZH6j*|f%D@l9=3{`pl^dqH5b28(=$i1Lu!q0)PxT&vivLY0+T9e2Rrzk`fBEVPu60O%U-&%pVWu?zuAhFSoN5onh3i0v#-jn-H3^+&h_|-Ye_0D zw1!!Ar$UH&@90MN&-q7tVMT|EZ={qTD5YKdeN^<`R7uJ>TOoZXREpx+4&7~2;i_}3 zxwU>xJ2R81P#od2ogK~$C3Xtx>j6Zo>yf@nZ^#}#P`Z9iY<+3_KZR?8Uu))0r_vOE zpQsX{V=Cbv@&n%{B?|7O>MXH+%I*u6uC$D&Pm+IPx8HNzyyKm7=s*S~2VTS>hJ&mG zHjo8v?q=8rdS9EVyT{S6g0n9U>N{<&aLYerCc+v%CR&PWe8d>=aWRyCRCULbf;u)m zY!!^rT#3T$1Z`$~atJ&NW|x@V8;Kz*hA0t`$ifas;!Bv7zh<+*;VGKA9gID~$f%<& zJyPmrbFU8(Bl(6M27#N$Q+BBK-{vcIZ+=*fI$_vAdYeY6_Opz8TiZJGGg7O?zvz@h z`dUb>mvbj)a- zLqQM>TctSb4QYQK3JQ(II#UZO-)<5Rsf!4D;)eN>8|m09i3=hU^Y99evj^$4PyMt< z{Stv$7(n_Ex3a(8Uw##G^!9)TeVn{!{gJbUiGGhzOy;|~&Mg{VPlINGzvIQ2@aqNR z5Q8|!Tt~i4Z@PXebY!`rthelMH2MGtjV2uC5$YwUneCaw_W*plsOf|I zzEtPw+8$vJ4fM0&C8b)j^~dYlYF*v5Y1%z5os4PgJT43EP9ANL^v{8ujzT~0C|%py zFji&C&6(gd2VRn`miFHv(b@J{EmhC7n53@KVQ@zOAH|VE4rnAN;oCQ~%6M}*mq^8@ zQt|5zvh*X%wOq#SH@4svAW5^AxT!$oheM%fir0S&d?0?QKgN<95@67(czkb1NZ@OY zMwHxaV>k~B)Be*D;?{<{BCeRj_$e5(3K7g{RCk8g%gH-=9;f_W~99Jkq5udP)u zSBy&17nTGXJJVTTZ&kde8kwb#r*oU8{o6MwD5$irqqOhNTPH_&{wKws7gN!BS2yip z`&859G6328SyXSVRovL``irjC>2Tj?FMn&9O>>ySpBFsDbYTXH9LhDlEBnKyM7hSM zPx6K!LxkZ0eBYA35WPSy(*QP|nK*b|z!&9NsL*(MZA#*jO|dv_n*_BCjLtG9 z%5QX)0)1tufWUvR{k-^jeCjBDa_`@`fG!ZC6J$39gg|0rH@+V*o@*hTE-e(jaxk8OUT z+POZR&qvo4thrki(_SFM^tmsc6&@Ne(yI9MnqAeahJIW?AF`yr6HtjgH1)k;IY+A! zaKBy^6aqs|0=|+D4siLdSnL)cfpFkYYW&&|@#@7;!O;7weu_}-5WM|H&0RnHv?w0B z2k^4gJO>U!yf?T2*B=%M`4hB`li*YOQf$)wT78aeYzT2u`7j@T!bgo`FDW9XXLx{w zYin??x^b)@Qu1LdMe3H3o`m^}3pQz9IZb0f%bV_212JLYuC~t!(OKru{C{o$ zME!e&Z4r~ng3+Vuti#_+`#7S-yW=!0pBT@zCjAgo zP~``36q_4d!k@_V!4F?2KI-@CRy!8s4phV7nRn?gK5Rl@`45%u6 zc{X=2N*ONmI1-Yw&RyE+a*I;F#>Zz7J)Vv6{qB`@oQC}}u^yp_HgG`TXH;MlGN zte`{EV^l#zP?b{q>4%rghJ+<@_}-Y3+f36!I2^0)91`=ANrXlRBk~p+d;219?YvM; z7}9XLEBr2RKq~7a)*D>2OyQ8=RkS)%bDdQiup>5B&X383mwa&C6O$4U+YkXTLHJRnq=^K8k6$&c_@~<1CR!*6_M({K+k#$-<>3>uAS)8g+mTPC`hQ5)Hpx0{4Lgyi1;fn)v)ALcF}|NjfK> zloRC)g!)|dvJxYs>iX>gt+3BUaU(plaX=({hfhEL9x0`s60d+SSZWPGdeg2_r~=Vm z=TO}lt6bd`D2jZ_P;Ac1bSfG{9l!0mk}gz z=R21p#1#U$dItG5RbiP+S@-_K#_V3X__1mY8UQ!~>*z3yTv+GUIx5%Ke=HaE&^iS$ zQpAz%iJfC*iPTJlt@EC957;~11OO;h;3bak)6Z6_r_B_K6BL)gPX;;-jod&p@#X@S z#Zp#tg|f2abq|@r75P&z-Sa5D>+Q%IiVb$Gfo>233pc+$fawUVretDz4P8~^#?#1dKo zVuVKGb2Kv-WYC<9b3~Yh8)qea1>A5Zz@bRsiq_0_x6%k#HKGLA3zR>nTuhX#KX&VP z{9R{bVRQ>W=V9S90F^P4yc`pIa!pg7olsQM!j+kyMUdder?qUFb=% z6K^xfNi-uR%c698d_HCM$+C%dW1k^_nRy()#A9Yf0A^O*WbxnriHM;a=65J0uR}H5 z$A`BvNul?+JGBH(inzrsL^A5jHIlJ%n-Qx?6FM700RB0#Bf89#ltDFPVKO^^lzxoP zQvyg)lfH>zRSnd@Ls5w)?ve*E1L$V~obi>#ANOvKp3AYk5DrEgUs*09koH`PfmHtv zjWPM!SFN*kO3)_Qc`@^lt8>d8pS}`E7jgeA$J}Ck$YnXDJL2 zwarKzak6U^0OMfR4|NYemrGd%1O_qxLS{W{2TUd)JyU;jKOI1<=zLsMxnv6Ucxq|z zj_}x}I6Q9sYYsKxIknD|ES~Gb0C>sXdp+y$zZ1|Gd&aK{Zwj_9^fQ=x*)A&G-vk4Y z9HmG9I6TL55OIHSAu0rpJxzP;WjY_*slaKZY95`k!zW2=it#UhZ!Fc*;9Re%mDcop zPIgSkTS?#C4bvW9Brpl&K@Z)m8Y-D&TLvGPA0uk}e<)8tm5vEX0G*5Rp7)Rv%J=j3 zabXiyJ>y60s6#)7;&^d>!>R3USk*kuIkEtCA?vFgj<-u zY{i{TzV9$uFW~Q7c|?lX-k_WICvE@n*2NQS9JId9zas@?rK3gy-@(@gn#7RAVh@Xs z9tIO*Vg#y5oOUu_%BsTxTs%LH>NfBM@Z_V)z>nLkV(l4`rhDcln4XUAFL$d5fUg^{ zz}*0FOv7vIuV;7lho=@1B#5Ks_r2Yob1a@pGwnD3xVy(%mrcwQfZ0%N1)HnekF4$2 zO2Dzj5tA>zP6?c28u~-KC!jWZp?lRw&D$b)1rnd1egwd=q7>)Ju$A9+r}J7x1XHl= zbly9uon%|H$Kj}-y&>C*c+2h4h9-4*x36Wsk}z3SYQiM~>HZLe6?A37kcs(QnV78< zzK@Z4ZUUf1hTDs2rMFrIn9-v1xqI^+%ku>sB+VeQvWEG#v{DxzL8gr*yW^_C=*Fi! zL5jdvMQbB(G*wutjHF0Sd|=aZC^)u$%Co_0e;W^hi3Ca(Ehjt-eKN}kPYf`JO1?}7 z&~>^zSSCdso2_Dj;--#IK;@WN8NZGffJ!yhyXRI|22>q>T~apsu`e887`9GKuRqV% zxba$2NFzxM`g|VZxC*!4@-|NWEYL`IA8R<0kM2SKu0u!aPKWfxx0bGdiS=~Gq>s<< zd{9TjINkxU-Uu_-?`C&~YJ6q0fL$YEy zovqgPMzH;v*W1(ySW&NMPTZK`U4vguJ?)lsZ3KH zUOD#bluyqA;IF>n9Zn6=4JXU2#*^ziyMa73P zF){6H^ww5)N11|-g;iGLv&@3NbCKWv>tt4&6ZV;05JF~g{wJlv%ipY>LObVJgexL! zK4QdlvejFfh;F>SBxYEYw zY%_lzlv&qtGvs>yVHzElg5mMfk~2qFLeh5NCPT18U`Uv2na<}4a}oW3d^xmF{OB>qGxP4@@WE2G0XQyiHSbKKX~kSFlS??LD<=lu>rlv%hqI4wCqvUa{)U zFf8mYNQfn!XE0SeJs`OTty1t?ZmQ;we%*SVz@lL@(L`}u3>I%*K0IJHGq-aEtE@xu z!|sZL(lV!$q`$E3QOaCXXo+SFJZ7PD>*$({`6_{J);L>1#_r-H=k~k6*K+bqc`)Y# z$_oSu*jOM2Zh-ez&fXnO%66J}ZlQu%OP*51Z;1OxdHl()X-F^1*mDO!B|htS3hIGY zm6sdVZ}GDd-xCWgWUTW6Dk{?x4H>}|08Mh|WakomWhilZ1I?c>yT{{EuRWzTR7Rbha3WOK`X*Ju_m z@fBSn-y@LcE;`EVB*;SQ1O^!H+OYQ>yFISG>$Gg}%u^>3=j}d- zP;X$;+V&%}Zle-l(vK>ER?O6Ixh`+svp736xjW$gOwaB6*7UTGcIM2FlPb&;j;Bwi zyGTvw@cRI4Y@Yzvv-c|7gJSj5&I5a;9s_q4aB?{rUh#l{;OuwHQk({Am-Diyj=U!I z$FO9B&J$*n63?Ci5Yb=iMi>FN&q2fuaPf$u#&3aFLw4e8iLylfM^(Yr}t!td50vl<-xY1fV)yelMv1^nY+^j39sjI(#(5++Kxay+J?)zRTsRW?d> z*RDZ4t+P}|lF5Y{Dj|G{Jba7@Pz(tmY~dyI(D_e0SsagVXfnCnf=Wzt(3F-dYB4{{zl! z6f@N25>!CC6v&_IUzaxO#XC<#C+jSe_+oBIAmq81PF7&J#OlYy`HKJv+1^c?!tW$I z$&b$!Z(g;qY1obSD9`939P7)PbP2eg`}A z)C?594?q_Lt>84}AK`S9?=CHGPh=tSwj?lOTDB%FFT>gvkAJ+happIGKfc&*b1V5{ z*cvr5C$oIo{pW9sCn}L!sBt?V*-;;I{~xrohz&1kq(2BCw}AcQpyW;gCRHtTyEJ3# z6x`k?t8rbBKP~OF`E=9BcYD|C#wCoi4Ai@TZP|aE&2s~Qg0rIM3yl9R zI;)TD2I^!fUR1)}wkxYryFjVnxZ4``P;jAwS`r(&Tdjuy}T5CH+b5m*)3>Vu89qi zl(>9>^jsf|)KgwVs9l7f6(ji|QMe#W_$s=r=`KG36b~!$KzTVO|3Nf&Ncly=rxja4 z7Iy<4%G`ZuE!XOnJB4QL{Clo=iE}UB`RY-nEHHRNZQ6xq)z$u>T_dlal$fA$`tUW; zZ)UV|D83NP$o;U7QAcf+{|5=IOSB&|rUGjl_gy=|o#*Wpohh16$X4_j-@j+*mUM1s zaYyG<`Sf^`>+26%y#_(F{*sLP^5Ku4f*dVIVS zr4&+hyxNIcgu%h>g141?xsG^N8>!2&;+BDOU^DW}uky*z^~`;Jl)^ znlKi9!*2XMxahb&b+Q+U>H`5H)&R%}{}J&*&QGoh zz$u0GxLv&o$PM$MQr*(o742W-y#lRhrl8?QIvP&AJXa7W@7O=@CA?*Xql)*MYTv5S}=LdeEjHYS9JiA|CtElw()N3q_FK1(RGD9p*6cCbO4;b=sMDua9#4mo?`w zOEFL<(~P1l$DV&b@kVHfl#26;FTVE7*BGI9o=6j6pjc+U2%$EDDK*xiSHx8|SLNKA0snIAS4L0}%E!--a| z^`niC@tza3VgCJ0ek0PWsuLv|4XCuIFZB9xr|abU;rg|mQLhz%#dd7^#sz4i*NLK1 zA2_wgJ84*SaVBy9@!F$-04eM7V=f>$G&WM-x&CEwXEnlQbFDUt0ztd-KFC&DJx0vV zN~Ro(4?kvL5cVJX0c+9()D7_Y)a6J zTh=4(&M$ps{2Ffb#~BoHp2hqTie70@nBd5pG$RKLGkZ2;D1rBF-LoEO7`?(OO^GCxQ^D8qNJmc}#h#2$bHS z6#K?~f-mtZ7R)lcR17yr&bx5!KBNp7@RU({^GN5S-G)MDw-%6{8X$T~`uC)W5SP*U<(yn* zx8Pn=W_I+wpE~AlXTbk#LupWq3pG1>lo!1=wI5ab`h-&3^=P<-=6=KKlH*f>&u$qBp~WyXlm2d(=~ra*F+=|GNT=YG>4kvnk;9*@qLKO|Kkx%wVyR zf(*9c$|;JR9Jif;y5GMK0^UP zGyRVELL-X75#P+wja0N?-H>`{v3Gff)}X8^t2^kEdUkzMJ>_qozF}&^;_?@}?n%WO zPbKO|#A_=VXj$9k4nXqFng(etG%fAmbx`k_L0*3qZtTvvfwQAEzEuaii1<3d>GF{e zxM#+-kDI}zSF>FSm(zXYzn=%lf^)6*vjUI*)bb@);2Uc^Dx_Cwp}|&{phEexG1t9p z=8}MJg2*XKMZ`94%@wxvfMYPMY27vc=$2+h!QTp7>1Y&p1*;+&t}(3Q(FM@(BVy5Kgi6OhV(L0Wt zSB{UOfIDIr9%wG7q6BapU~+I1aX(XT`o2n3r|1hLIcK;6GG~AfIJg83hgX7^$hiY_ zFE?a$FOZt|#u6VX=QuTt3LF4U5_m@RLL)2;W=Sc)?q`gpiHZr!!GySQii=ZJIo40wYu9LW|FzacG9td_ z-ZRx`<`i4$VwtySyExOuoxlX|vZKTQT&i}z*)9DA@@9s6V^(}`l1$2lKq8#7y(khZ z70OGYt1OWo_e_)<wZZiV+ywk9a|9sh%RyPbM0inOsCO z-jHk8Q}Rom?S~v)b>h%%i@Oii-o)N~gL7x*jtNRRej7|@(vq`biL_HM5y-BRRE`6Z zkV%!EIxXrFvbp27kTpcce^y70B?@XPMx6kCQ0mOu{x>!rx7JNA@?KyQ2^>D7Uejnl zWVyWg`rBKpc6}dj14Jh*=$CJNP)e8JOVbpZ$Zdw7pj7hYOuVWTsuiD0&Y$0}!~ZxK zDu@RM@SPpfWmhu{uQLemud+xeWj92y+DLCfEe!wAQ`_uZVAiu6!E}E`nZ7QzW_lfj~ zI=J!M%>g$nDwCh3OQh6{%CCeUU0@wKd_sN%gE>E6WW#1Y!K%mjIvvB+>Zbe#?M$z; z8UKT_y$vgG3mvI*`G?M*>8k_+eMT7aXoGi!$KU%Sc`reggXuU$(Rx9>jioyI|L$(A zDOgLi=IA_R4faVnzI2v6akN2%T1hMU;aOn*S<-l5-9rO$p-+NBnTEtx{_d9v!(#b+ zz104tzX2|#UYB2d_=XW6ue3a4ETMbBgUi^-DP0mV+`X+hZea7L)_AO@E)ftWu5Ax% zMqT20S#G5XqisXgcAD!F7wujf$vKA<*&0^TBYd3RBK4ClGwQZsrJ#@>)5N;Be4^9F z;y!!zEnG#zCH)jC*ngs}p&iSOshS)|||Ttk=uxST8l^D4X~!Wt(cy;dea?G$Jx} zaPC{T`G2As*B^2jz8VfM4Bj-|gB{$hXWn^ijT|(H z6U}^@q9G)VTzNAh-uuH8Xpy16)zw@_x^nASLqfnDipwLUycfyWD&WF^ajt}K!apKFWPIQxW9FZl}&s5n7QZy z505dLpDfqsN<7Ov$6>g!Z!8)ligKo4U=J}dW~Gqf&`ZKVE>5N zY}s158Kk7`pBMNhsF^HbR*TQ+N&1(gNwQU-f1zkYE(uo)8NIjng3T4f{J^lISP*DS za>i65P(I_M;XZY?W|qAD%LO{#CH%-0+lPLGTY3}Fco=_iiH;BOupl8RBC0Fv|YJABS71LcH$RPlT z#~D=JZ+FEUx?zl7nsRV0mK#?g0AmVM$M>w`@M07kSl56Q9c)Z*-a&RJ2}i(RS3*Wh zmsWL-ml;7|LuL^St!b5q2_^X9Raezym(bnxb%mlSo8}O>AE;~D&*v-yl1@%()!Ow1 z<(v6qAhiud0B&GO{VU=0R*L&?()5wT`K_m`o9Fe5Fd{t<)Ih*1*PukH6i8k3z#q;D zzM2m;INRSPe*)vt3l?o|R8!oBZtRANw_Xi((+f z_j%J@Ig^H0?BEF3_4Rk@o^|KPMMU(<@+0#45&GS)B)%DH0a#>otr-M6G`gF76J01u zxXfJOXV^vxps)0Q_-X{Tl6K6YM1yS?v~-`Sl$74CEAYkRWccr?>8{WdhXEW5ud;neJBXnOt@dpm}n< zD?Fx)tZ=lwZXK+?x?(5Xv)ntVNNY-8RE`p$*n9lU^yW8?uW)z=D=CesM7|FL_%{X6 z>%?|ycf7MQosz!teFJDXTNxHjblS9WMK5=46oury-0QF)0(#~C40KdUp0@QnzeK!s zgtV-L=pa?-?jm9TJtPF1I=HH){1q$;-ap-I;pPSUa^9p4NaP|Qqp9Ls;05f!O6~Q% znfIe)h@;{`2&O(w$_m~8V*r!Y`ucPt?*{l?UQn^QYHbYwS&>M<`PVxopKbj59RhdD z_Z|pg5`WG>fn_^dt*4RQ+~5v@yAUb0n}S`@`eTJZhK_5`xM49N_<7_1SO{hvY#3^h}bSR}mopA25U_3?opQqxwoi3!dMxK<@?>v6ZPoXl* z@t#u4%y_i@mcbS({uV;bqQ>Abd9Mm-o+XjR?~f_#R$JZjJ=M>hOJHy)vn%ZgezUj@ zHz=9x_?A7nY?Z(O;ehZ$Q<}Q$iq~Y-er|p>E@~5N)(zfUDNDu<*5nlqyx*^Q63vsu z!-U??3YDK!l+eX|O91|{gs@&C*uLhBt}l#61+%+-U3g$dA_~k)Jst&*wvmM=6oi|6 zZ4=}#`NkP?D*{Hgp(eOD{35#Yjl!ZAI~v!u-oLXd@GT``zvfA_5A#I8!MQ4eE{sUApD0u|#SZ_J zm~+&{1lWhQ8POb;y}_Lb87FZRA5k=oyK5eR@5fd88^Rzc^G5K)Om(FLsXOKT6AI_# zk|Hl`QcWW#CEjpWzl&AK^+VAf)9ZJ@!i_T2%M_}oH#*L2&I12ysGr%?xM6j;t3SBh z8zHYWQ$i%Y!ws2c1Z}+WjqW>owsU&D z5yB4YNm48YVZ+qcE3 zYJSk@t_DN)o3sUS3Gd#RfGnB~DzGMlLFvIs_k-;CGQP9Aub)m0z+Ud4yU{wisyl^D z=#2svIN7p0Onb|NAzL_dL0kk{Cc&W>F#-Ro2tnku*=gn+qDid)@KZk}-NHAE1a80e zG{HeJ`Up1yo?hRg=QxOc*B3nV8mE8ybSQJt59=fNvW#JPmQE0=ltS*4dG|PS@!9N^ zGx+01wwwIP>a+QUx>C5>po2=G(J4KcJt!?!r_gLVyRJ_d`||gQx*e64_jViUW*g|$(h)`6Z}0${Ny}++W1tRUXIHa%zf6ho|x_5 zE4mSPUh?YplW1ajDeAsg-;O3}J2{6Y&Up-@U$Gd24&+MuAHlaDJ&Yzk_woU)H2BJ$O`YPY?Nhl+oVJW$1J`(Y@bM@k2aS>+Or;a##IoJ6v+u zD|)BmG|(_&R5cD!*=)>Wr(azW_2kjWi{hoWr1g2bdMm}R6az3U;?;TO{5ee#XwKW_ zcys4Ne6dwARl2^H^(SSA(8|~3<@Gp~h$-f;w8eS7r+pnivYr@!I{1bbQGUYmH7}AX z=UhECAf@s_S!2`fuM~g&pjT?|FXZ9>D5u(fbWnAIcA7kxuW2`^vXFJ&Ru%cOlmq?X zsqOyI_~!d^5a-;dJGq)8pV|LFx1VT+n6x~24}FznIxWqf_JV~{`9WKheUj;@aw&Mh zM(cLSOsI1yLyq8kns;I}SzL?$t1D3ht15r>bIoWB4(UK^o{K)bh@hHaGsp`NWJIm$ z#BUL{Uz%P=TjwK6o@3HcLDFNM0n2BLEbTQfaTGlmE=lq#gq@CA7;91&cn76ZA8+eR z3>{x-Hhx8gM&+Dqr|Qa@CB;TpOIH|+M0Axdz#?WP2L-TUo#+zwWX==Lmf2fM&8=TG#T;>Yq5%E zCB4A~>MHMM*FI<_u-c}j{yLwyYS4Sl%#@m+bnO|FnUI;V_Elx$InA|~oC|{oJ}skP zmRAlEIiEzIB%Ly$=lBiyUik@`y=%M@QYmecf9J~9t`3AYYeWfT)&s46lW*^WUW$8^ zG59!xpEauV&cKj3I-?{V+%xiANlU?BECWoq|3Av!IxNcIZx>fVLO>P}5J6c$LMZ_$ zX(5^VR7wL`#Y3T;(uBB8OWNA3hg5URguix)I*E#1e*m-7WK2x9j zp3gnAk0|;zC_vMcX`=(4{V=k`>|Qma@Fke7o_toHrzQ`?UpNd*D1q(N`s7Wud!sDFLYR zZRb#$na%1EYTcT*?FldWl>aJJowxR{lh+x#A6rL>fEb83&}TRXhWzwW`4fC@q76|e zcAmtJB=ag>*%lJpjogNgasfEE>*~c|qu7&JTzIV_prC0IIt}Sci3*Jo@!2Q8-iPl> z2WbXy0p*eqA|Am`eD&DNh)}A%dUs4p*c!rxTnr_*ca7~%iXvq`^nRg~5(6<{ zH)%kc-q!PY?uvDoQ}d`H25b)=HjwDLzG2+<)$_s+&q-|B-HGu9pEy2#SrKC8_bZ&L zE`-Wzny%RbQWoXhGoz;clHsYz4iRYn6y_uaQ;D_)332&}>ESefTCA)b9(Zak8^-aK zgq+9ad<7@ZjxOQBF&+s**=kzM&ymY-H?c`hIWj*m8{vrGmzCJW4vrWpF3u8>@i!x% z#Ni_1Q6uNcSqLsn!FD+nrOw{gF_&s1Wb(}+q<^|A;fq9z4321SeD}O-aMz^dg~_ur zES159?z!HO3(^M=E#f{f9<1YLPn?2Ryj!AyKu8tPq+@+ zv>N+#zQIiUW%(16XB1MdE^?A`J~cbI=Xwxr5Vgl>$VA;;P4_z;)j!>RQ8(SRPDw z3T3&&8yvIL$#nKQ`Im%Az+)N8Z%W3t6H?qP*&s9c79q=!HyiU$V8h*gD7;IQa@9Ks!Mbmtx@D2DxWj~Di=GWq?M zTLQDxaFLPohdhVD8r)@(jJ$^XbwX4J9;X~G7j7$_LJL^Gzh%S>73^jeC5fkjD9FUQ(Mz z?e@q%N3J=2gC_K+1M>Kp<1a0&P~>Zc{4MCERe>Uf=V(zZoZ=H^iQzRxo-zYxpNOj|sI{e3Dx$UF7<)I2b_5bp$kT z9l^pLtLS%h*8UE;)@+*Qy8XOVEq{1h=fFUY46=e|K^k|x7+`izQ7>@Zj*T4cPKv&a z>wrE=a>><$f&$tJm19q6_A0ji!lW5B4F8HIQ$;nBAS$ruKqgPBH3O9xsdbLG2CQ_kOx;2MAm`EZe%Pe5dv?!}kR! zQn8QXUGlXlixLR`G!C#ktPE4UOOcJ>Eg?y?_5+@un9wYXM=PZtkJw}g;tdT+1#ElR zdv_L3wa9?*sIkq>4cc#}&xmip$Lm;UNWfFRm|bC;8#(k_y_--`pxdYJPV6+lJVUQ{ z^XHEY6C>v)>=g7nsKTI8Nbcn2!$8jm>#=QeM|~U69rF#p0%g7iU+0AhfpoV1HLi() ze0^t*z=uIdVWI~vh8)STRo(FYzcT&r?h0Z7`$d?0pgq{l_dbqqoewe*ha`xqZkR}S z<#kBO1U1Zr7K;R?1iAe;L##}-C}CQm@b*_0cSiO{kVodALM~coE?VhlYv0|rZkr>#^>1X_%Bj1YHX??TINP{c`CqexmQDEK0tc*Pj0nxQjn{ z^W25}d_m37od&3rSlO#zY)jC)*vh`XZfx&QNbL9)`4&gXE`ycrrx=k4SCI7!#ht&u ze4T+Sd1`R#XMK~nPHQdh!oNAg-qj9wtJe*a^-4-BzD5l8 zbg%vzLTH`a{+UI8m!tRj<~~@)seJUeJ<$h0%}lmArQp^2hpoBJLAeL~Xtyk}{U67E z&hn+iqI<@iyu|a~um@@*2JB@W?n1Cxo`jkz%Kmrds^q0+E6cs_3lKL`gO-Y?MGwNL zRD-N{JUKLYPh-iq6cYC{6CE^+T~x{3KLq`*O#Z7NGQL}R)crO;edLFY@A|P&4s1}hC8hKy4;acA-#sUQ+a}X-3Ui#-uC2)+Sk%H-6de{vIf)J+ZFwu)JDYq zw+&8qw~CTVny&n0Zm5$xMdn>+$1>Z-Q%lM1vrwO!$L1d-Z3Z)ZlJ(p>*(4tO{jvg} z5uh-Ct%SSxB~!bKf;45+LZ^8TbUOc%6~2Cc5Rtr8C4mnW9k@vYWTJ!srVMtf@{H0eELEgcR%#@&Yxw3zMH56db8O~+u+!^1 zXMS*ojo~I!;9Cal<3Cic%i}Y#_t3!+EHD@JQ6kk(xWV~Nuc-mR`0P~0U<-f zxwP@}zU3ed9^wV8985p>lwK`#(}yKUusBeV^A>87nZPxr9cP_14XZNf;7+T|QJhfl z6^5anuh#L^8BxI4L!Y`@Hj;jmH@n*k_qvUsfE@$Wt}^`S2fQ&vP_d;u>O|Aq8R94= z;Q(Is=;^5ySrZ>IpN4Ap6Yo9g%P8ydp|Cq_;W2F0~s?sKlzNsO>45`*}su2Ek2 zHmBeX&SPxIwBWkK=&k~64%c<8(_LJc*nkCQ`0&wVwe@8L8@Utz^V8=fgq+7jIzxBt zJYOuACF?d_;j{VOW-J3$%WHU!-icw@i75nodLl{=Woq@Vp_dvaCP8Q}eZ}i`iR!-H zt$Tb|ha0#sf4Fr5zRI#p2n!Pb4lq)HszF@jF7#Wp*LHZ(iZc9rD#3rro?AA{pEQxx z@8rk!T@S*aX8D*!M(dIjVa>9ns*VAl8h>FKm#)nnNSYG(PA!nhU|L|jS)Qp$9#wj> z@!%{ogp(?dhbozOk&#tGn808ugP62n)TEo)Lb3$BW0=Vd9X;H z)$!9gn{wYzS2Raf{F|{U_Ztkg&~K8DKiMNKP$lBv-)k7WCOOCV07g#qkKYq5UWi!m zo&5<#_tkaWIgy_*oOt9x+1dk+sGz$d;zy_35R0}LN0mXM=%6|dyy^ZK4-8!xJka~>*DTIiNPN}6w_XHT6ab`c#B z|4i^&<#thmZ9S5uot_;kG*OMA1Fk`$h%w!Q-w#~4M}XAVT^ck7V41pm#iCnesN_96 zxU|Mee7PDHJ3-^0sTXSGwBx-iPaYaY$BPOvZWHo>v&)8mILq8&u& zKz^dC4WtVW^NveZ9PL{x9?52CmwL5pe#^8O==nPY(2)aafL&FaRNWdQz=nNYCqVBKt0LFq{IPSaJGEd4r*QP)<<9!>TNsV4!L;$G`war%fubePE>6{k(W$0kh1^ zic%m9tGt1es$yEx@_tA=Q&X@C=~F{Hj_z>xqQw_H4NKvgVP1EzZeyJ1T&b5&!8tavs}TxztRfkkrB`!SUtbOJm>Ux_ zQ-=$781f(C)HXf)>xUdGJl8=^J=(xf2yApt{>11VLt3N4pt+fBC#yTVT?ROso9kH$ zyqtgB4*T#zk!BaS2hUR991eQ^F5;a?o%Hgs9~c&`_StD2v@xww^i{(JIMJ?LyyD#j zAPgL*oV3L$VRb`7BN;Ze5Q`Ge zTG!TjX5Gcvup~4#8)R91X%gG6P+w8m;=P3Gcr*z`dP4B33wAU- z)i_KN-F;BTS$g<|cBj>QY1VN|Qe&fdqXW!cnx5`oMHv=Z@+#DZNI*qgIP{nWc3(JR zHmTiT_OmRo;hHhlk|9)akXF+wmW(BOkpJ|4ezA;{T3z?g@4=;cekz--gfhTO4%qbv z^dfJPaDR>bL+(MV%bRDsTO);bL1INWFb!+dh|IGpOfO@qta})kM`}Y;-o6!9;=;(_ zUMK3C=uQ5S^Mqt*(Wm@@EQu^7%*`|?xA6E-qjptB4ek{s5`C&QJ*Zij|L(_Vk%3%j zIX*%#|7NL^HNp*D7^EF6$H>-C1Y4!K-MU$E!%=8*WoqY*T&S~KmSBRo)WK6k{QUN! z8}FB}wo|@AxS02^ddo=D>8~V3)(_>?>IiuHPK8w<1*&&4go;|Qm??Bd0jurSk%MVu z#lpX*%Cr63G^`@guAprN>LSs(s_~N|XYJ7TRC`Dgvq`wuY~hxogL-M(1dj0ydoeGv z^-+_*3^eCoctZ{)N`Y4{$QSXxg?bRyHla&_@3u?ir_I)=d&U2T;z-;_?g-=hzCOe5 zvg>9Z=O=qFKmCkM>z1$a39lqbhF#bzDp8+aZQWpd&A!BkbodD7`O0^lm#j?rRO~SB z`G`jUw&a(Gf|S%V#Ccuf@9JH_-*v(`dR!lWS2XdJ7cc1*;U_DQUSh(3x=Z%>@O+e+ zpZmX6Aq~M)!R%Y_k3ZII#jT&_@Q8MhSkAWI#8*hJ zW90p^eb(Bnhm%&45iFxdKy^HHraM))8e+iI+{h?AL0XxCFUi<+ZfUr_>jBJVa9Q6| zBjA_gv3q75c$zexe~kG;DkiZvJPNgkB}HjW1tu+!g4oJ+lkmre_+Vg8I$z{OWS;{^ zhwNWTQmx{osKTf7t*WG1NceoJgpfT4-*?&%u|8ki_5p+LYsc@uvQ6*BPVm-Ca{tJr z7TW%n^aG0dmCgZ7@$SFA>|1Z!w6~9@d}My+y-|>3^3r0_^{&5Sk9u?xOh+vg56!A8 zht@#g$G3eH#~w|=^_}V|Ji+zP2v`#YX*FXXcD;GUE($>Un@yTYGdFYTkaD0aWSDeX6qTR(2 zX+z^g2m0@G!k`%^bH8y`pg&v`{ApOn43e%taKMn@JenUDcGJin*K)6(291c`d~Lqy zn<&&G;92hYYdKtSh!?18s{YMg0~H`Y4dBSG);*tYhl0q;=-I|ljUr!^1YjxhoUJd; zy(!2%BA9$TLMo0n8@2j@ZOHcHRr?wSc26bl1c!U(yQeADM)BX;Y&uqBTB0c$i4){; zerWuSaEWj)oG+$fPv7{t91KvWPFFQ5HG(p-rsQYEwFS2)cU2{3=EaUAJDk-+4Fk}w z`hFeRKMcJDxJ{{m+zwUQfwbWM)MrIFG?yAe!?w6TOij_HS_;#9 ze+}mBzUv?yN}JY659Izzg0hsuRfQyWUdw#i^0#}49o^#^H9*6bGR~^Q-j!BDhc~Rz zV_5=rff^^{r=wFf?lx^2C#y2fZ+V&KmOBh74CFs3bh2k(+`lmxNJg+CYUQW;fnJ59 z9%R_r`CX@9z+TjAC&|wm&$r?TTf%<>*W6Bl-I>Ngq0jaCwk=Mx2j7Blv}W4@w{;~Q zk5T&BPmACSwb`PCP(6XDcST7a#AUwm{?4F&d$qU#v zu^5OJPDfxf4=?kyyaR*EN;k;o^C7!!3@veBJtYzvaJtZXzA(HoL~1g=gC`^4ieH${ zuOx!9H(mRlj*;g_!m&!1!U~<7tMwxd*s~-)hu(h>d&^*85LX39hX{LjQ;AvieqAck ze|u}*4iO<4#aS9ZS*#_Bati&f9bJWWKoh1rb#`;|cy#D$j{97#%n(|rJrtO^6+}D| zjGn$mYyA3{d3+{e5E!gi$URKGriaCtwM%ji!X7^*#!si{>956+d1+zpZgS+Ur3zU^KIhGRrmzOIbWLt|~5KY48xY@*g zIP<0?ejpIM<+qbsncJ!uMH5S!nA#;?Tlx4KMH*RC;faxlS8+MD@Q4{r&)>07aF~Wm z8rI^l{g@~d$EJG(-~~Pl*xWMrH7*Syl{i@S`GU63zqq+*2KWl>glA1qz-tl=1V@QD zkBM#_59NeQ?fgQtx+*D?+lMy`%vTdr6?TJ^}UvK1py*C8+|_j|cW* zX5Y*|t$36WNe%=r0M6^^b=GfZKI&4UEa`lgG>MXpkJ|7sP`x`I6z>sOCo zzns7s4pb4W<-v zcYqhfpi%xki9}3W=>G7Ar!+aI)^y5nh$J}ZF$pLxqhC|Q4*&<=3^+ICGfIW;SoTK! zR6vaOJExsdbi#*+mu;GNB{WXjd!m1TW44NlZ+K#FRI_x0#C9QQ0tvQV@Aax}^)if+ zACL>Ztf8k=e9V5)6Qrer12{CpFTA>-Z*5+2Q9b=~8fRHhj$?B3UCo{9<=TR_N0O#E zA;fD=Ka(PT+lqx8T9_$-U}Rs`j+2>b3=x{NA&H(--xmoMn(N?K@-#@2ETJ%3D=5Nu zNbA&yddsXb_;k$o4YP>o_#~AUir6KrR5>jJiA>%qD{tf zAJKdl9<>(dVD$v(Q0^|fhbpN8KJey7k&tNu-xWAC!A4C$MM{c9KZHJlWAJGN4I&9t zh(eS0?cy1HabC0!`XUmis-Oc2AZlm?PuaG-tR|jbP)@<$e-gL8az5jsOMghHFIf>{ zqwI31Pra)3S+kic=&N#IeWX=qTr%=kYxikUQ=q;qg?~v?w(i{YzU}KwVIO>bKjhKh zTl8ynv!Cmq(OE@Nq`qIC&-ARn47xvj+`@c$Ngly%NzD^^r!sU|OAL&@5LK+RRr04f#&+s=F{QuDpIN6dL` zIi2bn)x9K9bGs}~ZtoshiV=#WhTg5)B=DpM4){{@BE$u?Go+=&cLkrh6Y*_ydhVcP9%m9u-_Hym<+ppi>DFhj&0)8Eoy+s6Z?6juSQltYmso!263$9N+12g+i#&@~oqdr$F@bG1vBw}6J1?qf!b z8h?Hr%s5Xn9Qn<|D$)}~@Ba3e&GsKquKd{cx(($Yl3buOP(&cIM(y8JJYiQM8-sVD zPyTcYSqsm9p*43tohCn#{uRTYMysbwb^j}no&GkU_bCqtVsU}f^*K> zN2PDqDZQ4Cpud_80zNsLVL7S(IoiN2Hyp3sAZ)i-OLg18mWg zLA%74IYCuO?}#rQ4V!|3o%D@!qFw{xq-k`As}Isz*z%cQef!@kLpPaUq#=4F$Z!cQ z_3?Hku-|ns4F#7Pcp|mQ*m@kEEQcoJL6OSC^9CS~5l;8Hy$2*VXwJb+8gKtpRpLUw zr28cX<(%U~rb#l~Z5`c(M5lC{A+6|=5PB>Yf5IOMl-TBgfMmm9LCIi|PD`!N3;iA| zvOcV)eU*#Jw-bBNiUyd$R@BwRh)N!W6V@2|yJ^hkpq-~LX4F{0Cw}+iFvd^f3{pbe zZ$N5qH=N4bJG);}bJbi8tPMB~dl4FQWjj4B$^!>cIg0Jkc9xyybm=g7mB-oLjEJx&a;|tQC9gmcn6>aa8ig={lk>b4)d4Z4`wDs6PYSaCG{@)DfX5}E{ zx}LWnO9`!eSL-5(1nFLOxKBo;v|-Zsub&?R{KMsW+_f1r5O;FOX-5SfE7~e#mPhbq z!aMBHoXy(?EGmH(zps~JLPzU&p;S3l2JTXatjda1epOx8nQqa&5M8v$<@{-F_7?em z?{-QS`h2R_pm0TVdSY=H$%d-C?ERql^=FsGK&Tys1>VYSc}dAmA2u=Y+6?xjQ^3A5?LhrkQAPhKcovNTX9+iwIWt| zx)i&E8P&;0hF@wlm}U$Lr8C{9_`M?dfFBaCP#u<4c~4Z9tWj`)+SNfXDrivb+Epvr zC~pSTru`hlr?9mCHPoR~s^e9y})eilmDkc z`?q<_M5jR^8QJM%ZLQ3S(PHqyA4L@cp7$avF-z=YZeh4^SsMGgEV!; z=T&O!Q_J_n+FDODkLGHnbOkI(~d7g_m+r$={{j7@c6m2C#> z%-uyvgXCYX);Rybu_Uh-22bnUH$4aIV3DNHJ{@{#Mci9C-a4o5@CE8(=D*LGeipar z=^|a@=91@SY&*ww*wtUVhMR6?-DuNcN*1>VoUq1*U_>waQ*CEET-!61z*fHlW2tnkj35_UDo@6J?oPeKQ2^+RG6*YvoxSl z`7@?AU94}tW~cav@5e_W@DOt-m9Wn_1KDZEoehBkPH+#i@Hr@>a2U`bLhieE>U&3e=+@VdN|>i!B${zilh5S zU$K)G5ZaFG1ovVHI_3E?lncnc8uFo*sqt-vP4b=b2GQ(=O;CKxaLdWbhT#|e%%Qbm z=bekI;GldMO#~8^wxxHu8y(+9B!6=mAsZFS*V5mmG0o37nILaLOzAA&$RK$^FC@vt z9)d5|D--C!EhL#Gpa<-HuxAErJ6ekQz>+4#Cdo@UtXSO3*hZbf;2fQXa1`W5DVE^@ zTl>>ThSD0(MPpbRzJGffc+3)-fn6I~DkdxTJg zEQp|VE28Q3Id`2uDrww7XHA0eN4M>LXKv+%V1Nn&XGRn4MOtQYbhrr|6xKhQW2fw5+z> zqh~;|D=w)RDsSw7LmhY#f~MHJI@3I9fn9#em#2>G{iCo|LQw1P_n9M2hcTm#eB)&T zstn0I;-Erm?3}$+HeN?b$xt3ngdi4nDe{eP4R?9;i&G2lwj|0y_<)a^V|A!or3#=O zu_D>~>tL%McU$N5{XWPvZ40Lsk0Ay24U&0y3q)5s@|yMYg)M!t*!nXPSKsudC-^gP z=E4p_g#Gp(_WOx@*xH3ykRHRBbKFEik)4m$9KcRvG>baVU6TLMXbd1`V+Lpq)~rN6 zCBK+*taMj64+6qyQ0|}dP8PJ+$smM1Lr9)UZHNHcdFh&yA9ho_E{0d z`1r@YPdOa;^HbxVR-ba1Iv>G+Ulqr-(*YG=&Lg$Vad|@I#w|A1cpBG@JJ<;Z88d4S zDwkFR&3rd}%y0~z;0@Sb(r1 zWXId|8oJ%1fX>MG{Un#-mb%&O;QJiV6V<-6PA>jIJrGU426@IAkF(NkyM&hmUNk?O zE`+BP&rUROPme>c%H{jn0YYy#U5~QNe4bOe|MWU4Vo7+L8k4A$y9m^;e ze8gYb=p>)g=pKwS7 zuh|F+2jTPtfo3dF&2?1TsFr-N&gPc^%NT1+_e!Ww2jY;ylu8?sI05TxYSSc0M$j5V zdPs>*?a;VF8hO@Lg*sSvAUjX_tGUi5HNq!8Qu$-6K;v(zO%dTJBZeDi``P*lTusF? zB7#)&IA(74RSajDMj2o6M?h5NoDs>mO-zP|O$tzJ<+o zqxHwXR;7ZFU9hRXqe2z~>9TqckCLl#oW_zOg~?xWbc0(6w4{_Z80BI0p80gbS>n1D zA`p4h&5cJ2S5y!3&~EM~#2sqyf6x|(cKUPgs*fwl6q=Z$ZxYHeT&?q0vLhcQM?85R zH*4rT@8UQtx!y0-s!@IPPUM1JFPHj_+2hgQBr0)>g`1n>w*YEg0-Mt8ykX*#!;k6Z z%FRZS25vT{CTE5>RXXZQn-|?h-#;GkMx|IJ z)$n3l(=xam|18 z=*<+q!&+>!p(W61uw3c5%9_MjW3Jx1&pP4Dkd9)PyC7cL zqYk-Hl`b?l(ew>BibgLW1jL{|{Zp!-QM-3v?(n(lMCU4n`R{Uv zQf|*A#En+;Bd#q{(;@BAxrmZi^68etp=XL0^O~^@(;d9yJftcHvn%s=jy8ld7sXFk z`WGin*UUicm%Xo!9$}mBvL^`Oac9E{4{v89b?6 zODg;>AjC>DO>dFF2VcL?m#DFvcz2oFus^rNsi`?#eAfpKrQK1$q5HC21qk<2CMFQY zLgj?*5iJ@jJ|CT?pzNW;v#Fgjf8K6bOqb@Dj)mcfZ2o-P1du5~V#8vh79DEeQ_?Xv zC})2^8E`a006&NUD>0H#53h`IOoMWA;L#xe2y>{Aw@#zLtT2hM4zr4W-$PZR-M)At^y?&LnGfw?OP42O{kq2)pts%0l=SMUII z9M9`z6xCM!U=YsZo8vt%3cNk1G=4VU(ymD6xv4i;0aX==mHE1w4|PcVkB|8)#J|uI z`{9Vy=w-VqjmdNu$P{Z#s+F*NifgL##vv<^huQOV!l^nme+@N7VX7nLAc~8S`MNDE zA4p_>9x^Wm+`mcQ7X)zz7VQb^dKOqpzw&N#y*CWcZJJ(WWLRX}HKhH{yKn#>2L#JN zF%*O{`}@by98=7_6oAF;-W?tZcV=R4eeRVw&$+lCRLARL9#XpmH!pJI95Dc5xpsFG z>O&fm>O+PU+6Cbgqy4;T>yNzCoTUfMMb^HPSqgb&*!>Z*tK8r0$d}eAd9xjj-<*R9 z6=TG=EY8g9(Daoo=ec&zUk=bTz3Sue$ADXCc6a&S89ex>GQI=^#pdTmYee_o3YAR; zZmrOVtO%0=3R)8*SZy^8C=X#5iye1_AM=~w%)}QXPGFv79p1p!9|6M7 z6Y`0A?7d86tAcBQG7*J6ZprjrxuEUuYBbWpjQsT*yACuVCebJ#?mP+>ve_`3itgiE zhP{7_gHcoMaZ+tkC9^0<>DF3)QGJL7OATQ3#T}{tjlSsA5N`eWTRd<*1tV;3s9sq_ z-zg8%V@DhA!+ZW?15jP@sHD?e&(8{m6zk48Om%ktXDl9$Ra!dTyr5v+Se%CD43GDQe2v|R|-zv z)Il~x=qH?^jFanefF3Dy7o$hw%_rJUtFO*<0B2~f1WCMjhmUcXp&Th{E-q zX0={Uya@>AaJ&oEqxVWem7gwTb`Qq+UvRGxqvmmp*k?F|xHtRvfPV{fa;7R7hUFA1 zLXbzrEXO*b?pxbI`;^L2uKf=8S;u@gdf#$juJkM%bkiWeW#a4P_F3YaoBJL*>|Zo# zM5PLLGWG!4C;VWL5G9{R`{L5`o@Hr=H<(M8lI_eH=is*rQ9Jel>(@ z6zy5L0K`^K0sHDF^z0X`HCp}sfN~-Kx#vk-#ZmZ?R=+@jw3mG68a5`NaA8wi^~vbP zTOc;fQX?fb+tDb$D#bp)F8lP@_ZRN`bF#iih60%}M6#jV`T;~}+A?MtrC4h`?LiS4Lj14MZBk-+H{xyTI^v10DjFaL$@o_{Llr2G%*HwP^N27Dq$R`Kc zPaJ%$M4u%?J@K0FP1EfAF1RqgaBi-6u=7;Efiv2fpnB%!PO`+6HmgFT6O7%IPdHc& zn$bbHZjw^nSfQ=!+1ZNi5y2Ytkk{{wPh5chq*H+44*+EAiwsiPYvOJPVB_x=gF_g`MHxb*+Y3o6?D|GeOm^DkgA|9`w-Sz|;o67DSfe{NyNTaT4=%xRc@{@;E6 z7}x$?dF8_5qmcT%?EaEkR#nJtz~KYxXnK6?(ldygk|F&>@jFzVc_Dthw5Rm{_5cU- zOZ3d-_V=|En{j$ySxUx!T_H0->>a-rdn+COiM<^Dv0hOW!-%yRO%R(9?}})REBKjG zR^{dYsLB3EgS{GMb1~qg4KND$km9a=A|2F-G@t$NY8V1=a-^n;jMQ(aHR9@JF$!}! z*_FclKS{kj`dfknJjL39yo0#}*uaGZ7)C6%bzdR0kJo2XBN%W1V-V->c#rQhbHD+= z9I<@B@3;NJF*;n!jbrV{8{4gx%{aab$w^mnb!BaRwNia>j(5l%5{bY$sc-$zUXU~i zHui@PY~WX>5Bzvq-bs;=6X=cHCjqhEGPoJey}f4z2@`J(jN?Gx@|77pJFKf-H7w>K zi$Rvntf!vOLZ?Jc(;b3p-^P1L-e(`T_o`_15-O%1P%~LJ!ZWL$ZnB@;=uiDPQvqhm z$*i4ITcsMG@Q$yg3^$(n75po3Bm0Pd>x{oHu7XD6j2|A?D`mDjPp?|WEgpJFUmkOg z1*DF~ZNPupV=u9KeZI+lp;`MHA!=dQ4z}mJAPLtHe$<#+#u`smMeVC`|82jaChOz^ z+oDK;*VfA(lDfA2DjJQ51!&S`5i#(W$kz+|>k3}l=y^Fd@KJ6+j4YRt%JgX(_>jKk zDe_rz#7-pcNov|_Vl;?`m-NEnURsa4#hf@b^=d@wk}lU`3Kg6yOQod0w&AskfCE9V zpbC%%g~tUhgkfn5E~Xa4ziwF{-5FqKw!!_qe{m}1KHfr2Vdyt-TRWJ@?e3J(ls;bi z{2(ongf1rk{s*^`;2S@g>y&es(S8?%?(Kneb@?~X=0`$UZzk6LRK!!-K<21}jeX zq?BSw(9mzp*w4O={ZN`S%p#1)Le7Nd(+y^~)(?Tt_*_CvKdJ0ebx{7MYMxrijpoV_ zQ({xpj6Q2rg}|9M)C*Bc(VXqP$g<6avA zPH(3n{Y`1gxd~5B3Ifu2?w+@Rbm^4XgoA2DWq%rF1W+hSGsQd+`Z#vW;b|E&9jPa6 zg(=n&l08b3f|YmuqthBmCp!Uq#FwOC)~G{rcY$;QcfM^_=q(XzSTT?wD#5OlpSt3z zJG~w%p1mwPNs;}X^LKB9P`3yd<2f{2->d(mrhViU1y_;q_Bw>&kU8fd@&dBz`y{Qd zSmg4avF4iuD_W3ozAc}bVym$6{?SWaUkx3+=8-#<(!U5+yGTw*NA#dJzZ=R}rVVPo zwdq64w=9?OrpN{rTUkiPfvHtdsFSYAe&%7*XuH4yjbvl(t`wMz(>fhzVQ4p!{gDPE zqDP11@ICO)CAUhcE3WQCScPU5E$2*U&^*YD@D?H2F0#JIcfrJCrF08Z?c2HWv2E!| zis9BDX^=4@Q!KRAoGR&vuXXGpQmKb!8ueJ!z8}S+*zs8Q$D{p*2N(8eX4!9Jy;+hy6&ZAsl@8Oae=#;)MRxI@2$WTck~ap9%CGU@1@j{Elp64ht# zbxzfRFO&SGpD1_Lm3tRj$y>aP>;S&`#G2a5Au1)0+KmV1$ENeJGpK z`c7Z_YLu{}@Le})SCI2Pmg%gaW$YBSq%I_z|GJaDKYn~Ge!OVdN>`0$#qfze<6pfg zc`~t(2|c{4@}>&qK0BL+oYvg0!_%?cZ;1J#Vz4mLv(m?oqd$+|9l=vbeQ1njk6qvC zvS~#^87#160Rr5P^@QK*=Qv-JrJSA34$E~MQ81p{89;d^Q z@2^=~Ch{@0@YV5!IA?p37z;eLXWY@7GMrPDd`Ezp%PX#fjm~gXKUPX)@E%8|@p)0> zaHLVnVVp*KCW1ysAuxTqu6QI5LbI}C&s{gR3e6l#vPOgzDFhNv0S}TJxVlexCnZPT z&5c{1ppW%Wwgizc!a~YC1t*X6kYAB4wFjH~^KC8^;bH!#7K_;P7o@t--*0$tIk3Q@s3!L~Wpb|ecgeF{oAm8JQ%}B( zHB>{=o-rG4VJyhw=k5NbLDOZzls0Dja>9IQ$4C)+2-nbW0lpd?bky+!u|q4S@^Dk9~bgv%z5~+kb7TsRcInTqR{HOQen>M_IylgeLU>MdQR1> ztE!l#YMg0(hY7M(P7ll{v)dEHMtQ8k%b5p{*Jr#oc)j}FiZ4DW0(k{ddCAc;%`-Pg zV!{Jg_`a;bVk2Ni?#bYr?6Sfo{CmetV8FeY2_jZkU-j#S8Q_@-8vIFqB}(q!cY24t z2yXJ$swl2z3B?mT|6Bg|#^I!@6xG8}hRLu6r%l?26-#VG5t4=bjiGyQ;-$(2XEQ5^ z6(Dt|aZbDzL>4qFW$=4lt6J`Xh#hzG0NvcgWQ|xA>0@qrhDms(7v!5)KD~Eb$c-H2 z-yjy|H6!NzPn^^t@_bJ?s1OZ^G330ot5~YlM(_#dpZ) zT${uBumxiIrw?-Ro;gJmF2+hRo2gcjfMB#xmP<=T9+u=jGAO5Cro6W;%0TN+0d4L@ zf1_V6r2mue3~8Qb0etvH)lk{pWYw=0ZR$kHbBy$|B=$tooy1RX{cwOdTN=inSO9O0 zyMI8AoXFUaEZlq$Y2!$Jkl2s>iOR8i-e-LeDZnE@S&{#wY$MZkR4d!s%nog*lAJ)QB;JH+} zCt6O-_8Yisu)-4uSE0rQILTZYFzfD9x0nW~&PvtEO+((FVK<~bKGeG%aY9eeTA0^y z!bZh;ZrvL^8VM`WP6waul*-&>;QR@@0Zc6!oi8K7)F*Vxh)d z+Gl&W`dk#GcDa^XQ1PKLihO-|_ho%dgqcwkeKAi$xGT-K3{0NQ>C-$$eN826AzXph zznT}xrr4lM1N?QV=H8hPmEm5)5Dr4L)fR)`QG=ugv?+(=>w<=~1xa)y#KNRhrHRt45jQ$!evnYWalJa^@H%3d1x2=nmd;ZmXS2C+#+eR#50Z*(q*SZ3yeQ#CD)BYm zhK)Cdl(DbY#t;<4xDA$tZlT}&2XPOQzXDbXtJ-%bvjoYcG3X5}{|7^|i6Y9_vw~Yx zWYqcLMAxW9P$}*4^Fac4$LvUAdw4&P_U zD?lGj1VATQV9AH2Jg8j4o!$*5@R~}}>7LK^^Mju~09z0&`nLL)rCc`RzgO>m!QQsb`>w^l)|N714BoJ# zKDlnr?oH7kg(36G)-p3Kpsis>Iv`u%Ixxa6tn zL;j!th2}uNRm6>dOc>u9ys-OO2UJ<~-_VL3#pY^FY=d#Ez&F z3gGDWrfkz8K`nc7upcIraVBxqj`~L7TZv|P7K4>2QrFGuy{Y%eIv2Umb}ZK&hbE6^M?Jw{sdQNE zI7h8+zOyeme<5;HFPr1)*;fb&>L*@J3Qx9HueASAa3r@=btYGe(9>ne-t(0yIjemw*T zLRrBg>_=90PLcH9Pv~*}GlJw*KenFR?V*CxhFgi;4tM(ol>J)yQ?bmd9p2XK5-?02 z9q0Ek`>*Nn3+D*cO5R|1rqrn|j$K3oOTS{~*sA@U3{FV<+*SAMO279*Pqt@QaO2#6 z)^dZn1s4Ny)#V#mruz(&E+dOT`R#w0g2kXi9NzKnm(kNBUF~8THa4W5#dXDG7Rb9_ zRum=XiKGBbr0@7w)>UCakFA(vf3iN;tKPD_8=L9E>$l!QfRt>#?F)PY``t3 zS4dOTJe@v1HmHX+>`9pI#`nPe2S9cgX`d)m&319_43=Twc1}ib9tre`^gN%AkYNv9 z7Z<1E>*r~;PnDqbh47q!WL=1-3iFbYe);$Jtoto2WQbV1vJ!Qz+=G69%$kX{o8tmL z@s`Vc9vtjiEpS4hbIhkQR3dDs->oD0AY+|%ulSfdt12AQickh#Jpag9)sFMN2bW7j@1e1C*i*w?ip)kuw>L4SXdP1QW;Oc7w9UVpeKta)~Gij zBW_zLmQYju$0;en>Gz^ji(wmloA93~58gvYR!8~gNa0Y{bMdl^ZvGg>0NF{lqM!Dy zJ)BbZIESo~;yomr@ly6=AihvmYZxFV&eCRi*9`B+dP&{W`y2Ty8II7 zGqBRTp!M!=UXn|?2}&i^GPiBA<2YV4Q(?r)>)kF#g^QAuF3Ii};Xg92BfQDAKYc0H z>D{s`)t%*smuY_@vYY*YS!iL$>wO7q+J2%!{Ng%Sp#c=Cyai6cu$o|*(wb(%YC;x2 zz9)1JZif#r_Kot^%Z?6RKnl3l@*=7H>RVT#(rlY`r*R+ z`b)h}xEQDgt^w{EPX{z@GNfQ|nZcyORhKH?M+O^%>M9I<6AD5K07ie+mqE2LhTj74 znd)YUTCp=N?MUaF=RZ%0F)0JV-&MB%7g^sK)>PBAYX=L`9+X}MR73;}y@)gc0a0n8 zNiU&@NGC)A=|w<-fOL^gXaOSxR1lm3ysq z@7YR5H`Z5dy;jb~Hr|uWV)m@wYU+J5g~^>BrDyf01Zo?f81;_v6cVV$U*oGx^j!ha z+PQQ=fx9{Z5L|2b@5^5^Ra$L35B5X0nv@VEp5YM1Rxe)=sAccq=<7GJw5OsH1xzBLm%qxPha8={1N=ZwME}V^vLq$YbMP{mX)GO z9Q)@>=UsQtzmo}hp%4=M-DQb%6jiJg0#;XaFZmj-9du+16hD+m5XLfHU&1OD)c`ML$7aSw( zPpd#WL91kp*4aC8zOF<6Ue_MYe2jba+yZb<*}&isLH_F*Q^>H9!FAp{A=irD41A=M zUvNrxj^Nv!ASXxGUT?3e%dQ0PbDbfl+^99TGH_RxNiqur>W9D-z!pI!m@+?UnK}IB zcU78f-%AUoMR@tk{ni9LRZK+~IK5I@59$Q2XBhr-CM)p7ndL6<5sz9K&A}2(EAJ5CK#oFoTMD>ST@0MY7>F ze}p&8>rN}iO(ADhII`fOzrE;RJ&J1LWk|XEiEi+d5vL>LyIEmFCB)@d_r$7=$TW)I_>Z>kno>k}_8X4-L~f$Z?YG`T| z(50umrojy5>Vva4vovF69(LKA8#Gz)Z~v7uD(ahgwd*r|r4?hV=$-YqBF?h4egY;P z4{J%o=7>Yfi=tEOhSkycV|@2hR(bko)*cBOoU8TodZIO~DcZ}b*4w6>XAskFtB13w z>i#^*F#O#qK;x~HjEF|n|{283(TawW(F!Hf@!$SUEl3D z$}YKuJ+e1t>Q<+IojW)~vft5sBEs0jZLc5Li>zdXY>xi?b%$ibnGt<{y(p?^*C;Lw z?YK2vS&0`n=m>bjL9dib>`vX>xHVPTZ+z%0LHzWp&#JnXMcDllK)S0+V9>drChipL8UzC%o-cV4yb?Q*@37cn1+tNZhElgb~o}0q>=#6 zI#4lwA^8oby&$Lm9rk6`OZUt(eu?SZr#b43hQG_E%bU*+K+1lw{&*tN=kDzK9=!Qa zAGCgE8|6VS9ai=2i9r7A(=wBM)kPmRGNU=y5`6c}`(r~dy~as=l9HNgso(Kih@2y% zh4??!3B#lN&P_egUn}}JuTXHuVF#fUJL2|nJ;9D)_EC%|;@TjMn+sth$K|2|RMAbEAiDr4!FAw zC-a+5Ptb@&|2dRQEVrMtGs7oHJW_ok5`;()KWzqS%V%%GXg0SvvCjksA?SlOMQ1~e z|1^ZY|1*5b%`2^G_vyPIUePPry~r<*frG<7TJ$kd3@wL_;%y@CByj||0$M6hi+vVF z+qs)s))sCI{QTStqxxuNa$i`HH3g2H_#F&WP#1z`~STPTNoRC zwvnKe34e$L*c}-5mq*(7EQ!~{@P?cw^=`@$o0Vqr^eu6{`1uDwi5!-Gyq8ws)i zySs%cs3QAWd69a6l{NZ;O92y5@6C$%?R6AZZg>b{>e!TKbxO|?<1Gchk{D*ecJQ@_=K@pw9M5Hcw9u{RVL?vl_n*ryO?v=%yxIAX}s1M?S?gDWDpkXQ7#hNJrk%(dTeCB8R!cwbAgeaF0De5cz*XN~;j@yQ6N zFU|+k380XFZ()v5TJu(~mswsh67*0WQ-g*B&J=x$e=ypXlj(G3I z!kBks;xz9gtI=gLuMH(yd}CsAO{RL^FgO3k>8g2AebaLxXpWS3h+)7>62Vk2StJi3 zz!<9F!H8GS&QqK`CDMo+SX-she*NpwfH~PSr?P%`lH~|K)n_j+lb&VDq#Pr4C|bYW zIXE>r*5fmpS#4SjEFo|DNCZUjUS-2n?*%KU>$C4VIzVa9I1Yq6qwxE^Uum~c@C}mT z8>#MNYg)kNAB6=XuD}wXk|e9T(H}otXQ|qbt2>E&X~op#fbR6G$8?AT7?J*JSLD8K zdC?n>Pg_E2t-0GiA2uT+cim)YCmz53?HU0W@M|Nip96Xq`pL)1cWQT`cf7PmjtnE- zzq-;q@N*Z-&_9#9%-X?z3Vb-lG|LMl09GY-u`><_{f?dIr4cse4?fZFpLfxUhyJLM zXgyQQ$w=ZDWd-ol*2&f0;iOonC~?)c^m38ev`=&JQm-UxT5`PU80$EMtJDW|aB&U<;V*tLLs8@0NzH>pw~xMF$H*8s_&!$6vrEE@OvFOvizDzsLOAY718S z`FYassR*z?jS{WQp*&{dCatCO>vf7%Uz{~(>&A`WMel;8a(?{$u6Cl-XQYYe*xFV` zUZm&YNBE{@_hjViiJ z)3FccySsauJROqDDni2xvPx#{7~kxtt7b(??Ew{eY!$I&xUvfG%V@fv-crePAQ(SP zI+69o|7FQ&rGjy_)A0LYI`3`HlY#t?`Sq@Bj?n&1_HRPT)?=8os8F4qwal#9$I|3< zq5U29>~w<#*Z!EL4gFbqILgAr!j1u347({RS$W=lzLzAJXn73^)oJhWAVFM|8odo;K92@rvf z&9=93VTIFb@Kw)D@Np%$NzLlhPi05f$wUhQDV{5ig%>`@YWlb zJ%Y>LH~m;a`Ql5?nL08-oB0~)EzgKL1O2W5($l!#%Ak^(u#FPNa(O}(Cwu%)$PZ=z1ffSY6t!1Tojg_0c}v^M@szc!+Sk8Bqp#W zTvZ!pHn5*NK7)Lr$CYbOb6OkyJghkSN-R~q48wVDJtA?x>)F2%mP>iEyR}Aw1{gU(zr41!TQBl+ivxukv(_j3(Y;zc z(>&eW6^K)aK3%RCnz?@y=(< zTKUWe~jzsfL~&a=N#zKpW^v^MkZJrN&Ee+ z#V`*>AZ?ZRnR9?Ce5^D5Q{A+Ceb@ib+t$wJ$X7K_D23K8=ukS8p@kJ%+ zfB_fZTCTWVJ-zyLlA%1ngN}PW*gj9&k+DB|jwN}kn#S%aNNLw(bo6&sudz_C^Z3nI zZ~=CutW*p1Xl^(wp=E3Fj9NQb~TGXyA9z$FlvDQWq0GsaUK8G6GJoe zlRNEO6wwnQ!U}FTl-g4{+L=&uIcRzSyi;>QroG;KDM>nTk!5 zVchDz0<0R|@3--+e}n(0m)rj}Qv@sa)w%qsgWmxwx_1 zujanl_H3^?L);zL)Ow_?w$-TnEy2S)ZFeTT?xe9D*48e^NlW0@Jpmd2)?-h3=ZfD; z*Mkx?o@YmW*YY}x@qaWspfPKJQTy`|6#@|*z#gMUiLZt3pL2^ugU7858pkoM4Zu$; zqd5nlsPT9Yz&fU-?zw&)NfVEbOxTapxdaY^-PwwcKiPibuE1r+J}2_e{$tPDsJ8~H zPfE>vKCplIxXvfGT+Pc|dXnFcV;w%VZMpGyslW9qdVHvl4b6_=B7Xx#8HP4@HEwPy zog`kW8(lT%B3phadV>4;tT#irnrp)T;Ux^zW%@U6^K2AiovoV?U78-Xld9XN=Z+zn zkaH~DR8pM($X*=u|K4jNCFn|=dAH+xul?2~7uQP;svSebc~K&yHWveWd&y3GuL z2C3HzE#J-Nw71rM3&oLW^;c4FkJZ!!e&+3CtQEF_S7Qth9L!}3&QQzAz-u2?+=s53 z(~n-=)ucbR^;`PXQ85R1Gi<>HXRHD}56{xbF@7v7)p_TkM!sJp^k5J#0jPINuVN)l z=r;X=@OFg{g?%B#NT+rv@t2BV@}oAB;SQWOWhw!2P>+$o~k zLnhDc$P`MC-)VfZGR%L!VwDrx_u|QMoJE(1$BD<2Pjp=Qm zf{!)oVm|u5zpp_k1nb22_0Yl%b(w|BWh70YdDQ;P%ayB5IUX1xjlTtTkH!Fdzupbq z4uRnl(3IAda-2sRa4HaE_$G2=oB9G3yh<+v< zSCU_l$D zSCIT|k+f7?QKe#OW@vd(=3wJl$v>8tBCrT>Dy~KsiOl>kp!9XjS_xZN%{ioCdX#@c ztuuYo$?_#JG)7IrE6#O>hfqmn?3KEMe8=1T*ye=nGK{VH`L zP67z1HgKcEMx!o)kU-Kq3Lj#vAWB$W;V)Xtxrm%nA#j24He{7&m&(q)_rO8!4nNtn(Ng6 zHZtBu@`2fcDQFeIfm4Z?CIQ4zK5_d;=%)xtF`qrAC1Ak_<1-uZNSb!M{-c$(k7YJ+p@PVWIV2sxC+X;OJXe}5%{@y?X}$z8a;Y6ETmXdP*1!xcVutR%cbJjZ zB+XlBm_fR450Lv@EiUmA)2d;VyYaB7NzG=X?AGn1tmxxb+2NHUOh)Gp8~ex*+rhUCQgQ;OB;Pn*G2K z6;}t!gOr6SE7`1V^l50Uiy?k<@#v$wU1af>j$*~M`7tsgoZ7@=JUx$0OZ_>aNEXQ570vz!uik^dAF@RX~`|m z1R7D@1d^~Lp7ZMM?k`>g3V*2P}G)68@ z>v>-&8d(~VZwQ{Ebg1GN<*&Q?tTfG$Ow }WTSW_3RaXgw*`FI7Gtm>_hFM(LeI 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≶KW(zv${NH%qkG|SSUn_&9 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Μ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�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�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ǴDxSwe`%VA~Y|4 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⪙ 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%0DRTej^$O+Lf_ zNz#&`)^hse)kLi^{l>*AJ>P)+wicdH7IdT+TY4Y$GstN;tHyS_r4z1ZoQ4MBKR;Rk z%gaJu(gxujs!HtmxhHw1MD#DDfle*;Jg$RlML-K}u<&HPY`XPwP%GcSk$S4vC81tE z8EmKjpuJ!%X8%JU&Z2Z+-{2AI5?@z#D74m=P(VRj-eMM(zqI7;PmqS}U1PbP4A(5rlO$LJk%FKHtsQ-K&l&w25* zySF?bX4QGYjPkf0j_*G1ON2RaWTrzd97SUv?qyxyDjjsX<)P|O=0^AmVs|CLlCpYj z#xTSr9r#?0o~8J@H7iIHbzY%(uYXu_eL!#V>?F1S9rErg=Z9q4Zoo_J7w2BuNs`OX zk@@$08-}F(V7xXr5lw1}?b(kJjEhz!f(tn??8*mHK4uPV)1xoxOjhS3AV<-iJll~JOX zN&md7iPCy25GH*T<5J2IR;*)YBKlgkZo9tj^S2sdX~begX?@ECaTkS^;-xC;)q}TCMUEbWF}=cEoOd8-j(E%3;c{1#Tp|9fDlHkIt%o!? zb<0aKqKJV8pVQe7!(M7F%9Y!u2ilL`&ok>9rb9pKcs@Ih*Xfmvp}zDWseGpY>%;-TYQ~Hz05{^{J&NFGxTRpa8eH}o zIYt{Mv%*>{e_%yv{tVh+Ms+a}cRDsk!skx}ouW5_PV;6I&DJf>t^!dB&yb<4EIfpj z@E`|dQt}&?_}sjmT>Q=_e=W^2;WTTrIWjW*I;-DAuxDGR(5^Z^KD>Ih)Wg{Lw_TMXRg4UY}z8v;bIcSKU}!6ld)RIj71cXc(Cm zzAC2M52fBi5^y?nddEv(?d-1%`ck2MPO{``QmBPezZhcNkXXom)?bYB`o$M@76X&g z;zJLJ=8qBrpe|s$;r}@C{4Q28T{lc~UM4K;zOrfWnScT5FTXm&q0Hxo9Ih%~5PN$clgr`orjAF88qZYA7InDHnTFWQ^%*>Vq>;6PG34lU?^I zH3q@u@xmv3{Gz(6IOhk&WenGfBhM+jXLTl_TSbFEf>?(8uieaR_r%oY_g6nWd#Z)6 za>Z8)u;ri&JiBcBvfciIP|2d}>yD}KPjAq@V0!Y}&bhiDmcTTv&B{Vg7rjN)_cGOV zZ5K_PVOiSF(_W^N+E{>YtMJ>a0ve3*+Ki492eM)bJs_ zl%MLW=ii5W@?kK3yi(()u+TzZ-2l$!iKs)P-oAJJPq#V#K13 z4Nm4Iy8EI+*Kj)#-vxO~-{ZlLS4;O_;C#iRD4Fg$c&9GmJ+H);SN!OnjzMy!#}lSQ zJVItS$WMJw!eQafmNxt6pzTKkL z;No9Os2BaDaN8_b$tcm5#1_|8XE+Gv)z+s>$}VE!O6}R0J^Z67Fs6yI^rrc7CmpO($HC>3KtIeYazzta-(rj2KE1*MN4Xn197w1o=01mzpdX7Z z=NG;DQTZ)s#3Rj=36FEZooHe^`zQK~@{SH9@Knv!RS&f$AMi&_47Eats|pd^V{;~` zy4;^oiy#&F(boOsuptUYZta1i_KNr0{7uk-58IV1k8jS5f?~mad{dm1IsQv}0BqeC zw>YbOt1nhuK-zraL6(!EO$zTib2j&$J)4%pfit)|E?ptNVngT}1(g#Eg)&i>Rhi{| zj{DK3cJ6Brmff}AFb9s3I2a?G60?l6imKDhbgC_rgg0Lvj`8Z(i|R}E9Ka1i;j}kl zVzIifB0ZOhg0#S#xxU9VMrDof_q1@}x<%m&k}EPZsMTlnE@?ET_VI;Btgn@jVB2&I zh~M_{it4$;<8vn&)|4G?NpjAuv1YEepn?HT`a)sh3hEFOS%GawY5oJ#FCGU&!!PX= zlV1n0TFoe;PV2=_TUOS!!C?YS8J=)Poh1?V;P2^f9>EVXmS+W1bySci*8Eo+en`wO z@&eZnU0&EWfXi!u}%#J;X=pJrJFWUx^r-^Xs|kMbN_Px6DsDsQ@p z`3k5@ja1rR7o}rF%;ek$9Vp^lT^8kNqL>ya`}MR8l@o1#Qrcg>XJpC@ukG3WRGQ<9-0uVuq)~m4;<~+pQf!1$J!42fRCGvUow(Wf3*%XtAf=ug?`RGnNyKZ&1Hx z9lw_7$Es0?ASQ&j>NiaD6=xQlrY$7R6Ceqr0wbE!(&^AYErk>VK^mT~S*Pr>8M`T8 z19{w@CH*<@!eMSU@Io0C~QO;U)!w483k@yd<+3B-*vbcTUAATKG=DE3BIB_QW)I# zP^vPn&%=gDVjeGWvR2V(5xmkPvS;W|>Tx4%=NqU*PWbFRh;{kh2v$I2N%SOn#=(Id zG*F(124RLv@0LbqhyCu^QuB4*VcLKpqa?v7(=wKjRLc;p$Bbdm@aoGzft9>`&0eqz zdcK1goUBG$`tSXL?^?#_dx2jiQT!O6^Ap$ZDt;^l@#$sm83RB70^XqH!&?b2)kMw5X`Nm3?#! z-ZLJun^AC%cub>SY=7?mN<9Imj8}*+NFp&+M@5gN zt5WwwW6%5UW*Jhd8Bcf#O;8D*dM+3#)gWpi3Qw}9*^6uC)(u=Das8xo6>{@{hn!qR)ahdaw!o%eF7r?c9V$4|3y}ojX zsPnaG_!=;GN4{l~bC!lpBo4~QGk9c&Xv0KQy{|5%K*#*WYxkScue4|OO_hR&2!xQ$ zWxHWl$+D^G>WU#(IuUh~`qt%3<^x-JTZ~?Z(nbE zjngltzU7YQtd%2a!ueR1?yu01APoi-E7Ock+Qy}iiBN;gmx0|dE1#O{*7_ep?vY3C z>V3Qe*$#$bY8Q$G?NN*6w5m}@Lxe&OX&X^>$)`nAZ@Xt;0dB#G{OY<1c~(t4{a&zI z3h~n*>@qQXOSuJaL%;I3eiAcPpS;i@*NIxY#fj+HMX)E4d0HzO97Q8<8g6{(aqSvl zALhYmOIf4#3IrHRE~V!aGe=j0AaYdMl2w;K!i2d3&LEdD@=)(sR0ed_Km(;fnQ~^` zEwUS|VXmvb^5c=_GRcVJyto1jjezC6Pj{&8nlH{K5hiFJ3@nvh8!rA3qN zA!QH9{;OvG@~S;r6J@gv?Gx`i!PgQz|JLHDYFgG`H9o#WmisXsx_ZHR*5Rfi29@TC z%wxAG=jcH#$JlET!xKDIgLib8Ij>oK2c=;wUZ2)Fdjw1@h~c`M`MpdCiOi*#*H)FQV>8)MP_FRt>Gs zP((VPFi7{H`ZHhDTBaKl8at|S$&gMF7!X;*#64_AzHZHY=~Yw4b$W5F(qT+)jRAXC z&pUVxW4b0s+&*;J$%jLAA03U2Q?s=OMz2cxHar;|v(M$F2*kT|MjBsoez$nRIpz%u zj`nd{OZX`UZHl3@ZYvW5X;Mc}Fjb9s!_GjHdy<(;wHeo6qa;uZD_V`+gcEp_=UM|` zn8tG}iYYmhqu6XZHIFBhJhYtg(Y3J#cVlaGw@xCou8#@=ERcnrLSt<4Tj%E)7?5&l z$%8UI8RnZDHDAQC#Oe(1V%&)pZ6S*9wDnGk0GAB#tj79n%jZqVHCN8BhRdPlX=YL# z_>CK7N!~6gq6A3t#`Vo;Gd68D>#rD)KEhvT8IsgCYCd20I&dtm8LkVXVvDds43OJX zgkNA+iXTqDhB$~pjV0*@bKhzn_a-R4RBjQ#fsb(T@$&s?^}n_tZZ8`ovJ>zsHk*<(IZ}w5-YRcWGKg4i!rolA zoeYAF9S}JEO09!aDXF3Q#aIMJ7)Fssl8F5{r^ZA3nt}B*URj>D^D?cRnDf(DuH}QA z*M$82$&)h}r8lN(j7gGWcx zk1wrx^Owt0gLdK9Z=lOldUzU(R+6zUjhxb+LN+|%dYO&2jYkt1=c7UM=gqhn=hbG*E^) zzsFJhrffq3bzrP>ACGbfSq`PvnK}bJ!xiJ8-E4V!WP>Ksso2fKh2 z`K;WzWMDm7N*0|0$I#48E^zhRV7BfQI&;6)(WC>ezF4daz1lm@madJfSDRL1NMtmx z)nCT+C+{jVK$hNZu}M!~RJbgw6BO$)mdrSYwrA3(Y7a#3>MTYKz5*s6L9b$?ND%Dg z#&B_F9fMEcH)A!0%@%qv%fCg!aG0j=g%xqdVo+ znvAddeV=?7bF*DDjK88h<^v zWg}{E$#1Bov&pDJ^w~{e>?=9>@f3wck_xV9QIK-UVz9dFT*dQ>PPwsSP|#aJX|0_R zjzhBv@gSo5!_te_h6Pn;9*@MnYj7#xt{vA}S?_Vb9Sq*#+?#T%en2hst~l?5a!?0H ztH+^ttjD7j`=+8T^^+<#&{4tGwYa?|YLbZ6X$^5!OFLZAd(w}eQR-s+K<*O*KW554 za0Bavy4}~Rvu6}yI;<&*#~nzB<;7+QN&Vpk`1o7=4HT0LQ3s6Bt(0e`8If}OmI!FqM}IK`~0YAuXeDrj z*DPO2`MPnn?JLGno!q}BzOQ?3``O5XQR0U>W6_+We^;zoxXVv@&oLt=Df`8XB~+Ac zTeWlR;FsrD+djH(;gpl#7Z0Z2lqd$r^7TW8P>Lf$z>*d}1#b6icbMc{^rZfA^a%=@Th-1O0gH{l47Lr63XY zCr)cS>h>Iiui8%Z2n+&;-kf&rG?uh+{sJE4PxkIh!4F420)yUaRm0gJ>7i#rIFHa+ zuLNJweP!x(Od-e^uW;f$?Q+@h`H+1(G>Jt;Vx!zk8)Q>~kGNNzfva<8kLGnO4j`?*C^cp%Il(hp7s%xHeb%dnhHEe9Ne}z# zS8l^Q(VxXEDTL+<;0(04(o)WJ$)3(O4F()H( zpIVDt8N|P`^5!{E)d7}=D{=o^#gF1BUvQ6n6Y* zJr_;Y$8{e*FgdN+vJ;toQ|!NFGnlAIZsY|o zwwz7as{WKuJ^94xXYMi^@c5^ddSrNXOel0E%R5%6+OCo9Q-*QElX(grk?nqm(IB1j z7eIWULC^6zS5|W#40?!X92#vu(X~7I`fhhKMMd+xT7S8MlfsNBX)r$GoL zqh>XzG1if^2`sd)?8pKz389;B%_Ue#lfDQ#9a%O3+)|I40R>m|_7f2pRPsgf!FJ#C zUQO5lnZvet2UjD*!lNJpzg)n~O;SEALQ=gLh-;xHZP&xM76%-0zHvo;4;Zg_G*@(M zyMSkr?>7r{SM(}>C0O9FAFExwl;AD9B4u?MR4w{=V4LsjbUN6)>(D^Bd?McO4A=}u z*;VQc^+{9eV<(wK^qxYbB$w{(07#FLmlK!ftkfPV#we196!bVk0dl}1l$zFIt&=Op z-`CtvU~ueRHyh81iz5}?-66!I>v8$$mDMy(F}+WDO|^;jdipUW4X1(TO})zcgc+le z(+hQ#ulI=S?>xTnq&B$w_(8z9rvy3;=;wnb3z~u8tq|oXZ8MwT9uWLN=oio{b7@J* zr^>B~4-Vz3o6vkyM<3ZQ8zXv6LhrCjeMD)zry0Q6e;VNV5hLJfThs}|z4|BfpY7K| z(+U^bzrH%3!QALmo=wzlf0S3h+mwn;& zVSVM+naI=2imzmgF`hy_EC;+3r$Q?>SJP`*qvQPVswgX&FdBF)r6h`QE(#S@rJoim zNSLFaSfsgMONP#j4U(0TifRY29s|E|Utl?ndS_;O96{=(`yI_fD&z(Hhf5QRC-jFd z-uMe|1lCUot%5|E$ZL0xZ$tFwLS^ZAX@{h~(Lcjkbi(xQ1k@ z>I|T+u)+>5%}~{VBy5$E?5SYu&h8iOv7=Z?}zyA`&EVD@`;Sf#4-x;+` z9^3vUk$)|xUyZwYpR-?wBO2G!sqnEgy|0Rl-Hj0JQ3Czt|mCDE^;EQ?}qW zcJ|)ycD(30q;c$vP?6Sa?aI{1zS>A4YlsUh+dIh>Lw8G(W@&hmeccG^ZIZfDC?UZu zHh#0cP?Muoj%}J6+s%-;ybX)~pu_ljIggtuck{9ydb#kEADF8G`+8gh+_(OFUFbQ# zCaLS@d;e#for~i|(zepCZ!&TP$DNI+&(yENNWH8}EscuYB!gv<#}4c-_d(n?tK?l= zeN=hK%BI-Z-oKzik2&g5tqSZkW9m>^?WA0g_4MP8esrM64W6z;%LB_FEA-}bAQWHf z!F^UlzQ~vUqWw!;!oGjyqotzx#F>ud_~%nRQwugklhhx3yt>K;aBEZg8%`GuxM?@_ zKH71~$w|}UNZ8)cO#0x#{N?()*Z-c>u^SPCo^Am{VxifN#~)S4Uw! zI}ui)Pr4O;izdd(1faS{}9))Hv9LwKlAIZTrzTXE^vMP zdxElOy=uuHkt7(eFl`(M20uAfT=H=Gzq>&TU|kad!q9u!wL^Z#_1lKwjAmYmVGrCW!8~SC2R7ppWSz@P0k;j(L^26>eyf7mO+mh89Kg=#gFzIws(k~AxzMZhxnXWJGMt6 z%(Yg@7dez;JjX2aH3x}90rKASI*pRFQbiHl2=eh#Ozlb`!Tts?^CGf|sDHe;0G zcDRN7qoL-yxrq0V{vTy;8P!(XwTnJgN@H$k?#p zJl(-41)onyu1)o?l)d-_O!$2(hihr`$sXml29w1uAN5Tw%Yk|Lu$NgzJFHYf9s`zU zQL)B1SCjoMS*^Rq+3vp zu46rUNh5x;ZG&!h4S@0}E>ikLIVY3Y$wLB?U|=eCGShr+UO|5H*)1o4GCj(+vGIM# z1LBRYb#YkR$j(V_CNU=u!3<0ZkZ+@>L0xAp#aE(U>}{VG`-+QBwE*EZF@Re?|LI1M z8>?NaGRXwNKbKHx79jmmf97UcQ4b+et;Qw@Dq08hpC*<4U9VQifX3oy-q1=3E&7yJW>q zTOekmIayZ&HI)r9j>s@R8Y-n#8tH^y+f`2ZvJC4fYpWknY5FNa!>&iskNk{8CuSj{ zsAo`DX;7_n>`Ry6s#hKS)km4c)?5TKDaZJ=(u9C+r3;gTYy69u*OgxWfgGDOb)sE4 z1T{fGfvmnUO6SU8&l>ia5Phx1*Y;NB!mUcH;(S`44OJcdM&4JZN(oRjP~cCpw}%Mc z(>c7>zBCEBI#*bTOtwsOJ4~deW7&S)S_hyxK7UmC2#)!itt~Mf`^rEe!9-B`{8 z>P5L#nohCKq=68Q|MPPlHGRnyh{o)kQ>uD`xF&}@TGySC(c45`M|eft*d zZ1vEdls~f$ywSx|icuf}W?RcwH?ypL#mMZN&K>R5uFqP{jYnl1)+u~DzGh$_Uo5#v zJUcIpAVHMZNZ)Rl%d_cOwaO_2T}X|u;3Jy=kB~pYH0;PU{h!A3M`ROh8XaxvSrbyD zs~qch$eD5_Rb=#Pp}nU27B`>f?I)`c#xkh8sBId=2O7U#GOo7!NKo2Morh> zm9vzDIJ~0&3QJv^Mh=uz`*1kdWZ>2L0RGcbtoD}nw^y*s?yCJCM6Rr#3M zfdu?&P+d^BxtyFc-v711+)25!(JWYtd4*U?ooKsqvMhY$%LUL5k$t$lq3Pn48N1f+ zxrp&K|EO``X*!QT>!xPdtW}u<8!d)5^fkhwnJ*yX+|pJLTOVzI93eUZ2^JgBDjf>E zN(z_}kddbB{8ml}C|3ljzcj9r&`9)Pd9?V0c+&GE{oL2UU_ALqHlV+0))l6^THCXc zV-k@cM|5ua17oQbu@wA@`0)ynvlG)j$M;rvcN}Y5)3vs$4MBZv&%8MyFHl;-;l9u7 zeOWh5&~<;vJPL&lN)Pn#b1D4$qP_|1LJjU68ct5bkuR5&1X5jJ|A+3iF-w{SJz;WX z`n#H_{PQ>D_4I6cWa!Kb3FcSFjCpS3s!-j@$|FYXzeJPbId#IgpHf!h(I-DVuAenZ z5I@i2)Dku8fP&a_ByiI>T=;w0Mwz;(X(3+LnUW4r?}BU9X)0~M66-BHs7b?5kO{Hl zoWX3ovOoQ)GtK#XgvTPVT!I5jayu}ham7Q%=HZF{F?Umc??f1BJrCV2wefiy^FK__ z&n}96Hx2w2ME5=PL9!0BWU9pJwQtXtr`U>ob3>cXW?J3UENHK3TqSXi;rT#MnavZp zh;OWA#k&M7_%4+-Vf6VFHmacJQ{6kV&ycb%CQJmI_}m+RqSbvZ#E)NaiJ9ZqftXy&c$878l;R&NV#VWNtE2UeY{R;E~`0!dK_sF z;HAUb1~Q<|*3X&)4<0QATBq>_loJ9lDXn|-XJUgOEKR!7?uAW{jLYGx!v(kVtGCAf z%##kLfQUc1i{3pxWydM`U3@-2Jan`r{4@$8LiC0D!VF1}l7}k5c4kT!hnFA3gH9

    MJfG0Zxc^P{<_lYh}aNt!m1t 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 i;)h;r>7 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 @1!nMxoutZwq_vg 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 V|L11s`0a?5*&CVqwV4=G{s*z_#K!;t diff --git a/code/script_icon.zip b/code/script_icon.zip deleted file mode 100644 index 0a98f880737cd7e008ce563e4acea89899d0a505..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1954 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 ADF6Tf diff --git a/code/script_menu.zip b/code/script_menu.zip deleted file mode 100644 index 9567ce5ef69d402a61313cafc64a7fd11e153295..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1790 zcmZ`)2{0RI8%{{Y(YmUojuvGl>~GVmhR{}#>Jr4!h+cwCqjgk?Mnq}IV%L=oqR6%- z+9j&06=%C{ZK=eOl0VM=O3*s%K9|n^|8!>O|K6GJnfHBXp7)#i-gzFhgCs}=002k> zPL*%EGMc-TQ6KrK_XUZJ!R##(K{WldBqZcbZsr7hDAMHB!f>0D8iXslfvICU zJk1)F8mzyF*F0%&Q;*-nm}+Kv=IRBM8Q!gbYIqOS?%9GdU&d(s_N6c9u(T(pXVEI; zKJ^0nkUX;(C6_hVHLcBTje-6 zW%`#>{3D83lV3{Dx6x?h9w5{;wBb?6LETskm{@nbJ^4c%X2xJ76ZSi*yYpkSUv>k9 zYePRJiblH*uw^{wB#l}XSCgdnR$$%~#{#tTgb_^`&hy$XF*K~_dsQP>HSl8~;dFGj zth1G^D*NKhy|_PUTcfxcCM^De%apEqg#LK1`NMOPhc}~;unhXrsK+PisIGn+R2;o} zWy~R-g9I1fo+7QzEG*}HS1M^E# z1~ziJ)5I^=QmVCbam1fVLcs19iU5@)2WyQ1R z6v$SI!c9tV&63!}a@yy;63dR>GXYCnnZ8VMK1DXP<&&HoI-em8WB*vGt<1o_I*BVrv<>j44&fMEV_9hrSb~qt!ZGDC|4*rJye&UoGj(&9}Vf|*9c*jzvdSRo9UInN8(i3Gw z3#}COlx)4&iol0IR2QIv$ShwSpP;nrt&V56qt5SueNB`-i;L7osV9D|Mt%}IlZTih&M%P_0_J4+J-8D6f)N})P!Ebi! z3LN1xW3SaYZ~OA_Fp|gR?^Ul&ZYQ~@M|0t-cTg2q7{rmBt4c?Lrk#=|l<(KA7EZXV zQ2jNw%Es(Z%u0l6pbJ{fTC_04>?^t^lM$Maq8H6L3L&Hzh8@DWFSD(08fstEa4aI` z0>5UXDi)ejR{fwVv;&*W@??~SuF!6bC6Gz-xgzt=msyQ+Yzwi%#BI^C#X+I$W7P+z z6B97Ysw*9ywwrTs{hv_Scu=-mdViivSsfTH@VS2nY+k0rvdddQmfX(Ek%2iUZuem~4@f0t5h@BzL6<00`U_ z9AY@}0%ORj0j3gPVmha_2D%mqr!{FvC_CCF>D8F-F+348fVHq~Y+SckADMj5Tjrh; zFFYw){5-Zcc|TCFw4Z8%G0E_%RNL+h0<#uYsK`S~TK*TfIr=kIea6TiswG2)=jAjN zzUK}9g!|D_V!aho!>?8*#ZDw9f!}9j(ORJHzp~GAxju*0e~ha}-ul#@D&_j3&&`F> z%c>C)`@KS90z*kCtHtSRMs2`i7+Y-PyNnmqah7~13o@E5(kWl z=;0krPsc}mII4;5vjYiNan1-Md&jpm{oSi;`x5hHpbhm^JOSLg{|58V+H$&f>e8U_ zl^msy^De+}6e`A*$Rmt?(ESzCl7I~gmT zl?s#!UCm!_YitDbXPv(ErcWdwV% zhk3~U-2ejA00Z#3qDERTaHO`OE5%X>EI{OZ#cv1vb1l9dK;Chw|1Qb5%-Zw&wM-O+ eK;Md!-Mh?__^iK~_ekx&OJXN#cJNSp?XFgP%` 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

    m(qwo<6mIw9RzW`{khDf;@x|>DDWX>Xg}$gj zpzkEuS%<83L)QNAwy56z*j9V9%I0KbQb9GxI$2#tR)o>bJ$09>lfa5{kY+0=IIUyd z;jd+zDQ3{MCa>k?ZDkTDxq~TMtVpz@8-RqJKfSurtVhPmKpn&_D#{)SiC>g;g<+1QRp81q7l3;t}! zl~{NMFZ%6jTW&Rvh&J{a`-eM?vaPS^U7Q!KW!7YXgdy2^f~q7@rNOMyIlr0 zj9>~~IU7t%)403#3gSkV&xvj^;Q|cP;~Ft{{sXV8!K$5G42tdZk{9wGHFJ|Fxhp z7pNBmBL75CWcY?Se9H!rCeh;SY6nd4pc}+=j#Mr_Yji^8GJOWu`d`B0ya0*_Jp*;w z$ddDo%HBAw#pMBAw(C>IY$LmRqMcI@*_OZBB;K7#9~bTi_A0H{{uX&7avBVHO4md^ zteJzCP>0dF2HLCRZPufhzrDU;0LIa|*N;}aoP15`YKAxeM3x@=y-isieE~Zu85OpF zD}ZWeWCWfR7I+v#z7zyLp3hi>OB9?F3#>k z1zs8(1G|eG*kj@DF11mW*$xv;w`*?;If8~yqAp-IPGp&w%AUBICa?L1jK;CTmX;O2 z5%dft5|vW#`d>aSlyrFZ#k`6eer`<`og*{BNrC56h-t#ST6q?uLR!yuAv0bS&{FQ) z)Bzig!ft>=qHs>Q2Y*mL5$+fH>m^zkt&FfB1T`WAh-!ovMc*cp&zsq;kM{bzfk6lW z0A=J@X(78h3|=SA-Y(%If6R2o&zqAh(u9k}lc-7>DYLMZ{Hw6#v0XZ-IvVLysK$mi zxdiFznFPuL@r_-<_f00sdynnLq5a+kXAI{8>ZlfZB zJ2z#^#9H>pAig!|YeKtKzEZv9j9 zD}!cch!an*IX5~(5M%_&%|EB!faLefZ^K;`z+@l%c0T5 zyn;H$y>zjD@_Bq$)4qfH-FEq6XhuquKf|!Wy_8HHNOT*=ZJHy@_-o^C@dFyRiKpPl zV1Ciz-Xpj3*5}E&3ks^Q?o!^hiXFfq7+3(h=MD4E(DEl$jdYyVImFyv1Gz?^;d$@;()Y>;On6paFN2}KEH7g0IOW4mF|A8(7Ay+yx*Tf zh>I114Vg(yTxFcf+Epl!LbUxY=b3^=HSfTyflWnrsubhtWE9>!(Jg!^;1&XBJra3L zs6kk1T=NgFaN)sBRJQE7#5K~wKS6E&HzDhVFTTlZT<5c;S_3Tu3a`bL3>Ux(+%{<( z;i?E-A3S4BKhx4=qu@r>RpCTeu3smKtM7cymGt-6jn`#FE|7g#jX(h%i_KL_8Y;(N z9z~4ZdfvpZfdUgcm3a71C1q)YSKtX6~S4>)#2u} zE=P_-LNxcT4rNT&Cd|NYIu|ZSO%Ogkoj&^J_vqLF46@R1L`tSEucC|Mc#oRMzJ^Oo zG@D7NC#r_ZNW>8UY;&ZI&nAJ!laN6!>WS|xfTsHBN^bs{Dltu?G(;04Z!j3f96||d z=$gKja$~aMgkrZ*eW;dbPi^r~xK?f$yQB&pgdjWB7}ex8$~zgCp$^dpe(<}s!lqYE zVP~EPJn!O>p{x;>T3wHo>DK{{kriXT!i#&RE!5lTMgLOlEEFyFP@AJI?> z5i#9lt^*8<%g8qQtzK)WV`VOG5Vd5I)etc+NoSg3atpd8Tde!bajkwH2TQTbE0G^s zxroGtvQAUF>_^=>b85%nLLQP_7WYw5&zP^WLI~teJE_4s3T*o8A%Ta)f&W32`k8T& zrJOVCaQRx)n+a^3eE$ca)B1JBJSMq45+*8}IR7V}r6c@L){2hzY<;4Bm~4D_UY`jZ z364SwDRFFQ?kNXHc#V11<1CW=#)X_WzOIKZrxrLTf=Hybg`hNX0^leT=g7u7yyqnA z?LtmrYAdO5j0*svfaa8h4i4Ib$G=L-$dY4qha3XTDKqWQBT_P4y=QQcJR>4=x9!6^ z?@vZW3~P73jE=Ej(uLiuhJ`7(a|pB0=%2jsCP5?P457K5UE8PModk|z)q5c4O;|qC zH=-plfBw8qqKr*Y{JrQOeK|`GFKy@V<+GO-)R5#x>`EmhoS&)J^9~c0KyDTRegCWz z2}x>R)+zfl5}ZPZOqLu#paR`AH0En`Oalf!>shGt?AMR+Y{_B2ti68f;c7KvpmXUf zUaYq7$;3pS6{VP)q`l+2h)p?Um5eZrLC%UWs58Z1BqSWBIV_B96K7mCua#m(EHPnJeS#H;;Q=7Jk%Vd{!*DL8?dBU73JgK{c(hqR*p5z4$Ms zPMG?QAJ|LxD^sSMa-2WQ5ah}HuxNi0x{i(1wFJ1DliU1QJP5ZrPP6X`)4>E_5R^5H z6m0@AafbkJ)4cBkWa@2=q=TQbJ(KMAmnv{99BR?(`SU;zH~sZxsOj0nDfc67U2yYA z>>1efB1#E8WsFu+(cC-`hI<}@qU?cR=nXC<0SWhgRbhQxo!k{SUYSguD_?A!}HS~vbznd8o0zX&3#=TaMB5o9Ehjw}R ztJMU1-e|Y(^UUiAOffn*$`>;GHGtEeZ~ys0N8z#{*iT+^d_UmD%D`7~%Pqv{tt@=& zb8A$N_%RSEs)V!BEy7*BW#4fbo@vj>^~bwhv#zp@_QdC)7cv)JSUq%|Mbg9A(xgG~ zMK>-*N1kB*J}`kKuPUkUK=v(ssV?z)lFK{hG4pGh0(K$D2!8+PB6(;O|H*+y#xZ0D z2XMzaUm_~?Oe6^l;0<334YX4&Gq(RKsmEjf7(W@amGd>-7{gk`%oK9i4p2$qm*M90 zY=ohSdPg~E-Ast5fJLr){tZJsh{pMC7;hd*=!>JT%oiEBhe=ZkcM37cjwgZjG+8VQ zJLUgD2Ynwotn$kKd!td%<_d{)><^kAYMAhDx%Qq^(xE+_@?o6*g?i+8Jv59;9XpYp zc2zG_kt?eF+y_jdxf;3iN#U@THx>=|B8B%QufGhiZA!+TBCQY}|A~0fj3rDJf7nN= z5c%8Y%R{(II#9*C+m9-&9TvFA!&@^+7&_;s7K<6$fV7nKXN+LdNeERO=_F-I@x%g~ zK-T!<+Od!-fm3|&l>pJ~#>gc!^7GUJz6^ec`Kk!>gTTz8p;g^#%_gem_8&Y>0Dkaz zfyxvI)&x%uVekBHuv6R)WZg@3$1Vld$5;n`!^^ah@37+z$PXB9EIu$3|~>=;*+ zF}M}i(L2!ylaw_B$sV#H>&#R&Vc*UT1>8@nygsAPP?m%lDcc#2Yx4@(GIPpeOqygm zO=oOQl)A7uu=QklJ3dlN=?T>MNPcU+gT`lJv2?nHqEbt7)Y0$Y?LP%!!XkVZ zS+kY|J}d_j&0w6lNb-V9=ZqB zveu4!j+a$jq$>^U38HMaMtVtdu`pOG$f@|zoY@RRCVPouZt9i_6d2;rgkLLKCeLO8 zkLow6@bvf$ii|{)Fj!^+8xnZ=ETT6$lE_@d6$3=3lPp(0^&}tcN z%)x%vf({A3J>KcGNZZ3l9#4AN!8%SI%BH%W0O`f0oOUs zHV&~A{5LcS1fpqug6Ls2-z#6+tnX#y{pLOuFbW^fP2i6imVle^h}{-kzPxTuztEU@p)^ zrU%5uo8T>7)rDu40Pqxq`2hYI5Hh&RZ#>A|wppi$Rn`)2BZq@l)9MN$3dlhClEYO3 z>-3xt`y#}yE{y~_+E#C-rd`BLs%Eu%^ueVJtxS-n51PrsDDq0gX+ZYGH7@@o#Zc}f zRj+kO9WJNqfN3KW9>F8Dy_BL}C){w@RpZ|+obwD)IbCwU4}@`vd>>&O4g(-Mb)rfx z-lFYi#N*B%aVr_s>b@+(1+K0)aAt#MIxfyQKKnNw*F>}tlr#+S+F%FW(odD&?C%ro zwgX`*hlvV3=?*BNajenKgWJ3{fmG@PK*kA|H3Tsr4bAs)t0p~&Y>;NotHd^SG1y5# zywwaTP#0ICM|8^}?B&=wCyE)SgrJEllXe&0>u1263=_nL8X#%5LndrKgehbVSgHqZ zR5|mL7MSZTsz1u6(o6bD-#RzCBM6s!{DE3<&aM3qhM#WFZCoEYM-`5F7_@-y zH{KrN_NvHCk(=t>#ce5gIu40=Kq>5)to;OU2@M!L~<@Zifrhb z-dXhn!xU@niVval`NC@1+ysD6GmAo;77P`?2KDi-%GF>utgORKJSDDc9TKIHtcT^g z9$ThQ{#^!z3ohF3A?N$CgT=v#2IRVs55Ek~_5wUSz_lCX2{@cPHbplw`l0}Npg@Ll`nUyj#X&y1Vg7<~5F%c_H z@`BQD*m5;wS3e=83z;r3T_5o3d43nO=g#)@-1_xMc9Vsbo+cQw)0!(u2E|QJy@;wa z|I@`cdqy}lTA#|m0XTyZDz&3j1`EO47IkeZr@+p}=AgMe9hUP2L$KiLY1Y`$*U>YG z&p_-*=*c%3)B+{0fx|v(H9k}V@9SOSk@=#2vJlh~BH|Cnd#BkC(wey~RCs#}hnR3b@w{o}W zN6|$v`Je?Fb>ucJS`9p3)}4EVLl1mS%-0(}9qwFK2Zi zAJvA~dnqr-(JGIzV9~~p2PLOsBNKXS)`7J(fxKfMm-&5}GFb(Y6q6u-y3%ES4-?G{ z(u`Ug8)bEjSum$F7K&~##Gn~neyDSV-25f8)$`3g8iAd60qfoOMdU zB}~gZOPt^xEIujP1!i=Z34s>j%UMwA{S95YqqJ}i!(2CVTB<`Q;OP;?2qKNNj$?4f98Y+q~XX@lx{EN zGSato^@G5tughI_$u(ONH5uD3C~jTmb=#qRA?aq?mP9xM&1Hz8+scYGr=ly- zp3P9JIKQ;Z?^V=K7Prk^oXWo+Sa;$Pe|m+H+z=h^Eznc!Le|1 zI2CQL?MRV7!mok!AdLMdt|GPpEWR5M!z{CHPV`UEtTT_ELq#bQRCc8RGKx<{P=W*V zXC0@d*eb$V6UTraTl=qF|`tm&va_X%GBaG_wdaZsn$!(=It| z4x;?2Mo+>|8`vyibjZ&zlun^qGg0my>m&M56_4FiRfQfV0|saYU5WJSs1o?oNIJ&Q zN(XT`hGEOLs2T$@bIF{uqm35KvAg#i2(w)Cl?&mRMuuK>14{FdonUdU<4ksP)Cw2c zT6$IZV;nFYdCSiunNZNmzr`fzvUlN(MvS*g$TP}itda3oPGBbfmTte+od&XPBYyQo z!2bKXz}lZ$QJ;H#l$-T>r5qEKvrwj(CYt&XV*3RflGZ61f=vL~2Gf|WjPMzO;Ed$# zZp_$@xITksT-xf8u#&Ck6Q2%wXi2C_khrdUmaD4JH&VBpf6z?{wkRV_8 z^EPX38z2pBB)k7}HDVL#vhH!c|0;0u?tDHei=n?)Xd<8o^gzH#lW|Nqt?~TQD;h&S zj&fWTcVE%v^qQE541;Bb?`;V$$X3Nb6ee8=x;a=rw#a${T9dA(ij;IAfGz@Eg^jT} z4}8HdNu+EKpUNAE3;&S^XtF$HF=Yba6`YUcK?%KAu_(RvbU5Yy-4P=fXNVh4(Yrw2 z0q&mljSVYMC(E@6Gmb^NVrpPNlPEjQ?kPoTw4+u=NpZS&Rsn|H(Qo0@;{Xn+oh9Vl zrQV{@d(Hb?1%Lttrwc!t!D4p*+C`l&*SLg2WNDerDh`v(l{XrR2wv*#b_zj#m-$iL z3~Y6hP;JBTx4m{Ivte3W97}#E$n{U!T|Xc+$Pk;Z*^I0>DRBC!fK-9eEcHp89X@Zk zJ2S|*ULxuE0_Qw2mD|jvnlSR9krtzR7pwZl@WX7CHe=~PSNY?}xX~O=!?|rY3*Cyr z<-^8vlsUy$hN=Txm^ZIKNyIlM;3SQe2}MR{C|T#sUOT^Xw3!IrJA*DSUhx~skL0CPrTAZ_7a)vwX<@NnPluEfySsTx8a=ZV2qXvJZWWrwT$O%0 z&pqM8P@E&~*wGw{5wm0cJUCE4MDP|80x2}7!M6ODklcj&Im(R2v%kFUz(@!Bl=EEI z@ndt~JxI1%L2OwHsj1auf z^7pLIGJf4PLG8w0g%kRq6E;eb5cdIH%ScJi21V7MOsI|6_J$VNf_c7jEvHLdX4_pG zG{wrWtKv78Vttm1Vcg0uQnvo8%#%Ir0FDayP1u2}Zr~^V!!zeOCS2immOS=s_ZA7@ z7HvbjL#U^b#~6i?0@wQePnP47xFnYp`1?PWj?Ehq=buchG~bW*YY*M|3fdbnk9Z|! z&s}tm8ncGWpijv-Sx0JRu(?O%%UdbsO&p;4^VN$@6y0)DAsuPtsbTlMm#j!08?gPi z9cGGC6H^~dXspY{8FHh;`QFch5xfzaZ{*(|t)?erEgNgzBfNX$i-r;pQHICWL!l)0 zI*byV#tr)&%!lpDEZ-&c&H^aDPF6(XsL4GwlJJVs!U64UYY#Ie+ADF-2kv<)jIL)C z9AMNi-g56G(Pkkg5vLDsShnRTjF)I*G|eYZ3pumzDPZs}_c!Kj{Ve=c?_m~l0qdr_ zC#RfG9az<7eByu!?7z&PD8NKPj(2}Df z=qlwGSiJsMLo#fD9iNW!8kgWcdU{^BYNGs7h`|H8BQg&UnrpltTExE)Mw1)Qif)|1 zxU2Fqxd^4FV-MIdTt|lw0P#MGazE6#@n);yGx^|HYzs-n=y|I&eJsuQ!#wkd0`TlC zJA~%7)*szt*c`19;sRSZm!xIwBXt*yF`z+N;j51( zhtheP3MEYKS{tmg4K}sADWU#{kl4c6sU9BZg(SX$E-V|=Qe@Bg7PPxjkeE&P^-4!` z^N*1SyHP`wU_%TsH>IJK*j@X14FHow285DxgVgw#}ZH zKD*8Q%TBGw{_)sX1`2ECM&c-6*7WXkvwxd9#a@*bFT?ZJiba@ER}R{mb~JAEu+UehaBl z4d_==g63!!rzF2*8?MpQ7MwFp#G;=p57skQyrYdyq{tA4DS@c|P z9eKHh^>jO3li)VSOt_~b)h44yaye;3JCB4N)~K=j7u1^RVyQ{_)~@#X3+2W&dI;6b z9^bG1?q_BWU^9JHft(aWe!ty;>bVdXZaNQQ&3sEZ^Hl)mo|xR#!<{Ou0{)+1GLdED8aZU!vCeeUCO+ZYMb|=cFo`Em-z!( zXecS65oPRP-_r;OGO6BHlU7yfB30nwigY^@nv1K3R3VK02j!As@8q|6`BWk~L9uV= z=hPxXNJ?uI&JgFw9fv#;7lJNX1z9bb808m!4{D4zl9!5-IEcH~S{zo&IrC%pohWH~z7QWuw++V&EKnW%_;q)uJ7 zFbILVUov09?|}eYbC!bbL@NjIpeiY>hM8Sgdn`Hi1H_V9v6^IYTuAG%DZx(-jZBh> zG1nAE`WK-kZMr-;@J|H?SfxC4-zIr3A!g>qARs%rV8p6QyHYh^as%-V~2qyE)8vKia(GU`~QcEb0~F@a@?rW#^H=E3dG zSRd<5GN!n83URT+vMv+D0=KDi&QzUrb+;e*UZwRiN`JjzQZRQ!Wlh$jeI)D)0et?Z zqWWx`*2EWqh?c*87f^(V0q% zz)r9T5a(OqE&O;K(gn`V4^QZd&jE!4sX(@X&)&|MAq7%?E!EMD4B*d~6uJVYGdPlq zq=U|b79rt8Y73;!i45-9?mc<427QCjFa7FatJOvG=AH)z=xm>`{fr4~Nc|~{=S_H1 zDN~oXeX#q6H-3z>l1w!Rd1VLUxZJ@XZ7dBld92{4y4c;*Uh4rLDnj_b)zaNjQ`LX& zVBx3hljDJu@F4 z_l{Ck5%J=<#CsiCZ<_cs-TArwL&ip|c0731{0rdTb5k+=4!N@K!b2=C`@_;!VF!n` zOnJEDWTm+#4>or)Bl0He6a&kc82i!T+zNznV@_}^4ME2TWqetnlb5h;917}DB6KGh zQvoD04)br#qqu;w4AF2`h1}fpl%ap3!!_^fsa0svhpsV8E)6UPV!Q50<5t+TJm_Sv z3vwKY4k4>s0YsX6afMaz2?h$+^tMnTem|8gv~#K&B~L<1r*46Sy;#jEKkFm4kA{ds z+Ff9%&(oojlYx8>9#tco%^Uij_4yXcUkrdFM3UdfMtm~=O2zvuZb!qVG)BnDA!z{o~9T2vB8@x~)#cYRL^ye&3Ued-)@o6=T& zc>aWD)sR&e3OJ->d|uR&U(2x!Z-D`MCcmqgw4+rFG!q*zZvxcahS)+jRWstMcKxb& z`o@j<&^crf;ri?N1QWg=_^*1NnM&@lpYs#GkdsNK+V)k+nS&?x+d1kP;5H9WWx?vl z@s-VedHX;2GY%6cq9u_?{4RxMc@++w)Mt7Xhhj^c-R;#hVRY?d8V8#-BMOmPOUOGU zTd+Dw>W37Nzx1(j*ia#q2TulSo&Z&`?z>{G zIlS($V$Q^h)I|4}wXF(}$5$~URADN$O}CV6cJVBf`P2NY?;#H1eDGXzV{^0)WVhyE zWT69j^fK$1uQ4)~w?3wo0+*>A<6Zfweq1o6aqxGVgO63ostXwPv!mQ%69LOr1|Yxr zusosvGD=6TuHuQ(lFWeO>pKEmh=NZRs8vgz2}z4&IaFe|P(2xPgd!~+VV8o4bUsyg zl%+dBN@oT6RXqBf%pHkd~-)Phk zkzrkCG^`+W&m1!QOPE$!ma;Jlj7c=Q(4=3XE}iX}iPqnScjrND_Qys?ybXwItT_5y z#nnA|nb(Y^I8paVoApn^bN|r%{Sh2wAyMItmm1RanOKAYjMTv~24jKTopaZn^MXH* zZyH~B=g}PvuP2bUGGICicU=#aqlPH|z!UYRkkCoGslzwDyeXq}wu)T2I@RZ-1SwOC zff$}VvU4r3R2TxJNE#zXEwHJb3EfXX5PbhTAfM9~^lYc>_KzCWJxPx1IwFz+t2m*- zPv7>+y9}8OTkF44No*?a%KZnH%Z6q=mS)te#RsEg%N)_3bMIVDxgHW@Lbf;TbW6UZ zgpB;;uNw3Zt{}iI0b@6yrM+sw$#QRGl*r&nq!w*s+$Egu{3p@9g$arwdpFZa9c+M? zLR+PbRwLZF#_irM>ntgG?&P2$yQAe#Q5)4sgTyjE4AC*hQJ42%O+$K!$X{n<_Bl;- z)}g$M2(OZQbxYvgOsW$bEwr4W3iQ_;t=A$B6kFQ-P|F8L`K8O5ow)85CLPQ65RNuZ z`6rwsWJ6t4*M6TMm+{~a4d0H^A!HERb&%w8bKYX!Ih2=nXz%i(`cT*Ys^5Wc2^Rm| z51K&yOQf|x#jH#hc<%+heT}<1qGZ3pPr5D#8K_6ZVLD9Z|xaW7DsKRLF};K*v1a|*AV3VaGjlJy#{!jw#7pAi~e)WzUitUcL98uKb9O75)QFW$2 zgPvuIIY+tMvN2jmVqPT#D5SCzE;U4Zrcg8*p$cazNqR?jpvh;rQ9vtOqcY>5w+~4& z7&ipCshUcM#iueuVy4lc#$AiaNsM}KaKIfdT1A4LB(PMa-WMtpW|BGShmv^XHjDLS z>!>AzM6GJNfq6s+$^(YYf>K``$O`8|Sb;!uDGcMMmYr1R!-3@qc2#N3MG z`Wq*Q$+IhPW`iEnvEI6R0}V(k`C9B{NrQ?ROyZAly)Xk4 zfW)+Blv;X!my9e-4&z{P^Sn0BlDYPJAe3%dr+c zUc%2cDw4ar@>S|?w|L#E3HOuTBuPB3@ z7dY8GAy!CL?-)Tjs~zbg+>fen4a0U{S(32|-Y{g}B)D_~rVbWEbXDw4ONhxM1X#Y3 zfDPt&lb(N6-O@cO!((w*w9o8wv4(cet}c_c%JPZ2Zr6pS8HcaHs(Xa% z6|_kpX~L~Wt9;wa0E}Y)Co4kTp&Al`1It{QWU%px-8e9Xnp^>oGT+}MX-n5L^Y6Fr z;Hx^sScN=PhWg6ZZfr^%*!(-QO015J(Jq(G7P+N7VilE$wurovvIn!+yy9u}(~Uh| z<)}Y6W9V^lTuZ9{k82xJO;sj~aO|St4ZcDR>f;1i#bUd;7GMKeh&81BdeD#rB=&i} z4ARIpg1?-C$J?A%sqiO!dT3)loxVHGl81YiBs3s`dFb$CO_HrmggntiYBI68XdxrC=IIC{Uk%;55;4S#nfjs%)u7B+w(5n{v?R_K zqH(pPW0fy2F3}mubl~gh?qsd8F(iI2e&iv#&kQIxw0G%DjGPQ5IMXDi7vTTFMCYRE!K*c{hqUL z36A58#^P;TrnzZUuQ38`LiF_xtp=!ATRuHk<0Ex1OC+aT`iC{7{L8B417T>776DE; zFk4tV8n%J5hApvJ>Q8SA9D5tM%m(AO!Ma4TrvwmCHuf=!WFD>1AEP_s{ z6$H-CKuhWy8XmuP-h*SewaGB~NC*B+Z&zIi#FLs5djtjn-S1rMTF9AI4yR5P8McCc zo_$yl>DQIPinx>u66%ke^bgevmE;-31iSJ*9Z?mLZr4+hN zgcj)>>k}>a-Rj=E8YS#wf9X!Z6(Yq2YjpS(`%28M@>iWpCw9brt`EoS(J&sSPtop` zMgK!iB35H(o!H5{v~JEmd|o^kza84pyv(KcXu%2EH(M0CQUPEds=jpRiv&i?2KxuM zK%ZfY@W&i86&HNJmt%@W){SDxX%+I%vH;2nNXNHf^zsa8lNQ(s}Wr!*V^V%T`-+ zpuRk?rKH63=IXPr3bm$U(LnO12d0)T8k%x?^nNIJcQTAd8BKs>sH1ytQA^@nb2=y- z4lSlcS>QaVcyFz2KkVp}ml_3Wu*B!EB$G`*R&eNigDjRdoL9I}R-3jfsK)#_abm=t z3}to*d#{Z#JFy-hC$y|#l>8IWC=x&k?*5@R)O|KP;32_;GUV90m_}sVI|2)3eB(ap zm`2Y3ca{;`o+R~73SugtREHdXG4 zQY%yoa*+TPuOPjmn2PzGc9+QSR?cKy{y(--xq_Dt6oOi^z(Lq~5h7EUft@+iLkkar za+|ywVkupPkb)TzmztR+s;fGR1YKpx&0I7+nmh5xdI$PcZwsqS6f>>C9y}3es8$@3vTEBA zo>@;*1L}>6Rc)~Lw?Oz?X=Cw{0;^CA1x5$)TeX9(01Mral0h>5=1r%-IMe)2>4|JP zu?jYAN<-=YriI&;W5ngUxZ$ahpbK*`ErMeXIJ&THiiZi3G|00O>~)KWyeJr5R<0ny zQh8cJz@ESM0KDmP6N3%b9uz(Nl8}>{0t?JN02^=;Xf*z`C#pxaq82~npQQ=7TSZ@| zZO`X&t;MQY2+Wd71`*|Oh*Y}Df^-@ux{R=NN;?~{jEal3u=M9JT07*2N@h{-HuFvVPG7BU-;rwbluT^KwN37nA}k`R)vtvk7s#mW`WCE2F-K zYmwFYaM&+&$(j5%TNyep7?z(>D_Cm69q%S3Nz)9#x5!ZcbLc3}rDF}|Lmv&6vCz3o z*JbOtdc=U2{_vnaJDFBmcAa?x)$xfC9*s%6DSgwIbZ~oHS)aXKq^Iwr@HJ!_cS+W1 zY2`gdS6}uv?Y~3p;bBQVM0$Vjbt2DlsD?B~68pQL;VJ*>0RJ*4%ZQ zV$_XDlP~$0piB)eY>CaLs8;1O9^;luVhi@~lRM5(%B1#$OtUw|2D4;Rp1D|NIHX7h z4Dp4a@@aqtN69SAna`7Yze4d_sj}*7y4%2H1I<6+jfYy034^$n%N~4qG37ve=*7`B zH_NGyrN1TDU8A0ANgqB+VUSelIkyhbRqa%?^R_iTN>}Q;W7dJ+GaH^Sx-Yi^(ty$$ zW=}be^HPDOR2OgcyUW^J@hDSCvK*ttZXIp9EbzP7B(30%I@qYr`CqlcvlSiEr;6tU5W9PNBLt1+$V!_;4l}2#8 z;9_Tmk~#Boo(J?CHpDKQtZbNtKt6CkCAWi5DN*Y+lZGSwfM3HzTYm3hc2jgzy zq+71=02;7D7bFL*wap(3kE?9vnb|r{G+^KM;&vJ_9#Fj6zH#R)xlBG)ob*DBPX8&A zYh}<)*NE1PBy1URghS>XuRP)#hYielbDqI^vR{__bl#ykElqb3vY>e9x9f+K9h;CG zE1{3zkQ6V|=D^#d2BqK5BULXtC&I_hKG{A$ z*sP$L+$vK4;nuAwDK&umhAqZcu^pr>&g>4eZ-l9DGwtmp>C76Nf?84P3{otOoJwY)p zc|n?$+}t~4qDyjBR&A<_k#+Vg5;OZG$HQg=kt1we}$D;UACNs`A2$JWn? zr>^z#bU5{{#n-r^TVRg+eP`akD2E*>`sJ3$k3ZF^;Dt}8$uSb{FgZm1?4;!zysDqD zl)sJPXr*6itQe7B3g~-lyD~skf!UExZ>hBPwil3T2U4pRB!<1M0l?E^I?i3uBHNU! zd=U%FCqwGYX-&#$khpkbl^Q_4HmMgL#~xer#}fq;jhBcl(K*v)O}pAbvU?S_ zZY6(R?0C?TOlcucOcXvbNO0j95giLj{Ke?Lx=jh)yE$ddA`z35xsM$u03CfPkk9St z65|RD(So#UA+fFtt3$D;yC{YyL?z(o>?1&R7#6hVh}%SIs;cW^^La~fNuqAH*Lp*` zSA9CXtxy-}%YKQ)sxm~|Y47rV`pztn#D`CH9xAZ4&sYzoB`ka(1~0Y1tUkQ(Fmc$T zup=HAniT<~e?`pa`6Zx8;wUBZri%d0!@1SZcp$F@wNo4{r;+HgG=+fYG#Y!FXwi~s z5tABUsF;ucJ38kABKX#Dvt5J0saIaiV-d4Y-xTBIM8-~Alua0XkFScRV~=deH0?LP z1$%6e>o%UA8fOh!dpal;cDHs|TX6ol=13ege}EVjUY8LH0l!mg))*XJ-%B~dXw>ke zHkJKDW_IN!M%f>-wm13?prn(|a!$-y$V%-`NC>7@-!-yAno>^g0vc+UCJLv-SSRflsz}hU03C1(3)&5c2-T@Zm+gUxt0> z*?5TTtJ;2A`sNtuxYwM zLvzNEv@ZUdWQO0Q95qToz9%Ds-_JfNj^tyA0lWx8FJ4#@`scT6o-QX6Rz3uNAc}lw z0Sl^xQFKc}OPbsrGa-c?x49R*C0MqcVPHOD%s%Zfj9P_YNB*VZL^jiDzcEI#w{24n zl`i7un$SI(qO^e38?a8rxz<48y7Ch8PQ{cA?|OH!;+Yi?nm0E)+)5ow9C=UOWKy;- zJuNwyrmtbXmx$p>CSHfdA?%W4A0)y$se_tsp&0LQxwvRaCH_EHxUTC`QDV8`c?6sZ zRuPQ`Hw4=)dr$O=lFDt1+_ryg=I!84OmbMkaEN8%8H6rUR}e0xMlb#WI-v!<_LHG%H51NdPV2ZN#Zl}c}c+v!uEoiON)~pWuwO5m5HcGjIw@gEhcIh z_UXx);rS;`TD!!Je0SE^!Q~G<8Z0mX0P?@mq?uXinHV|z2M4BHUwA(+Oc(k)e4Ynx zGTA~}GmXdkjA}BM>5{+lES3N3jWJn4z_bve8F|f^hgCw#HNA5NV0aGEOtjnc9DKr& z^*SFzj`{jb?P3mev9#N9^_cr=bnQh*-5Y+M&eR>c#RvF~Er|h2Cz51YuADC^Wv#NG zbJ*TNK!w|E68Iv`Ne9~O;BGmEl9&*3MH09<$WMHaD(-t3)P6rG^H-Z%_6-Xk>U#;# z@?tlRatEmv%IhN8!;FZOy9ihxvyxX&&CNvCTqTPGyMaJV1*w6cZObU0U2L<5F-PM8 z`K}EG|L$;%x1@&i5Ac5r=Z81Woc;e{5rz40;n@MDm` zH-h*uGP3{^d{{Hh0=ZQ*))I+UM){glSudRxAk_r*bORR~ETnd!jS7QNgdJ>!U@&px zNDj-rpW)t-T4w9V32HZq_RkyvcE}U@4o{A_3ZXH4#OQ9oXEE~Dq=KUL3z)=d7is4c zjDKYhN`J=8SE_5#erx^msX9^COo3>Mn?E=6zy<>$Kdq!>iZ49^BXVDCL0^a5_&s(4*)sgY%)vl?LFuT4R->3ovJbme{&93bQe$CkE5X?A9 z2<}s0dB@T+j;Cd%J6g~12#dS8+p8nZV|3c5*8FyD0oX&CKb;>Y=7$_b4CI$Zj%@(B z0-!Q6gxGYYfOTwrh&rYeo>&Pr55$TgRKnZ}rDy$g`!YIos*rVjJc?+f8TLDs_JYE7 z@)%ZNl$PR>oC6zU2nqy0!54!Cw`As0=| zS;U#DtZ$FMX=Jg}@v05J9i$`o3g>_k!`C4Y35o$I$!H{xAdhIEHbWksL>enAkkz3& zW_aeo8aLhlCCT!NS=t&T=*Nnvjwr(p)CdZV{Wr6O!^%Wi@O{!JHeDf(u{5L8*( zbIA#|Fnm~2C%F|^kIBE+SiQCOp5z_O_FmeC;`2|5C&+;+WM<``r~a7X6e|D#`oCGD zp_zlNrQUx~I$mjbI2z_6d>177GSiXaWF-4p1#=nT%-2BZvNZt529+*76A)e6~B0Unt=)%0dbaIC9yhcmx z#L+@3OLL_Q^A%L_Ls#wXc)Uy!fP@YM1#l4&35Xd>7lPK0^9{~!2v0q+C$SNpH1R?@ z(2;J9&W0$z zb%!U|rnd;!&j_aAa~f0g#Khd3Wwz0ZvdjZkIL~F%6H$-O^^p)|rJe8>dT;O1&-n*+ zF*1FjXko;6aoxI#rMxih?)B5f7WPf1%hTOIu^u!XeJp~-eIY=2c<>VEcpyRwfd|K9 z_ZdKhgDh-O+1jC4cM=etWMWCGAm@Nh>PQwxvwAV+RXg3xE?=ESjFqsi)XZ!MR6Pn2 zpFzhe?;9SrF|z1@CU!jOf=+4#VPsI;;_NfB9#%T!xFH|cmkvGMApK46boYAmynm1A z7@LYJ?8MvQ^zmkAKkaFMSB|%?=E;E>{iQZQ-|I_tI%L2X_2r!TfWD#k3_XksA&axO zoi>`L*;&m8-GK9)5L5=Qa5#eMMA&BH*Fy4Z=n%51=tj4DL(%9IbyC3BFW9#YW)+y! zQ$7Lokq|$*s)Qv-(<)6DjV3rvKCw+(qh`la z%tx>+QZ=YJWbdwUuL*G|AsfV_^y0XiDn69R zsMJ63PUY89v3r?)j(NugVD9U9EXB`Gi=UrYi`7eFoDZ4aggS#v~LsNT%~2 znfDPERFZv#9-YNNvJ%7^>C6S)7{?P*&(i>GE>9T)gJKG3XiY%(G?J)W`nxNqRjyaelU+nq3L>Yanz~A z@m_o6nbHy|U>bZ$-k#w+yf#BJ(rE15INF4c@+k^wuLF8Q=}0Sd3+#ST)pO9l10SJ9 zQw)cf1!Xu1j3t<&Jp?dVSm7zNTVmUhwUCUpFObWg`0CVuK!qiKHB)v!iHmU7hymfqPR&07 zpAn}#4DNf}=hr({Tkg7bO}~=>x;T1jv!HVU>R`$@g?W~elt_f;Bje46iUnOhD7*Xh zI{h&YZClJIT)|Ujkmi87?NK6bA?E<9RhZ^m?ygWOJgf&TC~nRu;?boqvw5XV8##7X zhVix7F3Ec&Wh_Kinh&S9!)AyfCcvYsblb87d0mq~*AJzx@G4LoQMJGpUV#3f|Dhk< zpp3cg&i?~dDD;{q#BdVSY`OwC zz9e!^Kon60ad+Lm!lX^!c4SOnv5Yzc$c-u+d-oTB>yVEMv~Lx1KqxUV(%>p`88>nAVT_3c;xmqt>%)xJg?8QMx&ifAB_bbC#4_iQ3zJ9s z@1$VWOB2W*w~Kd6LyyWHyvF9l$JjlRW(s1OS9SJb#-h%$m2gs4(NK3cE|ROK8|Ied z2omZT3_Kx8+iqBuYJ9oIGTMg>h$%4MhicS%MTwC|430Q^SB>4P|L(onUyrXJ_Ggwx z=b^D>Zs1)XQ6ahpu!XaTDA%>N2v?wNch;?1`YIL+b?AA>!$S?m=hOM!g23@5kydmR z&sTLYF8f+zwOQX2-GKzLdCEnGu+gkuK!&_;BUS1$oq`Bm9E9=oz&FkcG+|s(OGnkJ zyfu#r`#P|0P#;Rf!@0dtaJ|6nF|fPG*^uqt=LxUjQImS*;meq2|Aah|=CRwS-$smP z*v%vwh0(7kegZg|&T^00<}7cy0AP%13n(hlpOslC&~Hrn1j9Mwk1fl|ck9)2)h0uf z9TCXg+cwk!RZCZ&2l`I7?pTE@Em@= z5S=B1pAr`(dAE8&U=3T#Zil>Od1lyQWQ*-HUf-Hx$NnYrt|Z8b^3|4z?GNQ?^DrB@ zwDg4xrkERXG|-kpss!lo#yIoib8(@W;sHrbZh+Og!HV@V;K^MGP^uVm6JHnR``u!ByFmO^D2o6rgQ-aN$7Yo6; zfxf{{M*fhBYD&kdrV!YX^66(2*h%@{s-*@qO$Ca3+a?Sm!dM01`|x|)E~!$m9*NX5 z^X%^(pWnexg+HcMI^j1T-nQsPx@nM!X$*DVKDNYYM6ZLlCZ$7G=ZTzhzNop}C*hw5 zHZoKOD%>`KpQE&%i~CoTXlV7leVV-bx5hXY%LhQsuwxY}SRQ*!YHAZAb@mKige&vX zW=3wxx26-@h)`AW=NEwJ02rLoQu>`_-O`63#lmr+XWNJWNfvjXyiqQ{(91d48V^G4 zCl!B?<$RW*O`FoIG`uYFp)TT z>g+&^te&AjDaOZ`7oHAestI&;Y2|*z9jxmqg~OIDnAbT#w$na7k-aai>8$hXE*z1fg5Z0V#Zn5cqoQBb_fiLcoK9xZG-Dh``QJ8{fWMUqN_Dszxj)KU& z3Mk?Diy&2(lIu#^YeC2HG-PjW9Gr&pH1&3r^6XY6iK9xOHN|?qz`!f7p{xUr=&nXt z9-dOD8lJ3x!#Rmg>G+L4bR*}x*~5Ov95cN`?Zo8rz+R%sm_fmZH?O9O8OnGyV>k}& zTy-W00e#Dn9c9hxh+%zT%-&ZO0^lj_=gYUJ7go~Q$&gL%9O=M)Ls{k_oxKigcKT@QX`1|wSix&NCCHuNnj}$-G}{dH##TpPtw8*)Y4C`T$lvFy8yG?)cO+d4#s>c zFHtR;(Lg=chR<9Yb-0vlcBha_TPMiHg;RiyrQ=qzfGT;r9LKZ|hczsUmy8?>}BD4bmAM&FgKJgXo z=3|LVA0^8kz?2DOYPfEN2&3Y4C8g=3Hg$T3=Q8b$EO)jDq|406vut?>Vo+DZmD0vi zw@%wF-ATJ8r_+QMX7=s=aF37z>E^Ve6y|OjFRS@|ZaXSsvOk`QS zUDU6ZP?PdB5llcQbyz~_QaxUWyt$tbGsMrTDGjBcryeqGE!z zHAtaIG`lW9XqC(*^??ONE1AXHg2COR`ZHJMq4I~Rv7CHCsRJjVva51x!4e0$-1dPN z8K#6z&hS8SA%XcbiK3HAQP`ksEzR05^;0bXL|n0J2(j}xHRDzbFPOx>%IL54skNOu zN7e-Dfa)L0s0dFl6_VAr#D*+Obow#sRj#5AC3}~S!|Bf$)C%8mrYv&V-wDZ>g)Eub z=Spw}!NURE=N&jflQo`Gz%kIGB>k7Lo_zbh99R-WBY$aP(+)kJrw6%en){XcNHEQKlSeR_m$;yXBE z<^0^{M6_{nqYm{r@rot9W_frI!7@gWlttm^!bg$EwLi}B!@TT`?7W;0Q!mIHucD?X zjrqzAck`B>3F3xs{_CRwuLqL(msfEh2&w9nM zp>CD(ja)Gu^QL@e{+mRF5@mc;$*gbjmxv^$M&$ft&rr5sC!WOJOGDz9QS8de}z(0LyywIJzZX$GV%a0G``BDDA`_lhbys1<4 z1e`zpPi;Wz9Ugh@bogXA)UM#0&z56U@OP^GVBqadvphn&e;_#yEkPXf2ar zf@Z}iE6tG*w6s{>wW#f^_#dkT``@6WrI8_>X;q?> zjXy6!@Xg=wGVMhsC5EoW<}jica~GO~6;mm^QuHH4{-2 z5(+athO!Z_1r1B8#ny4pB^viMI`=m5XRb5@9m}$Y)z6m!^%I1-oiA|1REq0c-)D-S(+)eE#p^7L64YD|D_ z5&vf8H$><9W9>*eA*fGbvCdw9QLUu^kzjUDm@X@?L1(ArR7sHV`l~&9 zvUnQ)pGuWApjRZlZ#HxLQR>o9IPmY=*TKNX*61Hzt14dW2Teu^zWJc`Hz01Bu7<-o z-3-c?#E>NGSVfO#F2SOZ5}QBA_SVXcejzcTxgQ7wDi_NcnblmZ zEEfco;2U)rH^hmrk!0%Nz-`zK6dJdfLBYC>CGT(UrY+=Y(!IZ@tI5+QbdDMf;Psy$ z%5X++qa#Wr!bHYLcsrydILNqK^dSN1nw!A>5JT|A5V6Z2Mhr?)uKsDW1j3BJNG8)0 zo}Hjghr=TuQ2Tac!s4DPK3K`4`x9-IZa+Kz8s()JZDC=hMrneAYF0)dp$P-1C5xFN z#tQ7}w(I@)i*xvgC(Ox9+5zqyZ`Cue_NqBn!DRxH148BS$y43gQ1eu{LD>I5pZ}O;a(Wigedt(=TR{dA4Q-VsK$t)=^B%QD9U+gk~q)^in$*Wp) z56V>ktmmp#N=RgitL8b6HpkszB1rzd1h9`7w*%+Ls)J8;78L9(eC~3X(|?&N^bcL} zBIi?g*G7VDPuwLgy@Y<=tKrAbggBGWH0xTDWjO`cr1ynBD z1yR*y(0S%QvJO31^?rk!@yG3yTXj3l;n?2z5;{vQ2$Ke_q3`5Z!H}xvt&#?3vuQ?p zDZ=(gZX;~g-(y`1$`X~+zwkv~W`;{+8u=SRc?lL)DZH4kiQ*un0heLdq?0QkVUHZ3 zYRS=t=><2CyADgh81Y`1y?TB^{&0m=(XXCLyH0ZHP@xIcS#S`9BE_sBb#QY)_KFbg zyrmTV>gxc0ymnGqVD3|C#Tz)x-<%@U>sXuqAdL2{2G%p2D|m%>gYW_t@ZtR#BJ;`E zXqS#q;`iF*U@u%i3ax>f)vL|ajA3faOl52!Fg)Ag8lsNAiI(Bh`TOf6DcUF0kH1Y~ zBJuo8e5Z$g_ZGnAnfdMi5cY!yADC|__?gjFJ%iegG7A;7;?{BuwIj6=RlNq~hH7dX zJHA6_5p3AH44|ZJxu+vTAEJzGAuAaf^)VX4jwwYUl)PPv2$EPY>TAA78lHw3=J5v;SWq*bKpsFN1l8E!$-EX=%?R&v?s6JI&)`BMpl&zQe3e*~3$aISIDbEXX3R_&v1wAwRQoMB>S)E-m z_H-Gu8l{cQ@-Wyx%TDN1l;25KBz!lg+7oO&H{eH~K1~;Ua-#ijvc%&cR5JCd>#2WV2fOrDrlWOCBTo5Td+5xx z9}wVtL5O~syQ)a-bV^czDs6HmIPx*0J#Mr9#*NF^+YOeq88w^52U)@jTMoL>hDx9( z*}HnepHv7+m-9m%G+QOUGDjmrEDiI^!$J2Nech4vC-~FNO@Lu2G}534 zV;UHn+PE2}%N^gmCke}o@W(libZKY>=&&-L#$ zPlumDz^mNs5c`p^q+ zPiL5l_jT7Bf<57j37b)R%lFGzR3@py^lL}uy&JLYfP7FXBaNWwDaaci#XAs5y``em zvF!XfeJN_=5c53PC`|O<-tbNm%rgJy96f~i-#LJSn}ed6fyFi5B0-ji+;bbtM7eGcQ@y^w!&hOU_O8 z5%!Go!nSLS_amNIRzPl#w?se-^s- z@uIq^&s>%Eg6*OPmYQRC$}h%jiL6E6KiuM6OV|EYOhP>`1tPA^&F}K3y_ke@&dshZL-Qn|+7K1+#D0x0gGAFZ*g%M@%TS+9U^L{= zMEN&|n-#2j^Q1{nZ)+7FoE?=sPMw{R;>sGZL*u)8Ec5M@!pRbnY8_T`iD3-_kVuAOArhM%{t z2Au8~L^^^A?BO_$NjkS~vuzi2^{}UJpWV&XBig?Y8_Jp-F?RBJRvOVRU@6(M=R-1^ z>!kN0JK_Vro^I_jUad>I>_S{;AEX{~A7DNw#Apzp_(LS6IZdKC=aiJUJ{d_>mgty? zt<`w&n}Ev)tk9+16ig;y&GjZytfMo-cGy1CK18qe`DVyQ8Jx)^=Uw*uOujTd!P{e| z0*N{C()CQKg_T81)KdLk89k97J=`k6^kj}-E)WwTN-Tm(Iar{=tD@)#h(50+P~KQ* zKBP&l-bM0a_HbDCwp%;0w)HUV|5ajZ9HQ?MNCdj0D7I-dgIh*ukuOX==;9o#^eN)~( zFe^^|mR6#VqRF_NGA_jn!G~t!R{}ULz_D5-1bPVz{qokCG#vsw_Z&g?OdagEssJ$EV|JU&hm6v8V{Wu+p|0Bcu zZ?iU4itd2>$$f-AKEtI&_)(xwr)C~?$9n8 zECo?pLJ{tYdiEE-^pVOL)Zgor2R&Z^P-XAH{<+RkfiL-FBCrgBANQ60f1rYnW>)_R zU^FS4*(~rPd}iw~pg_*^JIq4lfyMSJGEp5-P!bRtS}hxxD4DEOt^}ba?Mz?Bv4ubb zp-NOGq_x;=f!O*u3h5z8LJol`3Y&v-`o<0bE@7ushB8Wa(>-=4XYjPz{$bQ<^~ZLUp7i5 z#hN)7SeFJda>xMgj1&Hq_yW!TTVWSS-9#U0JQ?$wpKwM857?ikXs~6Y38IB z_N+SMu7+~kzU|d~_LcKA>Abo_8W&>et!vmaUp)?j#_zHVo>?YlL|LS?!NKM%3e7_{ zcZYX($(I21U+}?FA+6-U1(2hmwd9F)C7Z5`AnVNh_ki_x-5hQMXsV4Fa9@Lmq*K=MV zOl*M8zC{qtKA-?Eg)E#lC{yz^ahLkqBk0 zoC=LFWpw)K@f9X|sO6pqfgXeT;;2>CO}aBWr;k(hc@wT%a44RI*rlw*qLrcY@or0& zQmtse0?R610GgZ?jI{keb;u^@;X&+>F@GNeY2w7bJhMVbnRkRCziGMqE-dPhJcOBk zoTdBc^Gny$D#69~WRxj#E8~k$QK%n=uIqrDs1y0TLe8(iY_V23m;?D+;Dp0$yW_*L z>}m@26ZD@}XUvi(51gqu*#F~Q2!6cFzlYQRX?3PnGF%fs&0O0L)Nq>fF0M;Mec`!8 zt9*iX2!bS1)$SMuqBZ`Z-&@`k9IhK&IWDyJ>u6wlu?>VH-y?aZn3JP~lOh?PhA>;v zyBQ-$ffqqAqdk)jp@vO@b+gJx?DSa-p&hqE=3*~FzV_y_!nQtxOWUgooUsXV0f|w$ zsY%@9R48QQ>xyR!=vKGrpJN)WgABp4uGKQ`c2~}55Lsq|7lzzgPtRjNO^eg2Fg9iI zj!KcA>k2NXjvJia5kth@K>xjD0D$GZKMFsq{huGw&%b|6P&fRqJl4rU-}qnq8_B(C z6u3L6QyHKE0LDpw#PomOZ)oqV^Yf&RfsOqSU@@d-^^Yd3uWTJc-C!|yvuaI0zvSNs zB+~nYQ2|$tD!ao6Y~lrNgVU?h9zg*+(+%-E_shjczMiI5W>1$D&MNm81v6AIJv+tv z)0i28F4t6e9o`ss!8OLiak~mE^%;@Ed_>o-gV!egISf0{s;!4{DYj%lEYJsmZhe7L zuUWV38iB~#aulk_5%jt?(%tW0uZJ542{z}K=M}?Z2ZhtcMCzL!z1hKt7tJy|2rbc{ zq+idM<8v3{M^ABrW`w_|-`Bf|5Zuh`d=!qN=4`2x9%@ zmY6{<`u-t?$E2?U;gctOKSemqF=A7tNz*xhaue~=8Z6Q_6h1a7(Ef5rQIesbu^phuN>P5}Nzy~_h8n5|uA+?V zs>18qf!9-#C7SKqrpqpxFeDcYOI$0|>eb~UL{f|cq1rH5?@pBKfWFQ-Od&AH0iC;Vp$Bkj)BXTJcq+h2FAT&S@}0pi9TQrySN8e zz1@m&L4WwD)&>CfHkrj1W~-XfVD>y_eK=RcgjW}MLC@=8-j??`)oDNdSH z`_lQIk_DF6KwDhCBa8{}B*$)XU7j(!u*KpE4GWH%z``;n zPjP&<$!oLEFKHpd&-QdFTz&JYZs|%+dtf2zv2NO%hemSLN8sWtOQyI15;6@1)Cdl$UY~&M+p2rI*cMO;0h7bHR>k^e{!s^sF@0S8;Z8 zBEc5g0jUPXaRHWUJUGZ`aw#m#3_-D#E!aV`4&jJ7NSW7oZ=R#7xlPZQERe>V^e&hO zu%oX(_;9aERPfkgihSoBk@{4o8r6(-7P{#=r)=GDB{)1 zQ<m$dFi;Bk5QN z-N6}B{ngdjn%bRk`nwJXwr$97hS|(!G_Vc(aFX}UO*aACGu0JxPO1FumO3)54I^;v zn3Tz3Fd++ai_n-a_ed*YLvvgz%IRGf;-F7N843>#be^v0R6wsfgn|%Qv<)?ivFRFrmSnEm|yeX2&K;Tu8k2| zEth%3bsPfFdbSM<;T_-Vgi>_oc`o5$(mJzC@h7!(L0NKm*orVFnGS_NjH7wtK9r!H zrbu^11(RtY=SqYabFB$wvE1QzRAvKL-89oR(NK&`bP{RRJ}V;LF9tBmv0tV&bGInng14ofDp08qX3c1DkYV#k!Gxu~-u&e=+uNoR$ukyMc5OG8lfQW<^(VG47i`0qHlx zFn9pvo2<)V=-0zAxB=x?=>X>Wp2BE2Ll9Ci!~{S~TS!OmH7%Y01U?_A;jiVV+y4|7 zunPIq%outoqSQm?Gk@215zv30DQ&*(*D-Jwvr+AJft#m#8qrS zZ}!}lT7K)+Z=urKogMU14fW-=ZWLs|o{7IHG&X8T-@Cd!J8oo=u}gg9CoBO^mOX_ zl!>)SehuLd2_MMQxNuzV=gZ~Bp$^XvlM5%sDsYc`8vjZ4L&X{p!Da zrzQJf65BFDZ|=72BEdfyH6_|gOe@ZoB@6V5CE{XIR_0Np;}?A!op28}$3kp{S`B+U zVoQVHW{bnHvYvQAT>E(>&z&+O$A=JNoIE?HmpU+4CYG0sYRogK*~rDf@+K9GL5mCx zdYRRf;&@H$iFB*F>G8>r^p8?52r>mDv!xgRin?1UcRfnz_G$7o7#9M*k=lq9f+cwH zXS1ff`l}ABade&h9_qQu@sxyo0OQ=>k^CoaC0@Rx{_6=R;s$rZT&ZIrMgs?77d2V` zg*s@})Mb}4AU9h4HR+NI?R2Xyh0U5H3@iuBad|=b;=^QMRv{aDOS1t&z%|sa9Gl#e zr`K(d8C6M)xjRS~q}QC45FY9>Y{ycL_u0$R9rB=^;sr2#CAjM+St3K|X9ka!BdjL! zkk3WJ`en>u>l7WkDBebmKd==;r2m*0ncZc;gmn0AwFZ;3f3nF8)8y2r-|*>TON*er z_DF`va`QEO+%gEt4n|!@D$L%17(PTp^a7uk!^={GY2O!^C^ERoPI4rJKC4xD%$Q{? zHl*i;`r}|!1?-c}DMM1R-wnTH?*$;qrQ7XlxgXu-SonA3Ei%$iz6#YLgs{}EN@Je?dG&Jt<& zC-S1pl~*iFQV+QZK2k^1o^EaeAz~7ys_?-?@P%l% z;C@8^P0$gK4aA#NQdFDKNBu*YH%$LR&>FNX7XR`It4}xyT$wH%KLl$vR0yX{cjxXb zS2k+_GWroqKJ!GGNlh_Pdv|8aF{z2k-U$ciAg^+9vkcIMpB8L}s$N*hKGI-dDC7d_?TZLjh&-*_v!;@}81oK%n` z%;)~_j1PSki;jY|yF{{{v@*MTPJA-sHp1DZc*a)!g86^pIXJ+7;I;(`z_KLRFD(D% z1OG4JwrSD7v*-+Z`0t#O)MkYxts*n`og{EO#6@Dc=w>QqK@chZB!K-@?eh+oVgAuN zvjz?COT>)_oP)kqZuXufz|QVK!hHY%=dr1P@Q{l zun5WQzHkq~Zz5kA6u+uAaedcCpVxcupS7>=1zJzf)r*&RE$rl~9=A{=QjExu7(9gg z(e?-*GL@50fs%(^&HPe{cOs+-Wx$tDCWxh=x_|CM-V~m&s5(%5VFB}W@Zu3)+9KBX z{D&f>s73;ao$S7hC;0lK35)~$=4zp<6W+0bPTN5?`Tqd@XMYN*b+bSSk-NnJv`%AJ z6HP4Sk-2@DC22)`*@nicZs9P(=*bARfzA++lYl|1-0sQ|pK4o*DllUMoA4tcZ7tK# zV(Oh`Q$4H#5?BU5k+pqO=MgbX)PzVSCn>r7zWs&FKvV`~Azi%j#gvv+Z-jVFEytbVZd>RiBa~`2(bEhfw(YA+wJts55i!Oyf_VuLB~Bqs~k2K|3p_A3|I~Ik8aHN;a+wD zJg?EG8TncJvoaN9<`Z<5O-`It2R^SAwU zIT!U~cNhOMFpp7j`1E>PTZPlZEH6wRCt->{T0xHkcw*Ud#F&2hDNm|-Xfh^!ymEzp zi6)JHL|?107G-Qx09p#|`5?y6z$}qH(UNJw5n5y6#KiO)$@q^lB|29k#`4LltV)2j zHa_KeIT=8ePdfc2JwnlVvY=Wmy+!#}bi!q-u*U@HZEnh;{J9Juwgr)&Ll(KowO zfeP)v`vkNrP}u~Ztem`>=#HH49WJ+;f;RgtDK?$%7JUKM7{LQaeNo z1sM!9RbWckSo44)Z_>aQE&A#T`6v@_0-it>*9Gj?i zNdrIjEl}R4*E!R-MSIbWao&nHFm0QUNbtyMXeR_SrW!hErjjg~6t)W%A&`F0sjSHv z#wqD7nFq}%E)h*H?pl?3M-mf7i=Dv>HKMVR*4ZNkr>zf%eJr~!b4HH{u8CL0ghwj? zJN`N(9NnEN+Sm`J-cyG@1p8-Arp=*1Zn2xx3_rW;*+U6gR;{oRx3L6TU$!C$+2LNl z=E8&sb2C_;A8;5Pk=puB5y$!nD@>>tV^?p9iG6Tx+=or(x8VkhT$|ma5m1aRUf%kD zXxg-&E00zH{fyPke*i}U43Cw;rp^ZdyT*m;D&zM&%39zNvW43&ZBp?1tMIiDpgwzR zCxA~fygB!9d(!FKYCteZZDb?!PdqMO(jLY9Zwn(bhB9G`6O)Vs5cSmIwGY|*mgYEz z6x&mlh#(4R&&wy{rFf;DViHx`I440swX;H5;X1T6Dw0eSk3e^qG-Tbblj0|DmM|}m zTHg?~=dw38PNIvC84(1c-guDp_WyQzcw}a5To<2C181XM=R;Q%hs@Mk-4*OsZ+@xl zALgaEoZD&=qO6jYZ%C@jOC*+hV9L?}n!+5W$-c|tz{O)hoh15JEFg#)bpzGZ$r|m8 z$UiXgUH|)o>#}LODZaUH5w9LvSrsmne~Fxr={#03V>3an<|^Mol=KH&@pTn_Z%!D} z;}blICG?fc0b!S1tw8(qPBTXGj>7 z+{L0b3vv8zy+~y)I7VQb7YgKFFE9VrABkaed11$V&yglK#_Uu#RwQj648)j&czdg@ zM~jU1_b{>cHPzK#t2->)UTrMLPc}jU!Cke9sBHHWM!#gUFJ~R~!hcNPTU0W6LR!v{ zkX=o$h+V0QUD2f2Ejp>X z@%lJsC4O=Xh&PXy{1{F|_nA^(bC}VxJSKow*mR3vP^}8W3GDXjf{+JU(2AATMc5$m zYq`_I=WT1&TIdl&P!UMzY#Go1627fzfskkMFq@Gko+V~McD8z>;)1RMRr}b^>hgu# ztHS7~QyK)swtNZB?Y!O^=rjUPF?+7SH z2VQ{^xFBs@0|ZQe903d$7rzy`ViW}2Xfs%+ny{I(BXd*pH35nfN1a8UZE_Ank`NqP zSH_FNdiNM6+#aGAWSBBTzoDsgV&63#q}QzF4*F` zA#p_)py!n~xsZsDkjNR;J9^rapGJyQM|t(5@j&(8VkRffIYa+&iST7C=cG95CUI#D zU|GT+{1~TvnD&7^6%m2=#&k5s(6uh~@lnVpkn-})g$(gHufldfcl^CtiN>-`#oK_- z0`7EwahvqaQc@qj0GV0w!s}8Gi1j6=(nZGFTs?OtW!ygYK*0aTJ>df1Ddsi^>POlmO<+s_w8nvyh_qsSTl{+3igU|yssuaW#2z3+{&CvK zB=Y_QhR?ihdifmyW%vjz0Hq$x(b-%elwcJ!`B{LbY}$AEYk>T0xrE50i9CCX7!Sr~ znb`59{4tnYBIUW-kbZO>C%=nGbC@hSve(q-O;Q#z`S(JqF96}f(g$Q;xz?6Na?38j zkxr3|M-rIRVCm+yjhpKoQg5rT_X%B`D<^&AuM1N%N8j`<5|C5*k^ z8z96lw$#cm2#Cua8b45xyoYgcwccOVFU+Np>A39u%&*+iU{o=e6YFBMZ5W_jj0o#J z#)=i3^PttZx=V51TVdWi-Q0vyBf5(?x9Lhfg43K=H=WJAsZb`MQzpR65fk}b>Hm33 zeg4}`;sY&TOLw0Z0NL2>8a$9h2ag1a_uZhw8N3gz)9)Q(nobF>&z@;%hu!!9J9bxpfadWdW(Sb&I%ng&qwGZ*ra2!0!1K9;Lr>WB}i? z#>THrhy~cw6s^$t5fcDho$Y(>LbA88Brd?=UNy^$^?g2+JN9%!caeRA;dU=GRIl;i z&JG2aUuE=C!#8;5e(vmw=Zs_f6Q@jQ+CB;*`Gca+5>;ALy-I~>{*b=U*uCgEc<1Sn zz@H(4;sCO>(S{r~7IlW8q|Y%N6A2mw#LhSki;VczsR5=ClpO!*Jw?g$Q+G7MOoxx^ zJS6mS=~|rCbnqh&$^tF5B(t*6N^AF&-}adk%d^W`{-kzuDm*jCKz4m9c7#dO5X)2T zU41hjPH{Z^C`sz?0eLe&VkUslz!e?-?QCi-VY#>Ho?&SVBt{o+VnlyJFsF zf)zm@l1=%KDE@Sy8vtPW2c8bv>sma6y#xVTzJh0T_rkSgd8N)?N;KBr%*0Qd_c0#% zt#3bIp)owq$@yGLnviVa4I-mkW&o{&>A?M&X~R8qnvkyd0&vY{(XIW#q<0Nt!54eH zdhpfm2C=nNJ?4r4!Ad#{hr^w+Qeq!-m%Bf3Nt!1I$@XufSJ>UxA;F7w9s zHI09^$#OoR76J=*mz04ydVvYr^AwG8*E*phO5ahi0|;Mcbi%Bb1y^IDF#Y!-(p@_bAQw zPn|dCp%t+ap-e$^fcaBICQ+Z1y9^Pk)-I<5xOPnseige;AfbzfFqpSS0%Xga6;Rcy zQXZt@Tm{hiBTa;UY+d9O>59b<*Aj2iVnjbU92H}=(b_ZR7y^m^VdiSXj1{rPyzK#* z;FPZ^3bj1xvHS%}WB{vR}ygepG9LdWRbg#I@!;i|Fpfln<& ztO(2d;@c|N!Fk7;Qrwu(qgH^8TJR?SAIz807Hsz6QTuRGZfQT3v|%Ulu%U9CDU`p& z=@&!yJoJESxE#qS9QM0^g_wEr5VsIs65w>F`fEtkL>D~>O90agO$m(Zbbj{q|CnWR z54$to4&8StNf=5m$1C;K_*RzMSdl=tmcR^k?hoHpON*_Rj3TrHYq#j-Ko7guu=tAH zPh$Euyr<)u3N%pvGIHA>ARilAZ26pEF7%btI^7TMjXwc z(t)gGhTuc&N6gn>0%iL#$^xa#r};EQS+ht%0n-#%(zih&pzw?ld|>IBqmK(K)x!Zc zn<{b}Hw}A|SwvBGq~Q#~I7r4(_TlcW-@lEISpEgWYE&O5;Bbe5izTq8sAr(dafT=- z+%$rqvE;+pK*Yp3oHrqjT7?VMq|Y+~)B5AC03jly5eD{;xzA9czi``4g!iBlGgCDX z;xv7D1@`tD$_6c+!r&CX2h9}+!QaAPz z{4F3fkueNI*2)&xbCDrWk%)Mc9)RgOjTf?4bt0Pa&OtWU`%+E$3PR!7{-*NjbN>!q z!o2S^(Wr(>-fHb~geZ|zaxebPa~&nm_RP_HW9qB%*Ay_&lfo!=M1o7bA znG^=ZzqMJ|{wKS*=F{RCa{?-#y!%%7ArizJM-Ev#fM)bO>Mi}m31Kill#)-f|a0aY{!>L228duKzB5qV~@9+?vXved$IC)HrpxYrb z6P|OUJyX}ONOZ3jjmI&~Gj2Ct>@|e4!F}q+RQz{+4Vh9M-3`{9e7$gmTp|9WfB{H$ z0#9~nTnPG|>etDXRM93;aJ@~^LL=oXr5e9D$gEu{#Tj$J@@V&OmR@lu4gY0?a&ZOo z@X6vHMVNq_Zz6YWB{IYzF3%ZXh~|ljLAd!RYw zaBWx(cQcT#f)qX8JqUmC>!1ck=)OI znm>(6sgvE>Xj)FOU(+U8TBapU$F>E;4YxiU@o*3R*eIVH-us&#j_3!}ju&g6>ac#% zHSJcL_cmbgr61tuHWs4lEmgKEi;qHTb46yWDvV`K9bi?^<0eyIC0;3%B92hDXi$WH zY6SXKgQ1U2-;JI4!etLzJug1RGrX4o!xL6VfJRjE5djfOR@V!9_=dZOv#24E+yy>O z5SI^7ESw#zxNt!)*|PIoX|Zbs1xd6{XzH)=eXN$+3?o?j%l5{=-iuL=l)& zj9ty@r5l)mi`ab$HwGG#O~^lbf~i?zc+A(1+B+&7gr`TZ#QN7iHSqJ))rC7lmakjS zie;Lk?!tLjy9RLE1C8K<05C3T)4&N60oB3U8F%F@xGU9CW2) zj0X2IU>hDsHhGI~KK&bKN!VZh$q<}1lzr*|XY&j;*^yMwM@-Kdmk5sucP|w0MJp)i zAC$}DvKn@ZwUf*VR>gW-RBFCkPhV)SO`x}Im^*<++u)8-H#|T@;>Bw!A z;qZE!F90chRbV7S%iJxoJ}08)pJxpMOP9pt&O9uGthd?wx&nu!{M%EF(3v-TTdpaa zk_%Kl?9BB5HNLy@v?I@=4SoPIThU%?x#f!!e#rp-7!EoGbOGS=wRyYQvFdH9#IZ)n z5a(~zZrY9MJ7i7W)VR3cP!gIVw4AUmEO*uMVDsiC^#qoiRY;7xzB;0Rv}4r46eFb6u71Xi&(FtFi5|b`muM8X1ep$U*CBv z4n}lftN`$IaU{6Y`oOx^CNn>cZ-$laQ^J|()^gTOn|#p-uP=0b$%`86uhAy7#t;_d zya8ScJfEF<5-qrw4odNGhN2fGIp(3*<--U-@;`$z&|3Fm;2c`sIa+W;M^jRB0WVbH zpIZ8|N12<^qqhJKkQGqJvuyi%fHHP)-6o74^#PdRrxL@f2250jS<@Z^1j)y4%j;PK zcOH)zpYaxg=Rxc(-eW#WJKJ7%Rw|+p+!=Decj%drq+1RHZF}pJv-#)Owh-q2Zw8eM)ng3 zu7l_hIKfj2jK*R@$hE7C7F_KPx1aSX58&tb<)@4l8(4a3h;DWWlL~S@x?vYFm z!qg9uO16SAM-(Q6hGvOm@P)}m;8}-QW$=Z-&mx8<(D;uSM;K6qvXy}s@V&lI;%lj7 zexr=nb?jl&K_PT&X$gC982bZcgxp4jG5BSPadN#4Vt>mtR#qMrfb*5};0w7Urxqef zxE+Ma1+t7BqpQck^b-5d0pEqkeJSwpLP3-s;+oDk?ZD>6aolxp(zQzqAPB4`C)H60`IScMZ7_qH|QPQxZsqR;1-ox7((R zHDhzJ;W+_A)bBm4`qU1I%=N^1#AU)q6&U#iL?woSn*~Gcr7^1*!`~T)DHoZKX+g09L4$M!CC$%pOtR}O&gi3}*8{W8teD3D;=}Z#pj8iSyaSEKwG2R=3ScC?K@*u_{DnoD| zyA9Si+Vav!Gcct1(qtWT0k_d*XtbEXq;jH3BkFj)7c7=63V$(swm=kz&2v1LV}B8P!sa{j-d>AnOH=FqnsR=G0w@> zf5Y_86m1!=npm4s-|X4bE}4wa_Vb7h)VrHvJ@M}&O~ zW<)ceXCaJZZ7sfs5(%-H1y+adK=-xBsu;kp1=eK5am6l-J)T&yd&9)qak#>Yor*L* z7H){rLFMSAbo7(dLGoM*H}kM+Z>-W>);+I#uXO~9BHSBuK?GLk5H)F2yRfkReSK<( z=)#42@EuE@Y*8f6<~HIxWF&fvW2t*$=s%(8XhW}^hI?Kl11X#rKWw13>vt4^m>D3I z^vu-is_PR|w7FOyT7|uHlR3tpxGv6wmcID6{gv3AU<~GlLegJI^?Md^|6VrSsqL^d zUJx^uXVp{1Twn3)AlJqRIylTooV~wC+w{(AM!L+u%pCr?9a;Rqzb8?(fj59TFZb9# zTm)o5Jtqj{@6e@9AS&j}KVyoaOEI&6Vt|G@BlA~pWFP~Sb0{sTA-9!fgraltH5u>d z%SeEs{9$z_Z2*rVuMf)i=jJ#1Fj#(5Q#4QTOaOeSLo5-C6aPcv6RL+%B-WP#J!5PP zti7Kj*5C2>k%GNc0ZMkE8W~Y%jFsHG&i*g1sv^3Wj^P+OXG!MyxEB%zSd^JkytA)+ zXGO5Wkbl}?UmFxAi>=9_lj*1pf#M}eCZya)#6#GLoyVWBO2f4HEx{fB=7L(DSK3GN zN-`SQaf*tDDDX1?LO7rg<0^D@DI9g(Pm}lX7})WvQMcT_ya9<$eGWwZX+;b^ESWw< zRM;%wBU^uEy9Vi}tsD9ZETtVc#JyJB{aR$MYclFE_dk#*xG$K|*AhFZbU_6xNrF$0 zp<6r(1lY~vgH&?z@qZ8D(?Nt_H@g%3+!r)!465Zgq~C*sE79;5iVW8Jp6sE7BV z=V5^zjOWb~We*4)PQ+*JZ5zxz=rLBMN!;6!^iOhR#>EDaNeC(nh@yS1Q~Y|DA6ewh z7{sFTgqAcZ`)VZY`Wv?HXtep1WR&U>kuZwZTQ%T7Clyx@v=HTke0JU8_;80ndui%4 z^N=ipH1c9HnsyIP*SoCxXAh1o8a3WS{>>?G&?pW|Hph*Z_V!u<_B84ZcY78<9s z=J{Qyoa)bW&Cps3hMdm3 zxWrLpLcOq4g84UOAXKZv#GoLNS81W4o;dw^U3bUtFJ2nGAPa$l#{Fre>` z!p#)iG~>TWl16H-j4kH-##pO?w!Q`0%N_IXa@Tlljv{gP3y{bguUeR6MiK)_4p?=Z z9Bba3=l9T8e@q+!xD4^Gqmfq#1mUq^C72xIE7yf!@510Gh@Lsdwc|u-+n&LBy9D*l zT4s49^W{8Mld5>DD!SEU_(}=1zGats5nM}fdsdB&*Av=pMQ{=bqXw1vh6K&y{w~Xu zx+$pqe8>r`(ZDSJVD4IHBfI#;Xzc1c`d<}SyFK^O*0CMgK^gkfh_X?Y zxet_yPN;@Yz1*KLeHgwjH*c@cJe@E-931?yR4!G{J4rM;74XDx{D5e_yGSjEAQrOQ z*7n(N4#H=+u`#Z*X0-h)_tgg~PF+@^_CKE3fmmLh)l( z|Nf&vx8bh*-Ns0?S|5oevh z?7S?IhhiE934m}wCOAT8A9$}fAaNe9pA^EF$$+S>ia|+Z19OqjzaM{_KA!pt)YFbe z7_RS!)~1Pw2-`8gOV`k8xKEJ9VOy9ebx|t^WGR7ba%TPKapUhNJt)nFgM>glmZTe2 z%P4|^G2XQQ2_;Q(M9(Xw?Oo7$ezcne_uet=)xAO`3UIJmgWGyuT>- zFx9zgM(p!%$k5e++S~M5&S?CX(uUC!F4L148P!mn%K5^zXm~-CQbbAIm+2n$(T{H~ z*WeLmN{IUVT%MGd^Hy6(Eoh(jqspxL+ES~N$oilV6Hc$o-VoMw+4-)qwFFzftXA>< zdYoc03yTEBQ z6lt^)+XFlzvJXKPDLmv*8jd|+{qKq&oDG93qhC|`%dc?}_rE0?O+^IdcDeBq!(N>Xe&vt5};LZv;0f6Ync!j<+vg1L~Yi(ilV6#k8+R8~vRKf$H8$Aw2OAP65eAz5X`^ePHV7g`SL=f5pUXC7Mf${W~HVIn;f z9-n)n&mYGnWj#n243X!d0!i0=QTf|a)@PVV=~wdbawPU4)g>w~ZDllO-Da@hS=^-= zzhM@kY0-_SbJAMZ*V*KWG|z2ij$C!E4Lwb{$24NqO}UD#6+a{=>S0MwJ@%)o z=4;48MHk!eUQ?r^s_Y5HI|L2m9$V?2J6V@4Ax3*G8W>!jTzTSHf7SyzYnTn!o}|G# zjAP0~h}a~a<)n7(fQgJ2vL}OsbsFcmrA*5Rv{FL-TaBcZ7c4MgfN=+peH&?j3Rtun zuH4RROfCo4wa)xQU~~tFR__y+4mzDaWgW3E9BEO?Ub(w&5e5FyCAg9RBg{S`3J7?2 zc1j&uX3ulO0>_cx=L2-er;nN?53jmjQsCny1c2wK5O>oeH>T1i(hxPCS-e z7Flp&`VBPAUj$~UixW-cxn>rcAXzK8ducmVVSt9L`LK||t${;Y+_GLM zJ}Jn76i3I7$utq9w9j!&9v9AZ`0uq}Xlc?piuf90q9fsA{eaj_M!ObB!Zxcj5aFJk zCc0@V2ahLbRdp|HZJ7i&|A|vv#iA4S;%&(Nn!7K%?5WF2rY7RcH{yw*$M{oM+BxRU zii1Zx9S@iCS^6$OZg(~{p1p-8_$gIr#`WRt1WdPhIA{@8^$UmGc>}C=l$FPt?m^>W zt9C?$Q5Oup8(y&+YUcX(v9rl|(JCEbyoFS|yE#whL1be~0M=ldNthGaH@C⁡#qt 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

    (+r#kjn|KKPk{OiGuW+`k*tkV- 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 X$rc9~m4Lw)__+e6A})4dDu?+$a=6Qm diff --git a/code/src_midi2cv.zip b/code/src_midi2cv.zip deleted file mode 100644 index df9f0487aaa10d8542b27d7e7696d9a9c8a6b366..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 1346262 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%0AYYHF-9f^ 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 z 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


    FZm``G?-^(?yX@@Tt2^?<`?N{>4KcQWMx2Qt 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

    )06Owp)pANAz0m@% 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Μ=>Ec;$ihC#r`rh0z9Ay6(r0 z*^jQd2sxo-9}f2ILjmd#Keuo# zJeuPc5aRC>3aOc7>@dZQabG?Yqxjw(88u;QlEaLwL{r3?6kK3??8U2T!ONV?`L>wivV$omzMfS+?o5CQ^aLu#rH#sMLBx=CfLU)x#u!qA|Q|wX5w20%_8p8OZZ#Wd!VBBz6#ajU(p%H<&tf3#OwVSpd zqr5bjuZ!LA-OG%+Zi*GhZc~8$M_E|?3DxCZ2aNU5gf*B@(`T{q+ZA6tA`KF16ZrlE z-4HSNS2WggpBvThgvh%}rlLLKM($%q{Dp6x#@xzgH29oW#YTiGip+NPya8PhyXj^g zTQH73SBtw2oU6}884mkrYZNN z^n}elDS3v^4Dj*xq8g1@3gNop`O(U7%MJXhQ%_{I4LyMd9^dgGGsYc8-(R#J3~UDm zrhC)ZCMd(oc5b!ay^(iC7SAhqM4xl%qP%phBD}8rM3Px1ZP@J?G4eON!^|M-8kx>a z=BWd%-`By({V?{q!?*AgUSGD1=VKE~=7pKbQ#kfX7v)W7s1kd*&3A+kMD(MHC(-81 zmLFlZK&|}qUnPLen}f~i$ar|ZD(Gz2UtT>J@hf#mLwvzd`dlwQ>CNTqcmJw^@9OFA zMwa7^&z>O8zc}eQGw!<1k0O)V;fquQ*YAGgI-b}DwtaV^`%i3OOBuGJ-BuT{kClnk zLMF>qlOpc{7W=&r-@L#nw9u&ismzvGvCeuI*8>WI1iA(JB~dkeb}wlE$_FJ}T*XTe z%%!gvh@F`01&xwak&t~wko1K;C(e_;0QcyaEpU59{3Gt=$#7X|YLD9ZVvmrPrfdp@ zVOx~5KaF;JHuwxvOxc4azP*OhR0UaSYR(Ro+k%K8OYXSk5h$kJE?!K+u(M1tx><^r zrYi6GV`5mPsoTYeqoCxF6wFnwG3iV}cJ9kl-a|>}B+Ni*N#|IK%7U1ssh;!wQAhhx zXV7IgjnkMq>J&a`#eLVuM5d$rG4*xGOH<2?gHXqe*SwC|Wlu46OrJCAwHtJOD@eX{ z0=W5<`Z{E#srTW*DC2b8S!|B>bxt#7^j|UNOb6)jhh(LxmFHBJAs+}WV@9Hgt98;* zM1fuBm?AQpf9lTdsy~3XprxtN*Hjk49u9kL9fLyrj`2c-@kQToD87Qm4Tm}I7(j?K z?ng4$J;z^N#n1}%sG&J7GDEGKSLs3GAO#4;ae$RN-7LmoRAc6(V(J`Rht1sm&imaP zVexJXDTiKr`24`|QI*?x^N9(_88_t|+Bmu6WoB&0)GRdXIM}!Y*q9a>Dm^niC)=r) zFaCwBU%vCKf-m$rRlJzPId#x$gR%as+LT!676$NgJYPH&4jGD&@PHzoq8Zz699f453d-}3%LW~&cSbQtMOStH@0%inm>(0)H(;x zqh$+jyuq|=OUqQ>d@!14f@SFkNNv6;g35Mn3%^;2J95wk#1#x8Mpl0QgC2Z6nltzB zMYfxh3t2*#^?E@(>Qd>pB!Y4z@z5~Wk!s{J0Fs?n8x-OP|Kl3r=Bo`0;vPrwA)xP1 zJR+do?4_W5XR718?htJBXwJfHfp(^Ulmitzlyp^7eB)ef@}y6EliT~Tu@kDlD+s5r zH4EXKJH;LY#{I3%#5FlPz66`BU%L6lBX;Ha7tyJCdfk!OLY}&4VeUyG6|h;uZNjw$ zh;He21JlDuj8{ULp|hT)dxgi*y6LzkzpPs0`=Zs-1&Fwz5$++*UJ_TO#0 z77X$qAX8jzIc0H)F5%j&!??H;`%Fi;zBFyK}YGdGJFw8Fi^fs!$V8bRM-4snfRe)ZR}YGh?m0R-^AY4Q;ACHERfo zf4UjTcb$ENLrB@LPnhK6lY4zx2Ghzq@NO1;{a&M)=yD_?FMm|ILRv*Pr@ul32+7D9#=)!z`Cnty#Q385T`zVJ5N5JpZ zw_q4|{R2rqvaJ3IfsUo{We@>aj2YjLOmB=ez65Q2LbgcPxELU26j1C!(iL0x|5CAu z?;hlvxJ)NLzEa%NFNc-oK19|gpzcq zne(n7<&o7qrI5bF{x8p`G{rlQ{!L2fZuHgSYTF8~xw7T5k&r=OS$viRPL4zm>m(Th z$+5Ast3Q8tS18NUGitKKIvrMgMNk3!et#)=UJciUbe911uuk(a28iYV4O|=&SV_y_ z{0+3lh(TX5Y2AonOQ|*HpXQ|@6BL1Oiik%=xGr{OoN7|!$!wX;ZN!iAyN!Ks*6c45 z3-K*sG<05LN9cQAkR|A0o#E3|!)GVC^9%2xgadi+paj8O`Z}gK(s4D09`MNVZwkLlB3%t+{m#$x{vpP_cgq|r zwRJO$-dtmgSXesmwe{fqPgURw2^p^a=cy2Px#vCGWFh$N6}(|qJ^jv%{@$@^pSbHg zlfd)71bp#Q6~NhUAA0*K!dGl}7u_ycNuS%rsB>=rD?wrSfRKsNlxtWpI&HMC3kn?Vpu=V$V5o!(bt`a=k{ptI^ zqku|Dya2&g|9AIKJf*OJP#^gS5U`>Eaeux6`IvG4x%=~-Rta0b`%|ao?8QA&w=QQf zbieU9wvYx3%yR93{GR~%pSpj|IhBOS-QT%$9)$Pp`T*U(eRh6kE1aH@Z$4LAjfL(@ z-Jf+`C3v>`tE|X}0{(r>3lMCj&;8bk5Z0 zqsk)Kd8?vzSroFo|05J4Bm%Lo$mgu|n+s;&ep5(KM<;vwNz$7s)+8Iv>Q!74T{#r} zbjftXKp~pBYqJLM24E04|yLW>8nL0nWXnlM{I#((i$@uKj|Ti zXT_BuWq108d21l;q6D6H^~O?6+O{iNX~TeaEyPxQ)x#7fD}BomY2^TRg0gCG@3J`ZVvVDu#rGH+iAf z>#q$6g~!B0e1^am9BCRGRjxcnQ<(Ur-6_kAZl0A^J(fXayTh7UtXXhYs9sfZV0nLY zh--jxZZYC1n&NQYa!l+d!R1fh0SCW=1rI&)>sVKDY5i`l^cwq87YCJf5QAq|VqV{pJ3EffT18)9rqbA&eS_8bi%L|vaD z=vM_Ew=pQR6Nh6=N1}`A88vKUyyOiz=TTZpf|_7>yGC4hWg z3{2|k9u^!DO8S1(kSe6r3z?fTTU|RjGG#WzG7t0~dN6NJ$J>azzZ4qm zGh~S5G2M)f)rbXZMOI~6;6co%Z;N4W&<0lObmpZUq!6au0|(1FVoc4Ny+RLEUCf4U zWP5VuFz^8Py)HUdjq*|mmTiLb!JQG1{}o#FJmQ%yhA zAQqUMQk`jm%8s9heuT?DbKvW-;$#I}lTxz8=s!XLYN!@^4LCMj(7smF^m^WyJyA9dUt8+S4^@qge3NLlh#Faiuq1eiO z``V~4!g`pzMc8@PwV4r~I<@A`f-q;T4s%wTxOPlX2$t>Kq5TIS@UfjduwW5=&ZUXV zI@Ykjp@Bn&_|e3*A-*2*Z65c!%&0C%yYgijB(6cSd*Pdvfs`Ad#$s2DXGODjXn-$& zu~A!IJzIpU#(2QUMHAPFS&GDy-Td2cxg+lWR32A|w7%x2-(}e~&ycu55&nT;bnaUC zZUby=O*4MQGI(u$X5%Ma?c-7g`o9xQT*Q0g+^AJ&z5}@x{9km7A&I%-mAjk71f$nBAttEQvJuk+ zFQ4Z9))K;66_ToW{+3Gt(aJ#neAaTjRS3rQ?FK%srQF%b8`Cz{IuAoufNaQWxl@t2 z%1zt-LKvd9==2dSurIzbGrA`-%8ll3sTY>bwI}RX1eNVr`uuu=TpwO^jnz{lan-kYIn`6O@>y?*F{ovgPO$qoMCauQTIieWo z&z63r5lBV6hs!&8ZRjxHL zaka@UnBnc3?03W;!fOi`(!I$^#`YOXvi{u1d%I7-DDUq31&v{{iA~ZWSsWZ$vLrb$Tt_B2mED&2}1^Y{Im%{d3uRiREpXAu+bDoHNyggv`XLE`s5 zUoqAecUv-v=Q*7)vH+LVg=H^&+~VS6C5hSnaNwC~NF8td4XFjM>+6SNJ&fyzu`dlr z4c}aK3-NIC)P_U_cz6fXo6NO0wI$s!K4%+dfJ?PH;A;=FpCQ$xb%h+S6hxIf!msO0 zjP17Nd~D~{Wdp}ts5EUcIAR3k4O(hC3?<0lx-zA6K1CK=wjrX<%t7eqZNH--gsAH? z1WnBMzZ()d$Sv5-&rj>ea>UFJ?a%?=2Jp*b;h2@k${(kRJ2CD^J#a)La0E>f12o14 z46u|{Zizh+^D(+vSNZ5(%H$7*Nr`J5&~9i8mPms65KR)f^C?Np_Qaes3y?ZAQezd@ zD#J*KyGX6kd`M{N4A~(2A9|+lXyMG=9r`wvu!pKT{{Jin+{H ztB66M?3~)^e!j6L^Xb&7i|q+*3v($gZ&lq>uK{EZu~cDNaTdWk7IW?MFF#Dt` zJZt+Mzrw z%6@AO$Pb-A8>MvmGCLd1wcLgZPPWg53WQ#+FB^$d7A_lAX=xAz9o+o9Tz_2k7w!VV z=aSjuZIJ_AFwVl%aAWt*%((0NpMEi6xk}VxCStjNQSwfVe%|Rp=>D~lY#r|1T#n?1 zd^)|dMl+Q7$HrQn=*zwTqU&yCZ`?RHI;ZbsCuSR@#x(E3JsQk?_?gam&N!;W&UXIy z)%%ctj!7Qm7d)lU`5m)k&pCf@7lZJ33x-Q>US#%Lu6z&T?_KF#nX%RNw>bMX1-2Sp z4auh8#ksm2#7L(4g`tbLd|=bATA{5J0?VF-u-x7dAcqe`O3HX zhh{^~u4@hHduX;E29K%Spa;xOBj&ao`Ou)D?md~2Jv=Mi0=~+pv4+7wEYxuZbqp{# zCflVaH>4x#!$mx*U%w8I^Uj_%a2>TdTvRkbj{b%FCtDQF7$Aj+Ar%yTg|IH^(d$?3xDb654)8T6u=IKLseqP)iPADBi zejP<|vddA

    9mr!_Oy3a#E-5KRlf<2NM3S&xrKxu>8}NiK##v7UJ&d>Lv?w;TwZ7 z%x%{3lQ%gyKL$n?86Fc~M59?BEgeCos|Rl85fmIa6uvQ_JBlCldV)D%?%YC{16mxA z8iiL7f91roGEk+S+fVxH%67Q-@tYZp%KIMw%4rfhyhfR(aSZVA3-hFj{Yzy((h6H! zx=W12w?hAO3AWt6^Iq_dH)(}7Yn7$N{Nw5o7_2oTv%rX;4;bgg#zisC>)qMpUvedx zYzA_xTGHoK+U`)6T%5rQ8a%ZgRK(>xpHale6TFD-|9CLNzja@k!xdmEl@mGvE!#yO zR!amdBuE2P`S&ZbTg4T_2KbWh$z-=Jk(56_u=jwKCN0}lPgRSZH39c;qUp`O8x~Nv zIP!OFH$=u?1D-wp+JqQ0p}jdj(9rCVH->vdK8jgw>7`5 z3^#kJQ_bxm_RwR^OChf?KNjOGABx0V7ThesEmIj@=fJRF$r8hPd=v&#m{mS{7AOlY z*B!SE?bWRfm|`AOR_Gy}tIEQ<1qIQU^4|v(Ks)65%!l`K%OEDPX6s(-1;sU*6`iF0 zZ|*Zi!z&CsFm#e@f~9g5M)0otN~13pb{@tAH+}ytEg7B`Y7?o^1d~C3yC$z9)88My zV2_+c!#t;=s9{ZX8Pt%{JCv#6;>Av1k3k8`9WJ}jhfuzosHDL=f`)(gvEqns=2sTc zgT2F;=oKPEJmFitnvziYq3BLER6>^)4-*_pA-YGea)@3tDx8Ua&Dv^ZWMP;thDqOA zK2TRtbnYc3t-ouwfoSCSUMqw6C#}mP{*sVLCcf>;L;ah>bR`1D8aib;Y^f-|e8eZF zkFzR|`~`DWKz<=->PzVKCfX!hL-X6(*}Ar~bt2`gJDsOtT!mb|sQgGtoaF(wyIX4!$tDNI2F@g@! z4|z4*n0Yd`YCb!dL{%Isox*-rjhk7BnSZAm8rtm`Z|L?t_=b=QC^TTg&9X3~iXR~D zkZC>D3OuV0lWbKB`FCzM!45g&(U@NvUEECJj1$yfHGZLDK`hk%BejrVDQOFo>$>)Q zODMyvgB9omG8g#v2Ne9W3RC5JeLho$Rm6r7WQwwWm4U7gQmSECb(oC@CX$}~&OAn9 zB)%tKI#cWDV3^J7w3H{ed(V()Rx*y|QD#7=AqojB81J$hCtV_;@8RIt)w6DsHyHJ+)U z^4vNl+ro_UF?3=&qZ|{Yv;v&k$k)_aR;>{IMAgb@9ibzL9hEo!f;FyT&tcj35r#2Z zfV2-&0i96|SiZs%$=~ne$#YDZzzlj~i4qkefc%?m!J0fmDROo_pvCq|NNm~P6k{z+ z)5KWIlcIQCl^d-#L@Pzis0dW`n2G@vW;gEVCNTq?;CQt8F$nM^sBekqL%4ofCq`jh zc}?I>TMTjZe|(7heq=K{HQlky70N?}nn*uJ5Ck81G3?HgFhlg8 zRR#T#FaKm_z;)Nu^h*kT<|+&?W^w7NdU|1dg!dn?19RZM@>7`bVJ1uVJ%$`u1Xk4) ze)S^N;HB&8BPZJuOqyuCPL3c>OEu{O%o5z>s#;P=L^P^`#d2 za=GaiLkqBTa3NFOljE0TP=$Ole_)&>$nx|@uPn|`gi%=G>8?nptmD}P*4g8K%_`mr z&fo85n zyZZM;3$MJvTli=6)&9FvxdN<33&WuRnm`)BtqjAaZqCB8kh2z|5s|$SzVh+v*#BDW znf^;})6cM^pHv5)xeC2hekO5_;3TPYuHN|fqScR8Xbf3}4oFiO|CdY93Zn;LlMINh zflVT46gB-S-84I+geKPVbJUV}68~BCW=ZVB_uPf)HWedb@lXyP4ihi$a8s=fin2nc zVJtg8rVPdi@90t!Bm6V!n%3RE4ulC}C`=H=B*{^)&QLPK9JRljAKkUJHTOVhBP3#F_3ivzroywA$xI4@i^{%n=!J|3e*&u`s$3mIu!SVxWFz{5>>W}Pd*xg zp^e&I7ekxNiOuVj^zY{$aF4imFX_N?I8QzWrh-30n>`wm)qDPd;Rt&><3b?d9a?4>Xf}c8f0l|lOEMdVt~(|(?#q2W6?+PONm>qb`Z8B4ZdP=zEtDE~@Hkmcivn54P!q(DcdIE6K^Zi&RH z56>s?_HXoS-mvU7BgZ>QabBMQR~TIUd_3GjeF6hq;Uxc%U^lvlKmGYC40A8jG5D1k zL6&F_eya5O=`B6|7_`crxsH!Yrhj6*r=p73%WY)|-QuNadphjZCO&p#!HS!$VG zYBlkj;6JI~md*b#NGP?;$ri-P-n(g45%G_@m;|M3L+4_v5&mF>rU>6I zbQ3e+Ki@u2T%a1fbbWX?dM(0#-ND0WuG`Fnk7(4?&Iw+ed}}MciBWl}!tmM2o0JlA zy-Y;#Ry~_x)MFZLVS?)}Z0WxLt0aZN^)GIxdv8Pm^U5?w0YbmkmsZ5DPjb`a_Xm^^ z-~=xY(VMR2hM&OD3K?Z$#&$`lkU@T$3721O$sz$WHK3Zzf&R;s87D{Se zRaXRa;ksoHb(G*RXGKPQ@bRl;`{fV<_pYw!8UdjRPX6ks`59LCl=>B(k1JdQAaT1%Qo^6 z?^9tnlV5jRnBIZ>a#u}$)}r-HiQ}kYQJYV=3Mo*34^zXMtK*EvLmR-BswRZ=h`E`{ zYX}K-3-ELc_H_03@no!DzyEgvMLZ3*LhB!GwU;Sk{Hd*Zj=_6mRbl2#&#td~s)7i( zSLoy6OOJANh&zSob&9k^bidGjOmu&*GUIDP{QrjdivzSN4A386Dv$n?#rMD^7ZF~& zj)xaIw3u@E4y?QQrcY0-ey0jNWBGlg^I2ry5ceI8UpjF=JMi^d?41M4?!!=tAFdQK?U(1opKj{FKN68Q-;yLMo2x)qs? z3baOMVJa>IdQ(PA;81EUb8##Sv9nL6}+ZI^vJE zZG$ekR_ZVl|MTg+H!T3aGkl7P;N$gKjxNd=`vz&;Y1Z8omO>Czl@`RewQY zPRaWyp-ow9lyGOyF{T9XtplB#z?k|GoJ0%p9#*PI;AR6P_`%~IBKfGTJh_mB^kqr$ zO=B)gnzS`Exs$W4t78DXYa8I^=ZdFU$d-SV#!oP~9sK!4y70`SK4ftm<&YPsfy^q7 zq-{P)(1pM2Ll@`o9C}r26{0Pm^M!^G4-$TpDyM&;fuDlyDH+^s71T(&$H2$G$oxI& zk7!_)O4eJbHs# z9NcYCOHfvtBninUJR`HUaOSGn=Z|P%7EVfbpf(e1CvBO>3p}cGFDUVQfU}SI2G~D_t>WwP^W(~aiX5OKf_SX5n~EyL zS*)}!G(Yk?3Mrpxhfa!|ahBN}xX3yqa1%L0dP&sNC^% zrkGgcM!p-NRo23rN8%vK_55K&RTSeN;^FGW;2ymMzTRRk_hsm49g*BX}9w38nnp|%R9r;`1Pp^&iK?XfxXdR}1) z8PVKs<$P$4h0q-It7i+M|AY|vE4cY?lt3kECpw^#iVnA!TC_?9 zct#mHtjc2yvrrxxH2fAb?D^Lgjywd`83rkdRy3=xR*zg(PcFHx61wKWc_$2fucd7K zfq?_2ormGt7|zhq?i;*bJ$!LtL8@wVZK|M%o)5a9h+IjxnQic3vh7jso!7xo6sI3( zytG9<5#qW+S{<*HR1I}(U)>dTtZ9CisYCaC9o5lj&!5mCEt3~9t%*8@ov(}O)Hd)Q zQ-^MenU;Ar9#Bt*{#x^do3&9(iCx{WP2MHkXKI->e~~@hdCex8r0aJ(LmTw)iKt~ejpi`%vSO0(xoXrv;Z+168AzQ3_ppby2 z51B%)-CBI1EF|3hvMNHe2Y)~aPG*UaZI#SXNV$5>D5ThxOs0^m2{X%-gS1=UUfLq} zvi^V&oB|RdmE#(tkjPR!QOMD(M@%6ni@%r)pM}$Smy=d?XMRvwNJwa4FnplJm8($^ zEvcQGqL%#`ycS`2*EbRAoV~)}CL+r;1q`)2)*&z?lxzk(tDkS}l`WTzdd%VXVuVkE z>7#QYbOntJOUIoZmtnRv$xAR#&3Gy?gnTwf?-7hq3RBo?(Y+*^bd$#uqMEYf*SPd$ z=TA!GLSFag&PEY86sz?D!zyqKIz%_*)zpNSo!e#PdprfUhQ`71S$Z&hbPk2wAcQ%a zo4Fm7wxBI`w(5smFmWX2ekSn=FW|5GO`08sB}=5I^nBpo#Z?o)I5fL>nho*?Pwa*K zy-Giq@XLKJUTNc!#e;IH@iVu5zB^G136_#tsLuBOU4?BQ`m%FKdG!_ia;wM2r#&`I zT2OCn7(u2eOWrUv0XbDvNET~*XJY9uq$4K}dMWV{-wzJtYWn0I9BeevREO@#&cd3d^d1qMhyt`+-lHw2$$-xniaVbyCUcop}@ojhPB47Uj- zpGfLdPX%zlz#+6!mD$7@xv%H#huq1z-!i$=5>_@k4FMm=%^9<2F|aPtG&Wb58^+K&1a?dw-03z}^o` z`jfd=javkMSuQJ8-L+DS-d7vtF4;bIYBw11Z$%A2{FGQ;IiZ20i*jM_k;$WaX>1t@I8~e|KUv(h7l_9+1 z8B8v`Z3ih!E349Py6l4io;H6l2H2tt8@XxJgf2Faxi>@2i{8V?^iURAoMK6f!5{to zko{YX8?rwd^o<#As|)K)LSe*dY9d|aZT41+9fo~ZX;I!jS0M8D@pni51%cn0{3g|{ z9@d0=<6p-~XIYzrmF3T#9g<4c)PIH{cY?VGayyOHpzXy@$*1k0Ji$-bz~cHkoQa{Y zg7zP;JU2HvB-ppjLlL`p1y98Ow!?^tt-E(X?+i|gRTf+SenIVH;mGfNljl!5o`cCB zTf!}V5q#VszO8gE7yFO0{6bBJzh_5+A3iV&;ny$KV(_(Bax&o??Yp>aCZxqP^`!IL zq}3|H^AkiuzrFlOr2i7@h4hsk=VH=NY&tP1H>@e5;BpC_ouAsG5B>1xFak}wN8L~ef6NgsRNHVj&MLm5jB7Bx33-ov!4$p_%|jP5RWMX~=IK?}Pl|ngWtEBJYm0CVle0YW&Qa zv`GtUA;D5o3!UEQ{(*bLVJ%E{X-&HC1N9aBvL+q)d=@s$oB>0zVFa0?EP2Dw1k~)2 zLb6yj=|&@Jpl^2Ec;q&} z$8!%pU6>i}kM23ztbyZ85y8?$>37Asy(se2W(yJduLM5~b-o5gnaCE^y*@67K3cJ? z)FHKU6*TBpdG^3B7~0EAUc+s4Y7t^z^YKUQl-9+V*gxNFaVn%RHd#!2>rM;Cw_1wu zSN9FY(vU}3aVGrFH(O2?Qw^TA*>Y#yaujgX$PWcnm{@`-;G#=Ld3Pf?RS)%l+CM!? zD=feV?!peyN{XO$DvWtiN$*OI7F{;i@gH}l#^tr_c) z+q&5>)Zi6^T~M&(>6dTYiv##P^K|zH>-0f;XO6o(cZ*UAc!16b8qcyF8=M ztGNToPag|G^3AaJEd(V}TC^~?R102ywdlar-AEthHVo-YRjtaTAG$&_%@=CvyJ2sL(wAzZ7QNi^ zTio^`{gLXyNT1rc8k7FXRj0h|!8q?>!AkpTemgbjWm|H&(o+z;L6Hyy7bffCT7sXP z7mLf+D*(cNN46z*siX4Xj4ioq?UN8Z;v5g2v9|&<;<^`YXjV_{rUJO^a!tb>TakNt z`H`4n0&FWXxx@BNY%&^p=_{D;(k;0x7lpXlTXKamCLplpekeLbD1V6#k*_xCmfZb* z3IQ{=HsHLNol;h#N?6oH!Cg zUq)-eq!0V(dS@Dp{C=IJp`Tb`P#4nm5Y)lpi| zT3AH|c-gjXH>uG4Og|Iyc9}0p07*NoCDD`P^d~s2 zyZk0jd%Gr$dpR^RZ{nK$+-s0F*eA$a8|>ysa%#QW-3e^MEh#MD>-%&qs9g;Q(pI;W z4p7^bh0RV{bbE11h4@T+Y07Zi=Y%=QZ&rM#|0U^)k8;c+6 z{8_Ne9$8{v5gFkVNT$xxZy5M|anab>mgQ+D2|RC@V{P{~ zX#~?To90pt#=}(B;O-kl%~N%}QD5#+yFuM!P(y4_wuTl5o_DPai|*??r5cWpP+5bA zTL9JIQ9c)HnDva;5WI}7!9QzXTsau7*TAZTK1vibUu_M+5-)Arlm|8B$ry+2F!&`~ zLus4vLX}{;@v^B@Lp?Yo`@gJcvlF-eOeu6?u|IgaNi=+O$cGx*gpNlI^|#nC`@;j{ z-b)TaF(Ds3Z$R7O${MvbxJ$0wwZBmSHG~wMfEo(cwqaprOkB;2*x||+vCO7|&wjX!SJP42CthW!EW%6L5En+5MGZH7 z|H6h?ww|q_VET$=?vh6lI66lAg!Ln}HAHw0kz8ahU#bGCXw+~rs)+l{R`Jv;px6?q zp`3!lZ}bte5ie9$F(gQO@-T3GMHDgNH7_FE(Vp2S4m3OGT_5Vrtz4vbN;E30?oj8` zSkkX|l{ZBVC$~+(hUhzwt>M9veH}Z)lJEr75$Q1DT~cKYLH=Ph!4}$F6*W|hibW09 z57-*6^{k(wsie`2JSWv)XQHx(U=N9g!R>3HhRGgNQA3L+4oolIEm@$CDYQfJ3Q`Rh ztkl*JD)Can_FAanQq5_op?ox3L#2VeXFh}zImP=)HH^1WSwl#WWQcg*xh`s``Iy&` z`wUw{`(o=ym9MPPG`}cKub-S%*1#PtmYiL5*i#=>-1{7dE%D5@J=0AW`dWC}KzfaX zmY{<~LWs&L!b04FC4C5P(oDDQV>ro?AVG%O}RR{$GQH8v8B!1e9t7>SbDyo8UIwP>jMG0Iwk`q1PZ*J0&T zwvALm(G%)Q;OZGfLfz1|DB(c8IVhoEI9tNER-O7rK`U&6L`qv>#6^`QKskd*h}+W+ zCCoU^OL%*TEulnKyVBuM&S)}JDq-9;l_fwmgGjj6!ww~^nEE%i!p&lxm`2)A=54Xl z&oBU0$;?h0GT!i{NS* zM8m}Vj;O)(2(Mx5dbS3SwRbP)fuX?$1~jT6_Ji6Qpp-#0-0RT^HME;F58GkcXSRmo zrEi&OA*m)pd5?DKDw-lnu03TZ<+w@)k&v3^gc6o_nvW7DId*3Dhnd?3Hror8j7hM2 zLiO#Vu82V-ym;Oh zB{X@@OL#eyEg{ykT!DppJ}OIq8U~RtaOeP(P-xFWY=s*;*%G2QE?d4I z`oa=fUnuUTt^}@xK_o1#<%$x9_W2hjBsb{FG}4T99os}#gROsCBS~Hz3{wvUci?10 z17E=)BD|B`P=r~jMJQs~2)2l-){~c2g<8^PH|gLIJYQWAd;x=q_)^ppMfA?#MNCg+ zizu5u*JK2Ya35gaO-HyIYt$9N*Dr{OrqjGoME%gk*bmCPhW)KcPHv(+51;aHIJW#CN#L#*gcg>+yQnLu>%Y%IF)CZu`~6C+DDUI(+8O z#GL2xg|j{Ssz*JuD=}R4DE_d)@ZmhNSBR@;uur%)n4CDOSbQ+17@=Ntdtwhs%8}Q& z=-s0NN0gxycKdaY>;xFO657=DQrf(lTJU1T0?V(x8h|CNVZuNUtxr&x)-yQV6@u;Q z3OCc~UdLYtBd|Blo3|A0yk|r&Nu+u9RsZ+}mjd<-7-lKE)d^)I{e#_G&i-Nn#cLkVv|#uDpsUh{qnp6B69dgP zLZzxF4Eyw!bVT8zibfriqx^FEoT6h8Jo6q8p0jvgX3)Xk2z*`$QVdNmwM$Bg-rF%j0EpnD#NoogENN>vm`_hzK@h{TBq{$DZ=?!3A`6WluXPErYQ zIh=`>fd5-p1#r1pPTNdI@X8HWW5mDR8o&hqvi|Cm$zYbfU=|wjrsgVu2l)g^p1f+5 z6pP?>&+y=zUJhh}Pw2ezm@|M|!CaiW+_tF-;4GJSnj44cW;Sau=E59OoQL!CuEcX* zYq?| zHx%Knne)f#g_VUg&i5Ralw1he+sIBD=h@1_lBqdaD3|K;55~Fvh_z^u@P6)+IP(^{ zHfe5t3m7rCz(ygp$o9U9#+l5_3A*?Fg^0eW%{oMH=-b z&>0UHFDx?)(H~#p(TiE~OHrv|K6jm4Wee0--t>^p5bK1hg3is$NzhZ*&q4Bo!xAy* zuh+B5H!T|GyBhq`#Znq{_lc^IO^r)Toyu~)Ush)>z*z3M1LyhJN$ z#G7tYn*7J)kZ}K7dKGdPkJ*S3Z}r5B$^9tuY*svU&T<{3++z+Y&nR=IUKn!L+bJ zeW}AoTv48z&qQGOglUv; ze^nn;CsH=fci$jTe6cu$!1X@tPvGvS`ZC+P*rezw=io)qd9e8Eoejs;(t-^O7tq+; z+?8>2r|-KYY}$@hlCWv7y<~$PoRjJK?8Rw^+hVDYpBmK5u!^dA`gAQ-Bti(8goDD&xpjmGX3L5Ma z;t}rZ?h`7h)GfQR2SMMR;Xx==Q)V5 zt!Hn=_7^gi7*=^s@0uM}ZrANf*Zt^&$4-E4! zU_wZHyhAyI18M_8gQLuxb+_8S#-?K+iyCjkKo%Yu%;a3K&~8ICRD3qWnMeAlM{!ew zb7tQUjQ{<2C2yV!g@Q# z_myKHGrq+~njM=2yxU~F#p)`^+d|6g-y#ipO>gkL8~Oz?dDq$$dCT!`m+_Wts35P6 zl($dxY2@{a+JW)y<2#JW8=tykTV=?t;qYCAzS)U@%UWeD49@HA7U1cp4VJvAWgc_^ zQU89b`aFL><4h(?EpGBMlK znK^P0O#IT}s2j~(ty>rz6JAt-%SR-0ZFqbIIm>90k+ac;Fec}OaU)+uLhu&AAMr>7 z7tSJW49*!97#8dr6bz>VBu{4M?spw&ZNhk3VSLaXus$ZVbOx;Ke;l)Y$_-dXZ4E*j z5*p@CXZzQ#Mq}WFrHHUJ5z+W5il%+qlwkle0{(Q%Ml*%Kc^eYV!!IyIOAB!cU+!S= zMi<+KP2Kf&B(tea%Cujy5qLhx2-{m5FnC_z#!yQ5WY&EoTtAT~G=3GuB&?D7t>ZYL zTMB==lNfroGa#W)2z<~aiXuAX$V9|9pLxVBwMQ@!w?6pzU=iTmkOi?9+(b0MT8Vd{ zUx-%gO9@?vXCYzLVY{)Jy)8#F33op%&}1IaaVrpUQfCT(bGJ1hA@`~n1>BVN1Oe>| z?LokD9Y-+%2eo#pyB%<9!+=8pz3dDK7~&o*iQo*s=Li@P!vmh`H<}4p=DB2RH{918J_=;9x+&h+v;kNv^Rj z^acr^%;pKrmXBo;W*Nsd&j*AX;g5Kpk2B%54u&Rl_0~pGC#H^ihm>{A_hB4`94^h- zB^qy^a~hcH10{`PuZ{+!bk#;mrxBI5+(N=WD|y1%@A-n4NT|_B2R!;d+^kOj8(~ka ze~_PBD19GpLGmNlL?5izYo8gD#zl- z-cw<>FCVwiXzYvR&~(Yh;@sA)^KV8;z+!%SFR*gHe%zy7v)b)PpG_z}P7*er@6IT< z<{DTI*w@o&oCx3eXhZQazO1+IdI7|nnKK3P+Eg1a!IQVDn2@9}URWlDyn12O&a+jF{gSBQs!CEg;CFtC`1PYk!c>sN} zz;~j=7kt(ZV64%1Z-z(Nn|P#V#9YYrm1;2>%2bzia-EzMCsN zF5Y-&Jz1M@@dGAy&%0HyPMCYzU(DEABt&!@0CBwmn?d4s3I}NS_iqBq-=?+q|BO&O z7VuF!6+W2>b)l;1mqeITe1ei2g);ib5KyF=-g)a+gtE3ggiSeO(iA3?`QCo1MIlnR zU}LyF=|+VY{U#LqW!(6V8uXaY1|H0Oek>DA_hnoM0yb{hZ-OzOz-=`r2XZZ+R12+j zZ}n6rm+lj|l&k+L196dt?2;olay8DZjai$m2(yL`ui}_-nt!Ck{VEdQezNx_@?`UWj*`DFYqWM^ADIC$po9~eNku`|MFV7!EG(yZ)sX8aGsrJd&S9A_a@oQlK_Q1cHemd+AxR@U?Wu*3 z`NkZ>MiwF~HgaB#c0mK@yFuNz^@4r&IB;TF(p~mHXF>Y=cuMZZmMdueK5g}7BeS>s zFFk*nxa;DU%SO7t#9jT0YH-Kl6O5S);e}oLOP&7v=`RsYCV^h4Y4nccs3{_T1M`>q z^}BK76HLvU!bI1EXd3b5XTK!>Afi`pAN;ikOH=XJayV>~{aW;rmd^KQS@1I|I{iY5jv=QebwzTPbR$?EWvEh~Rm6AaFJ3W=Eh zWNP8!jDjE6XyQ+jn4Wl1-I)7H2k*#{lUijMwaK|f_LGO8%DpbO+w}-IKY3zeFsfWxeVgnj_ja~)Zn~(_-D}W=9{ZkPQe=h2rfhua*0p`sJGry^;~j@4K{`QuDvfaIgjX_|>> zolj3rqIIq`+{yeo-LstZ=Nzi*`8imGkbnwDFiZZGhCkOQ=Pu^Y>E11(KR2R*{+}bk z6mA4nT@``B%wKZ1?B|w%WiHG~+IJT^d~Z12OuOO8CO`Q(=o8Xd9&LZyo^wmz>ZefL z_D*|bzm_}5(s@SWoOko!*Pg?$YD$`Jev6;|8ukm>N9pXk=d&-AblGT13jd4NmG{Yh z@yKvX=SI=pmich`9eN@CMgP{n{6!McvHLud%fc@v)QiGSxbNhC*)Qf_-O^e2>jFiH z#**#$U(B9D(IW2P(_K4Xg&^)~dK!cH=;Lw|?(e!ey5Y)}&Iw;%+%F7rPQe~=e)0oZ zUHBi6FXVbuEVcGB{I|}WDva>)`NzoM3j@6FZSd0Mzg^jd|8L7~os%G$TXgQuG1si+ fi?;hzXSO-7AvX|fG*xp}&6#2j9k(C6A))zy^F=UZ diff --git a/code/README.md b/firmware/README.md similarity index 100% rename from code/README.md rename to firmware/README.md diff --git a/firmware/generic/src/data/font.cpp b/firmware/generic/src/data/font.cpp new file mode 100644 index 0000000..cc35ec4 --- /dev/null +++ b/firmware/generic/src/data/font.cpp @@ -0,0 +1,119 @@ +extern "C" +{ +#include "gd32vf103.h" + extern const uint8_t font[1520] ; +} + +/* + Font copied from https://github.com/sipeed/Longan_GD32VF_examples.git + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. +*/ + +const uint8_t font[1520]={ +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x18,0x18,0x00,0x00, +0x00,0x48,0x6C,0x24,0x12,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x24,0x24,0x24,0x7F,0x12,0x12,0x12,0x7F,0x12,0x12,0x12,0x00,0x00, +0x00,0x00,0x08,0x1C,0x2A,0x2A,0x0A,0x0C,0x18,0x28,0x28,0x2A,0x2A,0x1C,0x08,0x08, +0x00,0x00,0x00,0x22,0x25,0x15,0x15,0x15,0x2A,0x58,0x54,0x54,0x54,0x22,0x00,0x00, +0x00,0x00,0x00,0x0C,0x12,0x12,0x12,0x0A,0x76,0x25,0x29,0x11,0x91,0x6E,0x00,0x00, +0x00,0x06,0x06,0x04,0x03,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x40,0x20,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x10,0x10,0x20,0x40,0x00, +0x00,0x02,0x04,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x08,0x08,0x04,0x02,0x00, +0x00,0x00,0x00,0x00,0x08,0x08,0x6B,0x1C,0x1C,0x6B,0x08,0x08,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x08,0x08,0x08,0x08,0x7F,0x08,0x08,0x08,0x08,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x04,0x03, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x06,0x00,0x00, +0x00,0x00,0x80,0x40,0x40,0x20,0x20,0x10,0x10,0x08,0x08,0x04,0x04,0x02,0x02,0x00, +0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00, +0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00, +0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,0x42,0x7E,0x00,0x00, +0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,0x22,0x1C,0x00,0x00, +0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,0x20,0x78,0x00,0x00, +0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,0x22,0x1C,0x00,0x00, +0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x24,0x18,0x00,0x00, +0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, +0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00, +0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,0x24,0x1C,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x04, +0x00,0x00,0x00,0x40,0x20,0x10,0x08,0x04,0x02,0x04,0x08,0x10,0x20,0x40,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x7F,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x02,0x04,0x08,0x10,0x20,0x40,0x20,0x10,0x08,0x04,0x02,0x00,0x00, +0x00,0x00,0x00,0x3C,0x42,0x42,0x46,0x40,0x20,0x10,0x10,0x00,0x18,0x18,0x00,0x00, +0x00,0x00,0x00,0x1C,0x22,0x5A,0x55,0x55,0x55,0x55,0x2D,0x42,0x22,0x1C,0x00,0x00, +0x00,0x00,0x00,0x08,0x08,0x18,0x14,0x14,0x24,0x3C,0x22,0x42,0x42,0xE7,0x00,0x00, +0x00,0x00,0x00,0x1F,0x22,0x22,0x22,0x1E,0x22,0x42,0x42,0x42,0x22,0x1F,0x00,0x00, +0x00,0x00,0x00,0x7C,0x42,0x42,0x01,0x01,0x01,0x01,0x01,0x42,0x22,0x1C,0x00,0x00, +0x00,0x00,0x00,0x1F,0x22,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x22,0x1F,0x00,0x00, +0x00,0x00,0x00,0x3F,0x42,0x12,0x12,0x1E,0x12,0x12,0x02,0x42,0x42,0x3F,0x00,0x00, +0x00,0x00,0x00,0x3F,0x42,0x12,0x12,0x1E,0x12,0x12,0x02,0x02,0x02,0x07,0x00,0x00, +0x00,0x00,0x00,0x3C,0x22,0x22,0x01,0x01,0x01,0x71,0x21,0x22,0x22,0x1C,0x00,0x00, +0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x7E,0x42,0x42,0x42,0x42,0xE7,0x00,0x00, +0x00,0x00,0x00,0x3E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00, +0x00,0x00,0x00,0x7C,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x11,0x0F, +0x00,0x00,0x00,0x77,0x22,0x12,0x0A,0x0E,0x0A,0x12,0x12,0x22,0x22,0x77,0x00,0x00, +0x00,0x00,0x00,0x07,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x7F,0x00,0x00, +0x00,0x00,0x00,0x77,0x36,0x36,0x36,0x36,0x2A,0x2A,0x2A,0x2A,0x2A,0x6B,0x00,0x00, +0x00,0x00,0x00,0xE3,0x46,0x46,0x4A,0x4A,0x52,0x52,0x52,0x62,0x62,0x47,0x00,0x00, +0x00,0x00,0x00,0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x22,0x1C,0x00,0x00, +0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x42,0x3E,0x02,0x02,0x02,0x02,0x07,0x00,0x00, +0x00,0x00,0x00,0x1C,0x22,0x41,0x41,0x41,0x41,0x41,0x4D,0x53,0x32,0x1C,0x60,0x00, +0x00,0x00,0x00,0x3F,0x42,0x42,0x42,0x3E,0x12,0x12,0x22,0x22,0x42,0xC7,0x00,0x00, +0x00,0x00,0x00,0x7C,0x42,0x42,0x02,0x04,0x18,0x20,0x40,0x42,0x42,0x3E,0x00,0x00, +0x00,0x00,0x00,0x7F,0x49,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00, +0x00,0x00,0x00,0xE7,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, +0x00,0x00,0x00,0xE7,0x42,0x42,0x22,0x24,0x24,0x14,0x14,0x18,0x08,0x08,0x00,0x00, +0x00,0x00,0x00,0x6B,0x49,0x49,0x49,0x49,0x55,0x55,0x36,0x22,0x22,0x22,0x00,0x00, +0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x18,0x18,0x18,0x24,0x24,0x42,0xE7,0x00,0x00, +0x00,0x00,0x00,0x77,0x22,0x22,0x14,0x14,0x08,0x08,0x08,0x08,0x08,0x1C,0x00,0x00, +0x00,0x00,0x00,0x7E,0x21,0x20,0x10,0x10,0x08,0x04,0x04,0x42,0x42,0x3F,0x00,0x00, +0x00,0x78,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x78,0x00, +0x00,0x00,0x02,0x02,0x04,0x04,0x08,0x08,0x08,0x10,0x10,0x20,0x20,0x20,0x40,0x40, +0x00,0x1E,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x1E,0x00, +0x00,0x38,0x44,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF, +0x00,0x06,0x08,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x78,0x44,0x42,0x42,0xFC,0x00,0x00, +0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,0x26,0x1A,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x44,0x02,0x02,0x02,0x44,0x38,0x00,0x00, +0x00,0x00,0x00,0x60,0x40,0x40,0x40,0x78,0x44,0x42,0x42,0x42,0x64,0xD8,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x7E,0x02,0x02,0x42,0x3C,0x00,0x00, +0x00,0x00,0x00,0xF0,0x88,0x08,0x08,0x7E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x22,0x22,0x1C,0x02,0x3C,0x42,0x42,0x3C, +0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x3A,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00, +0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00, +0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x38,0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x1E, +0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x72,0x12,0x0A,0x16,0x12,0x22,0x77,0x00,0x00, +0x00,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x92,0x92,0x92,0x92,0x92,0xB7,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,0x26,0x42,0x42,0x42,0x22,0x1E,0x02,0x07, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,0x44,0x42,0x42,0x42,0x44,0x78,0x40,0xE0, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,0x4C,0x04,0x04,0x04,0x04,0x1F,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,0x42,0x02,0x3C,0x40,0x42,0x3E,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3E,0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x14,0x08,0x08,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEB,0x49,0x49,0x55,0x55,0x22,0x22,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,0x24,0x18,0x18,0x18,0x24,0x6E,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,0x42,0x24,0x24,0x14,0x18,0x08,0x08,0x07, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,0x22,0x10,0x08,0x08,0x44,0x7E,0x00,0x00, +0x00,0xC0,0x20,0x20,0x20,0x20,0x20,0x10,0x20,0x20,0x20,0x20,0x20,0x20,0xC0,0x00, +0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10, +0x00,0x06,0x08,0x08,0x08,0x08,0x08,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x06,0x00, +0x0C,0x32,0xC2,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +}; diff --git a/firmware/generic/src/data/frequency.cpp b/firmware/generic/src/data/frequency.cpp new file mode 100644 index 0000000..00767e2 --- /dev/null +++ b/firmware/generic/src/data/frequency.cpp @@ -0,0 +1,9 @@ +extern "C" +{ +#include "gd32vf103.h" + extern const float freq[2113]; +} + +// logaritmic frequency look up table (generated with python script - covers MIDI range for -3V to 8V CV) +const float freq[2113] = {24.135547645748918, 24.22283785971846, 24.310443773234866, 24.398366528077922, 24.48660727015689, 24.5751671495254, 24.6640473203964, 24.753248941157278, 24.842773174384938, 24.93262118686087, 25.02279414958649, 25.113293237798324, 25.204119630983286, 25.295274512894157, 25.386759071564942, 25.478574499326342, 25.57072199282135, 25.66320275302082, 25.75601798523907, 25.849168899149685, 25.94265670880125, 26.036482632633078, 26.13064789349125, 26.22515371864445, 26.320001339799955, 26.41519199311974, 26.510726919236586, 26.606607363270175, 26.702834574843408, 26.799409808098666, 26.896334321714104, 26.993609378920116, 27.091236247515802, 27.18921619988541, 27.287550513015038, 27.386240468509197, 27.485287352607493, 27.58469245620149, 27.684457074851448, 27.784582508803222, 27.88507006300525, 27.98592104712553, 28.087136775568656, 28.188718567493023, 28.290667746827985, 28.39298564229106, 28.495673587405335, 28.59873292051681, 28.70216498481179, 28.805971128334473, 28.9101527040045, 29.014711069634505, 29.119647587947934, 29.224963626596747, 29.330660558179197, 29.436739760257804, 29.543202615377304, 29.65005051108254, 29.757284839936723, 29.864906999539485, 29.972918392545083, 30.08132042668072, 30.190114514764907, 30.299302074725777, 30.408884529619705, 30.518863307649774, 30.62923984218435, 30.74001557177586, 30.85119194017952, 30.96277039637204, 31.07475239457066, 31.187139394252046, 31.29993286017125, 31.413134262380904, 31.526745076250315, 31.640766782484675, 31.755200867144442, 31.870048821664646, 31.985312142874296, 32.10099233301598, 32.21709089976541, 32.33360935625098, 32.450549221073636, 32.56791201832659, 32.685699277615136, 32.803912534076694, 32.92255332840077, 33.041623206848946, 33.16112372127522, 33.28105642914608, 33.401422893560834, 33.522224683272015, 33.64346337270584, 33.765140541982625, 33.88725777693754, 34.00981666914114, 34.132818815920146, 34.25626582037832, 34.38015929141731, 34.50450084375757, 34.62929209795951, 34.75453468044458, 34.88023022351638, 35.00638036538208, 35.132986750173686, 35.26005102796942, 35.387574854815355, 35.51555989274693, 35.64400780981053, 35.7729202800854, 35.90229898370535, 36.0321456068806, 36.16246184191993, 36.29324938725259, 36.424509947450446, 36.556245233250294, 36.68845696157609, 36.82114685556125, 36.95431664457127, 37.08796806422619, 37.22210285642312, 37.35672276935912, 37.49182955755388, 37.62742498187253, 37.76351080954875, 37.90008881420768, 38.03716077588904, 38.1747284810704, 38.31279372269044, 38.45135830017222, 38.59042401944678, 38.72999269297661, 38.87006613977922, 39.01064618545094, 39.1517346621907, 39.29333340882379, 39.435444270826, 39.57806910034757, 39.721209756237315, 39.864868104066915, 40.009046016155224, 40.15374537159258, 40.29896805626541, 40.444715962880785, 40.59099099099099, 40.737795047018416, 40.88513004428037, 41.03299790301389, 41.18140055040095, 41.33033992059351, 41.47981795473863, 41.62983660100392, 41.78039781460287, 41.93150355782024, 42.08315580003781, 42.23535651775992, 42.38810769463924, 42.54141132150269, 42.69526939637737, 42.84968392451645, 43.00465691842558, 43.160190397888925, 43.31628638999547, 43.47294692916556, 43.6301740571774, 43.78796982319351, 43.94633628378764, 44.10527550297147, 44.26478955222149, 44.424880510506014, 44.58555046431239, 44.74680150767394, 44.90863574219753, 45.07105527709082, 45.23406222918967, 45.39765872298594, 45.56184689065506, 45.72662887208374, 45.89200681489801, 46.05798287449118, 46.224559214051794, 46.39173800459202, 46.55952142497584, 46.727911661947374, 46.89691091015956, 47.06652137220268, 47.23674525863291, 47.40758478800141, 47.57904218688307, 47.751119689905465, 47.9238195397782, 48.09714398732196, 48.271095291497836, 48.44567571943695, 48.62088754646971, 48.796733056155844, 48.973214540313826, 49.150334299050776, 49.3280946407928, 49.50649788231459, 49.68554634876983, 49.86524237372174, 50.04558829917302, 50.22658647559662, 50.40823926196657, 50.59054902578834, 50.77351814312986, 50.957148998652684, 51.141443985642724, 51.326405506041596, 51.51203597047814, 51.69833779829941, 51.88531341760246, 52.072965265266156, 52.26129578698252, 52.45030743728887, 52.64000267959991, 52.83038398623951, 53.02145383847314, 53.21321472654035, 53.405669149686844, 53.598819616197304, 53.79266864342821, 53.98721875784026, 54.182472495031575, 54.37843239977082, 54.57510102603011, 54.77248093701836, 54.970574705214986, 55.169384912403004, 55.36891414970287, 55.569165017606444, 55.770140126010524, 55.971842094251016, 56.17427355113731, 56.377437134986074, 56.581335493655935, 56.78597128458212, 56.991347174810706, 57.19746584103359, 57.40432996962358, 57.611942256668975, 57.820305408008956, 58.02942213926901, 58.239295175895904, 58.44992725319346, 58.661321116358394, 58.87347952051565, 59.086405230754565, 59.30010102216508, 59.514569679873475, 59.72981399907894, 59.945836785090165, 60.16264085336147, 60.38022902952977, 60.59860414945155, 60.81776905923945, 61.03772661529951, 61.2584796843687, 61.48003114355176, 61.702383880358994, 61.92554079274408, 62.14950478914135, 62.374278788504064, 62.5998657203425, 62.826268524761836, 63.05349015250059, 63.28153356496935, 63.510401734288926, 63.74009764332925, 63.97062428574859, 64.201984666032, 64.43418179953079, 64.66721871250196, 64.90109844214732, 65.13582403665315, 65.37139855523027, 65.60782506815343, 65.84510665680149, 66.08324641369789, 66.32224744255048, 66.56211285829212, 66.80284578712167, 67.04444936654407, 67.28692674541163, 67.53028108396525, 67.77451555387512, 68.01963333828223, 68.26563763184029, 68.51253164075669, 68.76031858283459, 69.00900168751514, 69.25858419591906, 69.50906936088911, 69.76046044703276, 70.0127607307642, 70.26597350034731, 70.52010205593884, 70.77514970963075, 71.03111978549381, 71.28801561962106, 71.54584056017084, 71.80459796741064, 72.0642912137612, 72.32492368383991, 72.58649877450513, 72.84901989490089, 73.11249046650065, 73.37691392315213, 73.6422937111225, 73.90863328914259, 74.17593612845234, 74.44420571284624, 74.71344553871829, 74.98365911510771, 75.25484996374506, 75.52702161909754, 75.80017762841533, 76.07432155177808, 76.34945696214086, 76.62558744538083, 76.90271660034443, 77.1808480388936, 77.45998538595317, 77.74013227955844, 78.02129237090195, 78.30346932438137, 78.58666681764758, 78.87088854165205, 79.15613820069511, 79.44241951247463, 79.72973620813387, 80.0180920323104, 80.30749074318516, 80.59793611253087, 80.88943192576153, 81.18198198198198, 81.47559009403689, 81.77026008856069, 82.06599580602779, 82.36280110080195, 82.66067984118696, 82.95963590947726, 83.2596732020079, 83.5607956292057, 83.86300711564049, 84.16631160007566, 84.4707130355198, 84.77621538927848, 85.08282264300543, 85.39053879275467, 85.6993678490329, 86.00931383685123, 86.3203807957778, 86.63257277999094, 86.94589385833117, 87.26034811435474, 87.57593964638701, 87.89267256757533, 88.21055100594289, 88.52957910444297, 88.8497610210121, 89.17110092862474, 89.49360301534789, 89.81727148439514, 90.14211055418158, 90.46812445837934, 90.79531744597195, 91.12369378131008, 91.45325774416747, 91.78401362979608, 92.11596574898232, 92.44911842810359, 92.7834760091841, 93.11904284995164, 93.45582332389475, 93.7938218203192, 94.1330427444053, 94.47349051726582, 94.81516957600289, 95.15808437376606, 95.50223937981093, 95.84763907955644, 96.19428797464386, 96.54219058299567, 96.8913514388739, 97.24177509293942, 97.59346611231169, 97.94642908062765, 98.30066859810155, 98.6561892815856, 99.01299576462918, 99.37109269753967, 99.73048474744348, 100.09117659834604, 100.45317295119324, 100.81647852393314, 101.18109805157668, 101.54703628625973, 101.91429799730537, 102.28288797128545, 102.65281101208319, 103.02407194095628, 103.39667559659883, 103.77062683520492, 104.14593053053231, 104.52259157396504, 104.90061487457774, 105.28000535919982, 105.66076797247902, 106.04290767694629, 106.4264294530807, 106.81133829937369, 107.19763923239461, 107.58533728685642, 107.97443751568052, 108.36494499006315, 108.75686479954165, 109.15020205206022, 109.54496187403672, 109.94114941042997, 110.33876982480601, 110.73782829940573, 111.13833003521289, 111.54028025202105, 111.94368418850203, 112.34854710227462, 112.75487426997215, 113.16267098731187, 113.57194256916424, 113.98269434962141, 114.39493168206718, 114.80865993924716, 115.22388451333795, 115.64061081601791, 116.05884427853802, 116.47859035179181, 116.89985450638692, 117.32264223271679, 117.7469590410313, 118.17281046150913, 118.60020204433016, 119.02913935974695, 119.45962799815788, 119.89167357018033, 120.32528170672293, 120.76045805905954, 121.1972082989031, 121.6355381184789, 122.07545323059902, 122.5169593687374, 122.96006228710353, 123.40476776071799, 123.85108158548816, 124.2990095782827, 124.74855757700813, 125.199731440685, 125.65253704952367, 126.10698030500119, 126.5630671299387, 127.02080346857785, 127.4801952866585, 127.94124857149718, 128.403969332064, 128.86836359906158, 129.33443742500393, 129.80219688429463, 130.2716480733063, 130.74279711046054, 131.21565013630686, 131.69021331360298, 132.16649282739579, 132.64449488510095, 133.12422571658425, 133.60569157424334, 134.08889873308814, 134.57385349082327, 135.0605621679305, 135.54903110775024, 136.03926667656447, 136.53127526368058, 137.02506328151338, 137.52063716566917, 138.01800337503028, 138.5171683918381, 139.01813872177823, 139.5209208940655, 140.0255214615284, 140.53194700069463, 141.04020411187767, 141.5502994192615, 142.06223957098763, 142.57603123924213, 143.0916811203417, 143.6091959348213, 144.1285824275224, 144.64984736767983, 145.17299754901026, 145.69803978980178, 146.2249809330013, 146.75382784630426, 147.284587422245, 147.81726657828517, 148.35187225690467, 148.88841142569248, 149.42689107743658, 149.96731823021543, 150.50969992749012, 151.05404323819508, 151.60035525683065, 152.14864310355617, 152.69891392428173, 153.25117489076166, 153.80543320068887, 154.3616960777872, 154.91997077190635, 155.48026455911688, 156.0425847418039, 156.60693864876274, 157.17333363529517, 157.7417770833041, 158.31227640139022, 158.88483902494926, 159.45947241626774, 160.0361840646208, 160.6149814863703, 161.19587222506175, 161.77886385152306, 162.36396396396395, 162.95118018807378, 163.54052017712138, 164.13199161205557, 164.7256022016039, 165.32135968237392, 165.9192718189545, 166.5193464040158, 167.1215912584114, 167.72601423128097, 168.33262320015132, 168.9414260710396, 169.55243077855695, 170.16564528601086, 170.78107758550934, 171.3987356980658, 172.01862767370247, 172.6407615915556, 173.26514555998187, 173.89178771666235, 174.52069622870948, 175.15187929277403, 175.78534513515066, 176.42110201188578, 177.05915820888595, 177.6995220420242, 178.34220185724948, 178.98720603069577, 179.63454296879027, 180.28422110836317, 180.93624891675867, 181.5906348919439, 182.24738756262016, 182.90651548833495, 183.56802725959216, 184.23193149796464, 184.89823685620718, 185.5669520183682, 186.23808569990328, 186.9116466477895, 187.5876436406384, 188.2660854888106, 188.94698103453163, 189.63033915200577, 190.31616874753212, 191.00447875962186, 191.6952781591129, 192.3885759492877, 193.08438116599135, 193.7827028777478, 194.48355018587884, 195.18693222462338, 195.8928581612553, 196.6013371962031, 197.3123785631712, 198.02599152925836, 198.74218539507933, 199.46096949488697, 200.18235319669208, 200.90634590238648, 201.63295704786628, 202.36219610315337, 203.09407257251945, 203.82859599461074, 204.5657759425709, 205.30562202416638, 206.04814388191255, 206.79335119319765, 207.54125367040984, 208.29186106106462, 209.0451831479301, 209.80122974915548, 210.56001071839964, 211.32153594495804, 212.08581535389257, 212.8528589061614, 213.62267659874738, 214.39527846478921, 215.17067457371283, 215.94887503136104, 216.7298899801263, 217.5137295990833, 218.30040410412045, 219.08992374807343, 219.88229882085994, 220.67753964961202, 221.47565659881147, 222.27666007042578, 223.0805605040421, 223.88736837700407, 224.69709420454924, 225.5097485399443, 226.32534197462374, 227.14388513832847, 227.96538869924282, 228.78986336413436, 229.61731987849433, 230.4477690266759, 231.28122163203582, 232.11768855707604, 232.95718070358362, 233.79970901277383, 234.64528446543358, 235.4939180820626, 236.34562092301826, 237.20040408866032, 238.0582787194939, 238.91925599631577, 239.78334714036066, 240.65056341344587, 241.5209161181191, 242.3944165978062, 243.2710762369578, 244.15090646119805, 245.0339187374748, 245.92012457420705, 246.80953552143598, 247.70216317097632, 248.5980191565654, 249.49711515401626, 250.39946288137, 251.30507409904735, 252.21396061000237, 253.1261342598774, 254.0416069371557, 254.960390573317, 255.88249714299437, 256.807938664128, 257.73672719812316, 258.66887485000785, 259.60439376858926, 260.5432961466126, 261.4855942209211, 262.4313002726137, 263.38042662720596, 264.33298565479157, 265.2889897702019, 266.2484514331685, 267.2113831484867, 268.1777974661763, 269.14770698164654, 270.121124335861, 271.0980622155005, 272.07853335312893, 273.06255052736117, 274.05012656302677, 275.04127433133834, 276.03600675006055, 277.0343367836762, 278.03627744355646, 279.041841788131, 280.0510429230568, 281.06389400138926, 282.08040822375534, 283.100598838523, 284.12447914197526, 285.15206247848425, 286.1833622406834, 287.2183918696426, 288.2571648550448, 289.29969473535965, 290.3459950980205, 291.39607957960357, 292.4499618660026, 293.5076556926085, 294.56917484449, 295.63453315657034, 296.70374451380934, 297.77682285138496, 298.85378215487316, 299.93463646043085, 301.01939985498024, 302.10808647639016, 303.2007105136613, 304.29728620711234, 305.39782784856345, 306.5023497815233, 307.61086640137773, 308.7233921555744, 309.8399415438127, 310.96052911823375, 312.0851694836078, 313.21387729752547, 314.34666727059033, 315.4835541666082, 316.62455280278044, 317.7696780498985, 318.9189448325355, 320.0723681292416, 321.2299629727406, 322.3917444501235, 323.5577277030461, 324.7279279279279, 325.90236037614756, 327.08104035424276, 328.26398322411114, 329.4512044032078, 330.64271936474785, 331.838543637909, 333.0386928080316, 334.2431825168228, 335.45202846256194, 336.66524640030264, 337.8828521420792, 339.1048615571139, 340.3312905720217, 341.5621551710187, 342.7974713961316, 344.03725534740494, 345.2815231831112, 346.53029111996375, 347.7835754333247, 349.04139245741897, 350.30375858554805, 351.5706902703013, 352.84220402377156, 354.1183164177719, 355.3990440840484, 356.68440371449896, 357.97441206139155, 359.26908593758054, 360.56844221672634, 361.87249783351734, 363.1812697838878, 364.4947751252403, 365.8130309766699, 367.1360545191843, 368.4638629959293, 369.79647371241435, 371.1339040367364, 372.47617139980656, 373.823293295579, 375.1752872812768, 376.5321709776212, 377.89396206906326, 379.26067830401155, 380.63233749506423, 382.0089575192437, 383.3905563182258, 384.7771518985754, 386.1687623319827, 387.5654057554956, 388.9671003717577, 390.37386444924675, 391.7857163225106, 393.2026743924062, 394.6247571263424, 396.0519830585167, 397.48437079015866, 398.92193898977393, 400.36470639338415, 401.81269180477295, 403.26591409573257, 404.72439220630673, 406.1881451450389, 407.6571919892215, 409.1315518851418, 410.61124404833276, 412.0962877638251, 413.5867023863953, 415.0825073408197, 416.58372212212925, 418.0903662958602, 419.60245949831096, 421.1200214367993, 422.6430718899161, 424.17163070778514, 425.7057178123228, 427.24535319749475, 428.79055692957843, 430.34134914742566, 431.8977500627221, 433.4597799602526, 435.0274591981666, 436.6008082082409, 438.17984749614686, 439.7645976417199, 441.35507929922403, 442.95131319762294, 444.55332014085155, 446.1611210080842, 447.77473675400813, 449.3941884090985, 451.0194970798886, 452.6506839492475, 454.28777027665694, 455.93077739848565, 457.5797267282687, 459.23463975698866, 460.8955380533518, 462.56244326407165, 464.2353771141521, 465.91436140716723, 467.59941802554766, 469.29056893086715, 470.9878361641252, 472.6912418460365, 474.40080817732064, 476.1165574389878, 477.83851199263154, 479.5666942807213, 481.30112682689173, 483.0418322362382, 484.7888331956124, 486.5421524739156, 488.3018129223961, 490.0678374749496, 491.8402491484141, 493.61907104287195, 495.40432634195264, 497.1960383131308, 498.9942303080325, 500.79892576274, 502.6101481980947, 504.42792122000475, 506.2522685197548, 508.0832138743114, 509.920781146634, 511.76499428598873, 513.615877328256, 515.4734543962463, 517.3377497000157, 519.2087875371785, 521.0865922932252, 522.9711884418422, 524.8626005452275, 526.7608532544119, 528.6659713095831, 530.5779795404038, 532.496902866337, 534.4227662969734, 536.3555949323526, 538.2954139632931, 540.242248671722, 542.196124431001, 544.1570667062579, 546.1251010547223, 548.1002531260535, 550.0825486626767, 552.0720135001211, 554.0686735673524, 556.0725548871129, 558.083683576262, 560.1020858461136, 562.1277880027785, 564.1608164475107, 566.201197677046, 568.2489582839505, 570.3041249569685, 572.3667244813668, 574.4367837392851, 576.5143297100896, 578.5993894707193, 580.691990196041, 582.7921591592071, 584.8999237320052, 587.015311385217, 589.13834968898, 591.2690663131407, 593.4074890276187, 595.5536457027699, 597.7075643097463, 599.8692729208617, 602.0387997099605, 604.2161729527803, 606.4014210273226, 608.5945724142247, 610.7956556971269, 613.0046995630466, 615.2217328027555, 617.4467843111488, 619.6798830876254, 621.9210582364675, 624.1703389672156, 626.4277545950509, 628.6933345411807, 630.9671083332164, 633.2491056055609, 635.539356099797, 637.837889665071, 640.1447362584832, 642.4599259454812, 644.783488900247, 647.1154554060922, 649.4558558558558, 651.8047207522951, 654.1620807084855, 656.5279664482223, 658.9024088064156, 661.2854387294957, 663.677087275818, 666.0773856160632, 668.4863650336456, 670.9040569251239, 673.3304928006053, 675.7657042841583, 678.2097231142278, 680.6625811440434, 683.1243103420373, 685.5949427922632, 688.0745106948099, 690.5630463662224, 693.0605822399275, 695.5671508666494, 698.0827849148379, 700.6075171710961, 703.1413805406027, 705.6844080475431, 708.2366328355438, 710.7980881680968, 713.3688074289979, 715.9488241227831, 718.5381718751611, 721.1368844334527, 723.7449956670347, 726.3625395677756, 728.9895502504806, 731.6260619533398, 734.2721090383686, 736.9277259918586, 739.5929474248287, 742.2678080734728, 744.9523427996131, 747.646586591158, 750.3505745625536, 753.0643419552424, 755.7879241381265, 758.5213566080231, 761.2646749901285, 764.0179150384874, 766.7811126364516, 769.5543037971509, 772.3375246639654, 775.1308115109912, 777.9342007435154, 780.7477288984935, 783.5714326450212, 786.4053487848124, 789.2495142526848, 792.1039661170335, 794.9687415803173, 797.8438779795479, 800.7294127867683, 803.6253836095459, 806.5318281914651, 809.4487844126135, 812.3762902900778, 815.314383978443, 818.2631037702836, 821.2224880966655, 824.1925755276502, 827.1734047727906, 830.1650146816394, 833.1674442442585, 836.1807325917204, 839.2049189966219, 842.2400428735986, 845.2861437798322, 848.3432614155703, 851.4114356246456, 854.4907063949895, 857.5811138591569, 860.6826982948513, 863.7955001254442, 866.9195599205052, 870.0549183963332, 873.2016164164818, 876.3596949922937, 879.5291952834398, 882.7101585984481, 885.9026263952459, 889.1066402817031, 892.3222420161684, 895.5494735080163, 898.788376818197, 902.0389941597772, 905.301367898495, 908.5755405533139, 911.8615547969713, 915.1594534565374, 918.4692795139773, 921.7910761067036, 925.1248865281433, 928.4707542283041, 931.8287228143345, 935.1988360510953, 938.5811378617343, 941.9756723282504, 945.382483692073, 948.8016163546413, 952.2331148779756, 955.6770239852631, 959.1333885614426, 962.6022536537835, 966.0836644724764, 969.5776663912249, 973.0843049478312, 976.6036258447922, 980.1356749498992, 983.6804982968282, 987.2381420857439, 990.8086526839053, 994.3920766262617, 997.988460616065, 1001.59785152548, 1005.2202963961894, 1008.8558424400095, 1012.5045370395096, 1016.1664277486228, 1019.841562293268, 1023.5299885719775, 1027.231754656512, 1030.9469087924926, 1034.6754994000314, 1038.417575074357, 1042.1731845864504, 1045.9423768836843, 1049.725201090455, 1053.5217065088239, 1057.3319426191663, 1061.1559590808076, 1064.993805732674, 1068.8455325939467, 1072.7111898647051, 1076.5908279265861, 1080.484497343444, 1084.392248862002, 1088.3141334125157, 1092.2502021094447, 1096.200506252107, 1100.1650973253534, 1104.1440270002422, 1108.137347134705, 1112.1451097742258, 1116.167367152524, 1120.2041716922272, 1124.255576005557, 1128.3216328950214, 1132.402395354092, 1136.497916567901, 1140.608249913937, 1144.7334489627335, 1148.8735674785703, 1153.028659420179, 1157.1987789414386, 1161.383980392082, 1165.5843183184143, 1169.7998474640103, 1174.030622770434, 1178.27669937796, 1182.5381326262814, 1186.8149780552374, 1191.1072914055399, 1195.4151286194926, 1199.7385458417234, 1204.077599419921, 1208.4323459055606, 1212.8028420546452, 1217.1891448284493, 1221.5913113942538, 1226.0093991260933, 1230.443465605511, 1234.8935686222976, 1239.3597661752508, 1243.842116472935, 1248.3406779344311, 1252.8555091901019, 1257.3866690823613, 1261.9342166664328, 1266.4982112111218, 1271.078712199594, 1275.675779330142, 1280.2894725169665, 1284.9198518909625, 1289.566977800494, 1294.2309108121844, 1298.9117117117116, 1303.6094415045902, 1308.324161416971, 1313.0559328964446, 1317.8048176128311, 1322.5708774589914, 1327.354174551636, 1332.1547712321264, 1336.9727300672912, 1341.8081138502478, 1346.6609856012105, 1351.5314085683167, 1356.4194462284556, 1361.3251622880869, 1366.2486206840747, 1371.1898855845263, 1376.1490213896197, 1381.1260927324447, 1386.121164479855, 1391.1343017332988, 1396.1655698296759, 1401.2150343421922, 1406.2827610812053, 1411.3688160950862, 1416.4732656710876, 1421.5961763361936, 1426.7376148579958, 1431.8976482455662, 1437.0763437503222, 1442.2737688669054, 1447.4899913340694, 1452.7250791355511, 1457.9791005009613, 1463.2521239066796, 1468.5442180767373, 1473.855451983717, 1479.1858948496574, 1484.5356161469456, 1489.9046855992262, 1495.293173182316, 1500.7011491251071, 1506.1286839104848, 1511.575848276253, 1517.0427132160462, 1522.529349980257, 1528.035830076975, 1533.562225272903, 1539.1086075943017, 1544.6750493279308, 1550.2616230219824, 1555.8684014870307, 1561.495457796987, 1567.1428652900424, 1572.8106975696248, 1578.4990285053696, 1584.207932234067, 1589.9374831606347, 1595.6877559590957, 1601.4588255735366, 1607.2507672190918, 1613.0636563829303, 1618.897568825227, 1624.7525805801556, 1630.628767956886, 1636.5262075405672, 1642.444976193331, 1648.3851510553004, 1654.3468095455812, 1660.3300293632788, 1666.334888488517, 1672.3614651834407, 1678.4098379932439, 1684.480085747197, 1690.5722875596643, 1696.6865228311406, 1702.8228712492912, 1708.981412789979, 1715.1622277183137, 1721.3653965897026, 1727.5910002508883, 1733.8391198410104, 1740.1098367926663, 1746.4032328329636, 1752.7193899845875, 1759.0583905668796, 1765.4203171968961, 1771.8052527904917, 1778.2132805634062, 1784.6444840323368, 1791.0989470160325, 1797.576753636394, 1804.0779883195544, 1810.60273579699, 1817.1510811066278, 1823.7231095939426, 1830.318906913075, 1836.9385590279546, 1843.5821522134072, 1850.2497730562866, 1856.9415084566083, 1863.657445628669, 1870.3976721021907, 1877.1622757234686, 1883.9513446565009, 1890.764967384146, 1897.6032327092826, 1904.4662297559512, 1911.3540479705262, 1918.2667771228853, 1925.204507307567, 1932.1673289449527, 1939.1553327824497, 1946.1686098956625, 1953.2072516895844, 1960.2713498997985, 1967.3609965936564, 1974.4762841714878, 1981.6173053678106, 1988.7841532525233, 1995.97692123213, 2003.19570305096, 2010.4405927923788, 2017.711684880019, 2025.0090740790192, 2032.3328554972456, 2039.683124586536, 2047.059977143955, 2054.463509313024, 2061.8938175849853, 2069.350998800063, 2076.835150148714, 2084.3463691729007, 2091.8847537673687, 2099.45040218091, 2107.0434130176477, 2114.6638852383326, 2122.3119181616153, 2129.987611465348, 2137.6910651878934, 2145.4223797294103, 2153.1816558531723, 2160.968994686888, 2168.784497724004, 2176.6282668250315, 2184.5004042188893, 2192.401012504214, 2200.3301946507067, 2208.2880540004844, 2216.27469426941, 2224.2902195484517, 2232.334734305048, 2240.4083433844544, 2248.511152011114, 2256.6432657900427, 2264.804790708184, 2272.995833135802, 2281.216499827874, 2289.466897925467, 2297.7471349571406, 2306.057318840358, 2314.397557882877, 2322.767960784164, 2331.1686366368285, 2339.5996949280207, 2348.061245540868, 2356.55339875592, 2365.0762652525627, 2373.6299561104747, 2382.2145828110797, 2390.8302572389853, 2399.477091683447, 2408.155198839842, 2416.8646918111212, 2425.6056841092905, 2434.3782896568987, 2443.1826227885076, 2452.0187982521866, 2460.886931211022, 2469.787137244595, 2478.7195323505016, 2487.68423294587, 2496.6813558688623, 2505.7110183802038, 2514.7733381647226, 2523.8684333328656, 2532.9964224222435, 2542.157424399188, 2551.351558660284, 2560.578945033933, 2569.839703781925, 2579.133955600988, 2588.461821624369, 2597.8234234234233, 2607.2188830091804, 2616.648322833942, 2626.111865792889, 2635.6096352256623, 2645.141754917983, 2654.708349103272, 2664.309542464253, 2673.9454601345824, 2683.6162277004955, 2693.321971202421, 2703.0628171366334, 2712.8388924569113, 2722.6503245761737, 2732.4972413681494, 2742.3797711690527, 2752.2980427792395, 2762.2521854648894, 2772.24232895971, 2782.2686034665976, 2792.3311396593517, 2802.4300686843844, 2812.5655221624106, 2822.7376321901725, 2832.946531342175, 2843.192352672387, 2853.4752297159916, 2863.7952964911324, 2874.1526875006443, 2884.5475377338107, 2894.9799826681387, 2905.4501582711023, 2915.9582010019226, 2926.504247813359, 2937.0884361534745, 2947.710903967434, 2958.371789699315, 2969.071232293891, 2979.8093711984525, 2990.586346364632, 3001.4022982502142, 3012.2573678209696, 3023.151696552506, 3034.0854264320924, 3045.058699960514, 3056.07166015395, 3067.124450545806, 3078.2172151886034, 3089.3500986558615, 3100.5232460439647, 3111.7368029740614, 3122.990915593974, 3134.285730580085, 3145.6213951392497, 3156.998057010739, 3168.415864468134, 3179.8749663212693, 3191.3755119181915, 3202.9176511470732, 3214.5015344381836, 3226.1273127658606, 3237.795137650454, 3249.505161160311, 3261.257535913772, 3273.0524150811343, 3284.889952386662, 3296.770302110601, 3308.6936190911624, 3320.6600587265575, 3332.669776977034, 3344.7229303668814, 3356.8196759864877, 3368.960171494394, 3381.1445751193287, 3393.373045662281, 3405.6457424985824, 3417.962825579958, 3430.3244554366274, 3442.7307931794053, 3455.1820005017767, 3467.678239682021, 3480.2196735853327, 3492.806465665927, 3505.438779969175, 3518.116781133759, 3530.8406343937922, 3543.6105055809835, 3556.4265611268124, 3569.2889680646736, 3582.197894032065, 3595.153507272788, 3608.1559766391088, 3621.20547159398, 3634.3021622132555, 3647.446219187885, 3660.63781382615, 3673.8771180559092, 3687.1643044268144, 3700.499546112573, 3713.8830169132166, 3727.314891257338, 3740.7953442043813, 3754.324551446937, 3767.9026893130017, 3781.529934768292, 3795.206465418565, 3808.9324595119024, 3822.7080959410523, 3836.5335542457706, 3850.409014615134, 3864.3346578899054, 3878.3106655648994, 3892.337219791325, 3906.4145033791688, 3920.542699799597, 3934.721993187313, 3948.9525683429756, 3963.234610735621, 3977.5683065050466, 3991.95384246426, 4006.39140610192, 4020.8811855847575, 4035.423369760038, 4050.0181481580385, 4064.6657109944913, 4079.366249173072, 4094.11995428791, 4108.927018626048, 4123.787635169971, 4138.701997600126, 4153.670300297428, 4168.692738345801, 4183.769507534737, 4198.90080436182, 4214.086826035295, 4229.327770476665, 4244.6238363232305, 4259.975222930696, 4275.382130375787, 4290.844759458821, 4306.363311706345, 4321.937989373776, 4337.568995448008, 4353.256533650063, 4369.000808437779, 4384.802025008428, 4400.6603893014135, 4416.576108000969, 4432.54938853882, 4448.580439096903, 4464.669468610096, 4480.816686768909, 4497.022304022228, 4513.2865315800855, 4529.609581416368, 4545.991666271604, 4562.432999655748, 4578.933795850934, 4595.494269914281, 4612.114637680716, 4628.795115765754, 4645.535921568328, 4662.337273273657, 4679.199389856041, 4696.122491081736, 4713.10679751184, 4730.1525305051255, 4747.259912220949, 4764.429165622159, 4781.6605144779705, 4798.954183366894, 4816.310397679684, 4833.7293836222425, 4851.211368218581, 4868.756579313797, 4886.365245577015, 4904.037596504373, 4921.773862422044, 4939.57427448919, 4957.439064701003, 4975.36846589174, 4993.362711737725, 5011.4220367604075, 5029.546676329445, 5047.736866665731, 5065.992844844487, 5084.314848798376, 5102.703117320568, 5121.157890067866, 5139.67940756385, 5158.267911201976, 5176.923643248738, 5195.6468468468465, 5214.437766018361, 5233.296645667884, 5252.223731585778, 5271.2192704513245, 5290.283509835966, 5309.416698206544, 5328.619084928506, 5347.890920269165, 5367.232455400991, 5386.643942404842, 5406.125634273267, 5425.6777849138225, 5445.300649152347, 5464.994482736299, 5484.759542338105, 5504.596085558479, 5524.504370929779, 5544.48465791942, 5564.537206933195, 5584.662279318703, 5604.860137368769, 5625.131044324821, 5645.475264380345, 5665.89306268435, 5686.384705344774, 5706.950459431983, 5727.590592982265, 5748.305375001289, 5769.095075467621, 5789.9599653362775, 5810.900316542205, 5831.916402003845, 5853.008495626718, 5874.176872306949, 5895.421807934868, 5916.74357939863, 5938.142464587782, 5959.618742396905, 5981.172692729264, 6002.8045965004285, 6024.514735641939, 6046.303393105012, 6068.170852864185, 6090.117399921028, 6112.1433203079, 6134.248901091612, 6156.434430377207, 6178.700197311723, 6201.046492087929, 6223.473605948123, 6245.981831187948, 6268.57146116017, 6291.242790278499, 6313.996114021478, 6336.831728936268, 6359.749932642539, 6382.751023836383, 6405.8353022941465, 6429.003068876367, 6452.254625531721, 6475.590275300908, 6499.010322320622, 6522.515071827544, 6546.104830162269, 6569.779904773324, 6593.540604221202, 6617.387238182325, 6641.320117453115, 6665.339553954068, 6689.445860733763, 6713.639351972975, 6737.920342988788, 6762.289150238657, 6786.746091324562, 6811.291484997165, 6835.925651159916, 6860.648910873255, 6885.461586358811, 6910.364001003553, 6935.356479364042, 6960.439347170665, 6985.612931331854, 7010.87755993835, 7036.233562267518, 7061.6812687875845, 7087.221011161967, 7112.853122253625, 7138.577936129347, 7164.39578806413, 7190.307014545576, 7216.3119532782175, 7242.41094318796, 7268.604324426511, 7294.89243837577, 7321.2756276523, 7347.7542361118185, 7374.328608853629, 7400.999092225146, 7427.766033826433, 7454.629782514676, 7481.590688408763, 7508.649102893874, 7535.805378626003, 7563.059869536584, 7590.41293083713, 7617.864919023805, 7645.416191882105, 7673.067108491541, 7700.818029230268, 7728.669315779811, 7756.621331129799, 7784.67443958265, 7812.8290067583375, 7841.085399599194, 7869.443986374626, 7897.905136685951, 7926.469221471242, 7955.136613010093, 7983.90768492852, 8012.78281220384, 8041.762371169515, 8070.846739520076, 8100.036296316077, 8129.331421988983, 8158.732498346144, 8188.23990857582, 8217.854037252097, 8247.575270339941, 8277.403995200251, 8307.340600594856, 8337.385476691603, 8367.539015069475, 8397.80160872364, 8428.17365207059, 8458.65554095333, 8489.247672646461, 8519.950445861392, 8550.764260751574, 8581.689518917641, 8612.72662341269, 8643.875978747552, 8675.137990896015, 8706.513067300126, 8738.001616875557, 8769.604050016856, 8801.320778602827, 8833.152216001938, 8865.09877707764, 8897.160878193807, 8929.338937220193, 8961.633373537818, 8994.044608044456, 9026.573063160171, 9059.219162832736, 9091.983332543208, 9124.865999311496, 9157.867591701868, 9190.988539828562, 9224.229275361433, 9257.590231531509, 9291.071843136657, 9324.674546547314, 9358.398779712083, 9392.244982163473, 9426.21359502368, 9460.305061010251, 9494.519824441899, 9528.858331244319, 9563.321028955941, 9597.908366733787, 9632.620795359368, 9667.458767244485, 9702.422736437162, 9737.513158627595, 9772.73049115403, 9808.075193008746, 9843.547724844087, 9879.14854897838, 9914.878129402006, 9950.73693178348, 9986.72542347545, 10022.844073520815, 10059.09335265889, 10095.473733331462, 10131.985689688974, 10168.629697596753, 10205.406234641136, 10242.315780135732, 10279.3588151277, 10316.535822403952, 10353.847286497476, 10391.293693693693, 10428.875532036722, 10466.593291335768, 10504.447463171557, 10542.438540902649, 10580.567019671931, 10618.833396413089, 10657.238169857012, 10695.78184053833, 10734.464910801982, 10773.287884809684, 10812.251268546534, 10851.355569827645, 10890.601298304695, 10929.988965472598, 10969.51908467621, 11009.192171116958, 11049.008741859558, 11088.96931583884, 11129.07441386639, 11169.324558637407, 11209.720274737538, 11250.262088649642, 11290.95052876069, 11331.7861253687, 11372.769410689549, 11413.900918863967, 11455.18118596453, 11496.610750002577, 11538.190150935243, 11579.919930672555, 11621.80063308441, 11663.83280400769, 11706.016991253437, 11748.353744613898, 11790.843615869737, 11833.48715879726, 11876.284929175565, 11919.23748479381, 11962.345385458528, 12005.609193000857, 12049.029471283879, 12092.606786210024, 12136.34170572837, 12180.234799842056, 12224.2866406158, 12268.497802183225, 12312.868860754414, 12357.400394623446, 12402.092984175843, 12446.947211896259, 12491.963662375896, 12537.14292232032, 12582.485580557013, 12627.992228042956, 12673.663457872519, 12719.499865285094, 12765.502047672766, 12811.670604588277, 12858.00613775275, 12904.509251063442, 12951.180550601803, 12998.020644641261, 13045.030143655087, 13092.20966032452, 13139.559809546667, 13187.081208442403, 13234.774476364633, 13282.640234906246, 13330.679107908136, 13378.89172146751, 13427.278703945967, 13475.840685977577, 13524.578300477297, 13573.49218264914, 13622.58296999433, 13671.851302319816, 13721.297821746528, 13770.923172717621, 13820.728002007088, 13870.7129587281, 13920.87869434133, 13971.225862663692, 14021.75511987672, 14072.467124535036, 14123.362537575153, 14174.442022323952, 14225.70624450725, 14277.155872258678, 14328.79157612828, 14380.614029091152, 14432.623906556419, 14484.82188637594, 14537.208648853022, 14589.78487675152, 14642.551255304616, 14695.508472223637, 14748.657217707241, 14801.99818445031, 14855.532067652866, 14909.259565029331, 14963.181376817543, 15017.298205787749, 15071.610757251989, 15126.119739073187, 15180.82586167426, 15235.72983804759, 15290.832383764227, 15346.134216983082, 15401.636058460519, 15457.338631559642, 15513.242662259598, 15569.348879165278, 15625.658013516693, 15682.170799198388, 15738.887972749233, 15795.81027337192, 15852.938442942484, 15910.273226020166, 15967.81536985706, 16025.56562440768, 16083.524742339012, 16141.693479040172, 16200.072592632154, 16258.662843977943, 16317.464996692308, 16376.47981715164, 16435.70807450417, 16495.1505406799, 16554.807990400503, 16614.68120118969, 16674.770953383224, 16735.07803013895, 16795.603217447257, 16856.347304141203, 16917.31108190666, 16978.4953452929, 17039.900891722802, 17101.528521503147, 17163.37903783526, 17225.4532468254, 17287.751957495104, 17350.275981792005, 17413.026134600274, 17476.003233751115, 17539.208100033688, 17602.641557205672, 17666.304432003875, 17730.197554155257, 17794.321756387635, 17858.677874440385, 17923.266747075613, 17988.089216088938, 18053.146126320342, 18118.43832566545, 18183.96666508644, 18249.731998622992, 18315.735183403714, 18381.97707965715, 18448.458550722866, 18515.180463062992, 18582.143686273335, 18649.34909309463, 18716.79755942414, 18784.489964326967, 18852.42719004736, 18920.610122020476, 18989.03964888382, 19057.716662488638, 19126.64205791186, 19195.8167334676, 19265.241590718735, 19334.917534488948, 19404.845472874345, 19475.02631725519, 19545.46098230803, 19616.150386017518, 19687.095449688175, 19758.297097956736, 19829.756258804035, 19901.47386356696, 19973.45084695087, 20045.688147041652, 20118.18670531778, 20190.9474666629, 20263.97137937797, 20337.259395193505, 20410.812469282246, 20484.631560271486, 20558.7176302554, 20633.07164480788, 20707.694572994977, 20782.587387387386, 20857.75106407342, 20933.186582671566, 21008.894926343113, 21084.877081805273, 21161.13403934389, 21237.666792826178, 21314.476339713994, 21391.563681076685, 21468.929821603964, 21546.575769619343, 21624.502537093093, 21702.71113965529, 21781.202596609364, 21859.977930945224, 21939.03816935242, 22018.384342233883, 22098.017483719144, 22177.93863167768, 22258.14882773275, 22338.64911727484, 22419.440549475075, 22500.524177299256, 22581.901057521412, 22663.5722507374, 22745.53882137907, 22827.80183772796, 22910.36237192906, 22993.221500005122, 23076.380301870515, 23159.83986134511, 23243.60126616879, 23327.665608015406, 23412.033982506873, 23496.707489227767, 23581.6872317395, 23666.97431759452, 23752.5698583511, 23838.474969587645, 23924.690770917055, 24011.218386001685, 24098.058942567786, 24185.21357242005, 24272.683411456706, 24360.469599684144, 24448.5732812316, 24536.995604366424, 24625.737721508853, 24714.800789246892, 24804.185968351685, 24893.894423792517, 24983.927324751792, 25074.28584464064, 25164.971161114026, 25255.984456085913, 25347.326915745038, 25438.999730570187, 25531.004095345532, 25623.341209176553, 25716.0122755055, 25809.018502126884, 25902.361101203605, 25996.041289282522, 26090.060287310174, 26184.41932064904, 26279.119619093333, 26374.162416884807, 26469.548952729267, 26565.280469812493, 26661.35821581627, 26757.78344293502, 26854.557407891934, 26951.681371955154, 27049.156600954593, 27146.98436529828, 27245.16593998866, 27343.70260463963, 27442.595643493056, 27541.846345435242, 27641.456004014177, 27741.4259174562, 27841.75738868266, 27942.451725327384, 28043.51023975344, 28144.934249070073, 28246.725075150305, 28348.884044647904, 28451.4124890145, 28554.311744517356, 28657.58315225656, 28761.228058182303, 28865.247813112837, 28969.64377275188, 29074.417297706044, 29179.56975350304, 29285.10251060923, 29391.016944447274, 29497.314435414482, 29603.99636890062, 29711.064135305733, 29818.519130058663, 29926.362753635087, 30034.596411575498, 30143.221514503977, 30252.239478146374, 30361.65172334852, 30471.45967609518, 30581.664767528455, 30692.268433966165, 30803.272116921038, 30914.677263119283, 31026.485324519195, 31138.697758330556, 31251.316027033386, 31364.341598396775, 31477.775945498466, 31591.62054674384, 31705.87688588497, 31820.546452040333, 31935.63073971412, 32051.13124881536, 32167.049484678024, 32283.386958080344, 32400.145185264308, 32517.325687955887, 32634.929993384616, 32752.95963430328, 32871.41614900834, 32990.3010813598, 33109.615980801005, 33229.36240237938, 33349.54190676645, 33470.1560602779, 33591.20643489451, 33712.69460828241, 33834.62216381332, 33956.9906905858, 34079.801783445604, 34203.057043006294, 34326.75807567052, 34450.9064936508, 34575.50391499021, 34700.55196358401, 34826.05226920055, 34952.00646750223, 35078.416200067375, 35205.283114411344, 35332.60886400775, 35460.39510831051, 35588.64351277527, 35717.35574888077, 35846.53349415123, 35976.178432177876, 36106.292252640684, 36236.8766513309, 36367.93333017288, 36499.463997245985, 36631.47036680743, 36763.9541593143, 36896.91710144573, 37030.360926125984, 37164.28737254667, 37298.69818618926, 37433.59511884828, 37568.979928653935, 37704.85438009472, 37841.22024404095, 37978.07929776764, 38115.433324977275, 38253.28411582372, 38391.6334669352, 38530.48318143747, 38669.835068977896, 38809.69094574869, 38950.05263451038, 39090.92196461606, 39232.300772035036, 39374.19089937635, 39516.59419591347, 39659.51251760807, 39802.94772713392, 39946.90169390174, 40091.376294083304, 40236.37341063556, 40381.8949333258, 40527.94275875594, 40674.51879038701, 40821.62493856449, 40969.26312054297, 41117.4352605108, 41266.14328961576, 41415.38914598995, 41565.17477477477, 41715.50212814684, 41866.37316534313, 42017.78985268623, 42169.754163610545, 42322.26807868778, 42475.333585652355, 42628.95267942799, 42783.12736215337, 42937.85964320793, 43093.15153923869, 43249.005074186185, 43405.42227931058, 43562.40519321873, 43719.95586189045, 43878.07633870484, 44036.76868446777, 44196.03496743829, 44355.87726335536, 44516.2976554655, 44677.29823454968, 44838.88109895015, 45001.04835459851, 45163.802115042825, 45327.1445014748, 45491.07764275814, 45655.60367545592, 45820.72474385812, 45986.443000010244, 46152.76060374103, 46319.67972269022, 46487.20253233758, 46655.33121603081, 46824.067965013746, 46993.414978455534, 47163.374463479, 47333.94863518904, 47505.1397167022, 47676.94993917529, 47849.38154183411, 48022.43677200337, 48196.11788513557, 48370.4271448401, 48545.36682291341, 48720.93919936829, 48897.1465624632, 49073.99120873285, 49251.475443017705, 49429.601578493784}; + diff --git a/firmware/generic/src/data/images.cpp b/firmware/generic/src/data/images.cpp new file mode 100644 index 0000000..9f89ab6 --- /dev/null +++ b/firmware/generic/src/data/images.cpp @@ -0,0 +1,7 @@ +extern "C" +{ +#include "gd32vf103.h" +} + + +const uint8_t img1[176] = {255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 50, 8, 102, 66, 38, 15, 115, 1, 66, 1, 34, 1, 130, 0, 70, 0, 32, 0, 131, 0, 72, 0, 30, 0, 131, 0, 74, 0, 28, 0, 255, 116, 0, 76, 0, 26, 0, 255, 255, 112, 24, 9, 24, 45, 11, 120, 0, 33, 0, 69, 0, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 146, 0, 239, 68, 255, 255, 130, 0, 76, 0, 26, 0, 104, 0, 210, 0, 55, 0, 74, 0, 28, 0, 74, 0, 28, 0, 27, 0, 72, 0, 30, 0, 72, 0, 30, 0, 27, 0, 70, 0, 32, 0, 70, 0, 32, 0, 27, 1, 66, 1, 34, 1, 66, 1, 34, 1, 27, 66, 38, 2, 25, 8, 25, 2, 38, 2, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 255, 252}; diff --git a/firmware/generic/src/drivers/SysTick.cpp b/firmware/generic/src/drivers/SysTick.cpp new file mode 100644 index 0000000..1f34d47 --- /dev/null +++ b/firmware/generic/src/drivers/SysTick.cpp @@ -0,0 +1,67 @@ +extern "C" { +#include "gd32vf103.h" +} +#include +#include "SysTick.h" +static SysTick *pSysTick = 0; +void SysTick::begin(uint32_t usPeriod) +{ + pSysTick = this; + SystemClockSpeed = 108000000/8; // the GD32VF103 divides the high speed clock by 8 + Period = usPeriod; + Period = Period * SystemClockSpeed; + Period = Period / 1000000; + NextInterruptTime = Period; + // Zero the clock to start with + *(volatile uint32_t *)(TIMER_CTRL_ADDR + TIMER_MTIME + 4)=0; + *(volatile uint32_t *)(TIMER_CTRL_ADDR + TIMER_MTIME )=0; + *(volatile uint32_t *)(TIMER_CTRL_ADDR + TIMER_MTIMECMP + 4)=NextInterruptTime >> 32; + *(volatile uint32_t *)(TIMER_CTRL_ADDR + TIMER_MTIMECMP ) = NextInterruptTime & 0xffffffff; + eclic_enable_interrupt(CLIC_INT_TMR); +} +void SysTick::OnInterrupt() +{ + // At each interrupt the Timer compare register has to be updated to the next + // interrupt time. + NextInterruptTime += Period; + *(volatile uint32_t *)(TIMER_CTRL_ADDR + TIMER_MTIMECMP + 4)=NextInterruptTime >> 32; + *(volatile uint32_t *)(TIMER_CTRL_ADDR + TIMER_MTIMECMP ) = NextInterruptTime & 0xffffffff; + + // LED blink (relies on the LED port bits being initialized elsewhere) + static int State = 0; + if (State) + { + GPIO_BOP(GPIOA) = GPIO_PIN_1; + State = 0; + } + else + { + GPIO_BC(GPIOA) = GPIO_PIN_1; + State = 1; + } +} +void SysTick::delay(uint32_t msdly) +{ +// delay for thet specified number of milliseconds; + uint64_t EndTime = msdly; + EndTime = (EndTime * SystemCoreClock/8000); + EndTime = EndTime + get_timer_value(); + + while(get_timer_value() < EndTime); +} + +// The interrupt handler for the internal timer. C naming is required +// to allow it to over-ride the weak symbol defined in the startup code. +// Also have to insert assembler to back up and restore registers prior +// to calling C++ interrupt handler +// Based on initial investigations it would seem that context is saved +// before entry in to this function and restored afterwards i.e. this +// is not an interrupt service routine in the true sense - it is a +// function called by another interrupt handler buried deeper in the +// SDK. +extern "C" { +void eclic_mtip_handler() +{ + pSysTick->OnInterrupt(); +} +} diff --git a/firmware/generic/src/drivers/SysTick.h b/firmware/generic/src/drivers/SysTick.h new file mode 100644 index 0000000..653bdf9 --- /dev/null +++ b/firmware/generic/src/drivers/SysTick.h @@ -0,0 +1,16 @@ +#ifndef __SysTick_h +#define __SysTick_h +#include +class SysTick{ + +public: + SysTick() {}; + void begin(uint32_t usPeriod); + void OnInterrupt(); + void delay(uint32_t msdly); +private: + uint64_t SystemClockSpeed; + uint64_t NextInterruptTime; + uint64_t Period; +}; +#endif \ No newline at end of file diff --git a/firmware/generic/src/drivers/adc.cpp b/firmware/generic/src/drivers/adc.cpp new file mode 100644 index 0000000..0abe2bc --- /dev/null +++ b/firmware/generic/src/drivers/adc.cpp @@ -0,0 +1,28 @@ +#include "adc.h" +extern "C" +{ +#include "gd32vf103.h" +} + +// anUpdate (downshifted oversampling) +uint8_t anCount = 0; // counter for oversampling (new value after 255, @44,4KHz => 173Hz, suitable for potentiometers) +uint32_t anTotal[MAX_AN]; // the running total +int anAvg[MAX_AN]; // analog average +uint16_t anRaw[8]; // raw sampled values stored by DMA + +// analog average (downshifted oversampling) +void adc::update(uint8_t ch) +{ + if (anCount < 255) + { + anTotal[ch] += anRaw[ch]; + } + else + { + if (ch == 2 || ch == 3) // these potentiometers are inverted due to routing + anAvg[ch] = 4095 - (anTotal[ch] >> 8); // note that raw[2] and raw[3] is still inverted... + else + anAvg[ch] = anTotal[ch] >> 8; // inputs and pot 3 is not inverted + anTotal[ch] = 0; + } +} \ No newline at end of file diff --git a/firmware/generic/src/drivers/adc.h b/firmware/generic/src/drivers/adc.h new file mode 100644 index 0000000..4bca932 --- /dev/null +++ b/firmware/generic/src/drivers/adc.h @@ -0,0 +1,22 @@ +#ifndef __adc_h +#define __adc_h +extern "C" +{ +#include +} + +#define MAX_AN 5 // number of analog filters + +class adc +{ +public: + adc(){}; + uint16_t anRaw[8]; // raw sampled values stored by DMA + int anAvg[MAX_AN]; // analog average + uint8_t anCount; // counter for oversampling (new value after 255, @44,4KHz => 173Hz, suitable for potentiometers) + void update(uint8_t ch); + +private: + uint32_t anTotal[MAX_AN]; // the running total +}; +#endif \ No newline at end of file diff --git a/firmware/generic/src/drivers/display.cpp b/firmware/generic/src/drivers/display.cpp new file mode 100644 index 0000000..a9bfb3c --- /dev/null +++ b/firmware/generic/src/drivers/display.cpp @@ -0,0 +1,581 @@ +#include +#include "display.h" +#include "spi.h" +#include "SysTick.h" +extern "C" +{ +#include "gd32vf103.h" +} +extern SysTick stk; +/* + The LCD display on the eurorack module is an ST7789 with a resolution + of 240 x 240 + It's an SPI device connected as follows: + SCK PB13 (SCK1) + MOSI PB15 (MOSI1) + RST PA8 (reset) + DC PA11 (aka RS) + BLK PB10 (backlight) + +*/ + +/* + The LCD display on the sipeed longan nano seems to be an ST7735 with a resolution + of 160 x 80 + It's an SPI device connected as follows: + SCK PA5 (SCK0) + MOSI PA7 (MOSI0) + RS PB0 + RST PB1 + CS PB2 +*/ +void display::begin(spi *SPI, const uint8_t *font) +{ + + this->SPI = SPI; // remember the SPI interface + XYSwapped = 0; // XY Not swapped to begin with + + // Turn on Port A + rcu_periph_clock_enable(RCU_GPIOA); + // Turn on Port B + rcu_periph_clock_enable(RCU_GPIOB); + + // Configure the various control pins + gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8 | GPIO_PIN_11); + gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10); + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_15); + SPI->begin(); + + // Initialization sequence from Longan sample code + RSTHigh(); // Drive reset high + stk.delay(25); // wait + RSTLow(); // Drive reset low + stk.delay(250); // wait + RSTHigh(); // Drive reset high + stk.delay(25); // wait + + writeCommand(0x01); // sw reset + stk.delay(150); // wait + + writeCommand(0x11); // turn off sleep mode + stk.delay(100); + + writeCommand(0x3A); // set color mode + writeData8(0x55); // 16 bit color + stk.delay(10); + + writeCommand(0x36); // Color order RGB:0x00 BGR:0x08 + writeData8(0x00); // + + // power settings + writeCommand(0xb2); // porch control + writeData8(0x0c); + writeData8(0x0c); + writeData8(0x00); + writeData8(0x33); + writeData8(0x33); + writeCommand(0xb7); // gate control + writeData8(0x35); + writeCommand(0xbb); // vcoms + writeData8(0x28); + writeCommand(0xc0); // LCM control + writeData8(0x0c); + writeCommand(0xc2); // VDV and VRH command enable + writeData8(0x01); + writeData8(0xff); + writeCommand(0xc3); // voltage VRHS set + writeData8(0x10); + writeCommand(0xc4); // VDV set + writeData8(0x20); + writeCommand(0xc6); // FR control 2 + writeData8(0x0f); + writeCommand(0xd0); // power control 1 + writeData8(0xa4); + writeData8(0xa1); + + writeCommand(0xe0); // positive gamma control + writeData8(0xd0); + writeData8(0x00); + writeData8(0x02); + writeData8(0x07); + writeData8(0x0a); + writeData8(0x28); + writeData8(0x32); + writeData8(0x44); + writeData8(0x42); + writeData8(0x06); + writeData8(0x0e); + writeData8(0x12); + writeData8(0x14); + writeData8(0x17); + + writeCommand(0xe1); // negative gamma control + writeData8(0xd0); + writeData8(0x00); + writeData8(0x02); + writeData8(0x07); + writeData8(0x0a); + writeData8(0x28); + writeData8(0x31); + writeData8(0x54); + writeData8(0x47); + writeData8(0x0e); + writeData8(0x1c); + writeData8(0x17); + writeData8(0x1b); + writeData8(0x1e); + + writeCommand(0x2A); // column address set + writeData8(0x00); // + writeData8(0x00); // x start + writeData8(0x00); // + writeData8(0xef); // x end (240) + + writeCommand(0x2B); // row address set + writeData8(0x00); // + writeData8(0x00); // y start + writeData8(0x00); // y end upper + writeData8(0xef); // y end lower (240) + + writeCommand(0x21); // invon + stk.delay(10); + writeCommand(0x13); // normal display on + stk.delay(10); + writeCommand(0x29); // main screen turn on + stk.delay(10); + + BLKHigh(); // turn on backlight + fillRectangle(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0x0000); // black out the screen +} + +void display::showImg(const uint8_t *img, uint16_t size, uint8_t x, uint8_t y, uint16_t width, uint16_t height, uint16_t color) +{ + uint8_t preRow[width]; + uint8_t pixel = 0; + uint8_t invert = 0; + uint8_t pixelCount; + uint16_t rgb = 0; + for (uint8_t i = 0; i < width; i++) + preRow[i] = 0; + openAperture(x, y, x + width, y + height); + for (uint16_t pImg = 0; pImg < size; pImg++) + { + pixelCount = *(img + pImg); + if (pixelCount < 255) + { + pixelCount++; + invert = 1; + } + while (pixelCount > 0) + { + preRow[x] ^= pixel; + rgb = RGBToWord(0x0, 0x0, 0x0); + if (preRow[x] != 0) + { + rgb = color; + } + writeData16(rgb); + pixelCount--; + x++; + if (x == width) + x = 0; + } + if (invert == 1) + { + pixel ^= 1; + invert = 0; + } + } +} + +void display::putChar(char ch, uint8_t x, uint8_t y, uint16_t txtFg, uint16_t txtBg) +{ + if ((' ' <= ch) && (ch <= '~')) // 7bit ASCII + { + openAperture(x, y, x + 8 - 1, y + 16 - 1); + ch += 4; + const uint8_t *charFont = _font + (uint8_t)ch * 16; + for (uint8_t y = 0; y < 16; ++y) + { + for (uint8_t x = 0, c = charFont[y]; x < 8; ++x, c >>= 1) + { + uint16_t rgb = (c & 0x01) ? txtFg : txtBg; + writeData16(rgb); + } + } + } +} + +void display::putStr(const char *str, uint8_t x, uint8_t y, uint16_t txtFg, uint16_t txtBg) +{ + while (*str) + putChar(*(str++), x += 9, y, txtFg, txtBg); +} + +void display::putPixel(uint16_t x, uint16_t y, uint16_t colour) +{ + openAperture(x, y, x + 1, y + 1); + writeData16(colour); +} + +void display::putImage(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t *Image) +{ + uint16_t Colour; + openAperture(x, y, x + width - 1, y + height - 1); + for (y = 0; y < height; y++) + { + for (x = 0; x < width; x++) + { + Colour = *(Image++); + writeData16(Colour); + } + } +} +void display::drawRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t Colour) +{ + drawLine(x, y, x + w, y, Colour); + drawLine(x, y, x, y + h, Colour); + drawLine(x + w, y, x + w, y + h, Colour); + drawLine(x, y + h, x + w, y + h, Colour); +} +void display::fillRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t Colour) +{ + openAperture(x, y, x + width - 1, y + height - 1); + for (y = 0; y < height; y++) + { + for (x = 0; x < width; x++) + { + writeData16(Colour); + } + } +} +void display::drawCircle(uint16_t x0, uint16_t y0, uint16_t radius, uint16_t Colour) +{ + // Reference : https://en.wikipedia.org/wiki/Midpoint_circle_algorithm + int x = radius - 1; + int y = 0; + int dx = 1; + int dy = 1; + int err = dx - (radius << 1); + if (radius > x0) + return; // don't draw even parially off-screen circles + if (radius > y0) + return; // don't draw even parially off-screen circles + + if ((x0 + radius) > SCREEN_WIDTH) + return; // don't draw even parially off-screen circles + if ((y0 + radius) > SCREEN_HEIGHT) + return; // don't draw even parially off-screen circles + while (x >= y) + { + putPixel(x0 + x, y0 + y, Colour); + putPixel(x0 + y, y0 + x, Colour); + putPixel(x0 - y, y0 + x, Colour); + putPixel(x0 - x, y0 + y, Colour); + putPixel(x0 - x, y0 - y, Colour); + putPixel(x0 - y, y0 - x, Colour); + putPixel(x0 + y, y0 - x, Colour); + putPixel(x0 + x, y0 - y, Colour); + + if (err <= 0) + { + y++; + err += dy; + dy += 2; + } + + if (err > 0) + { + x--; + dx += 2; + err += dx - (radius << 1); + } + } +} +void display::fillCircle(uint16_t x0, uint16_t y0, uint16_t radius, uint16_t Colour) +{ + // Reference : https://en.wikipedia.org/wiki/Midpoint_circle_algorithm + // Similar to drawCircle but fills the circle with lines instead + int x = radius - 1; + int y = 0; + int dx = 1; + int dy = 1; + int err = dx - (radius << 1); + + if (radius > x0) + return; // don't draw even parially off-screen circles + if (radius > y0) + return; // don't draw even parially off-screen circles + + if ((x0 + radius) > SCREEN_WIDTH) + return; // don't draw even parially off-screen circles + if ((y0 + radius) > SCREEN_HEIGHT) + return; // don't draw even parially off-screen circles + while (x >= y) + { + drawLine(x0 - x, y0 + y, x0 + x, y0 + y, Colour); + drawLine(x0 - y, y0 + x, x0 + y, y0 + x, Colour); + drawLine(x0 - x, y0 - y, x0 + x, y0 - y, Colour); + drawLine(x0 - y, y0 - x, x0 + y, y0 - x, Colour); + + if (err <= 0) + { + y++; + err += dy; + dy += 2; + } + + if (err > 0) + { + x--; + dx += 2; + err += dx - (radius << 1); + } + } +} +void display::drawLineLowSlope(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t Colour) +{ + // Reference : https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm + int dx = x1 - x0; + int dy = y1 - y0; + int yi = 1; + if (dy < 0) + { + yi = -1; + dy = -dy; + } + int D = 2 * dy - dx; + + int y = y0; + + for (int x = x0; x <= x1; x++) + { + putPixel(x, y, Colour); + if (D > 0) + { + y = y + yi; + D = D - 2 * dx; + } + D = D + 2 * dy; + } +} + +void display::drawLineHighSlope(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t Colour) +{ + // Reference : https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm + + int dx = x1 - x0; + int dy = y1 - y0; + int xi = 1; + if (dx < 0) + { + xi = -1; + dx = -dx; + } + int D = 2 * dx - dy; + int x = x0; + + for (int y = y0; y <= y1; y++) + { + putPixel(x, y, Colour); + if (D > 0) + { + x = x + xi; + D = D - 2 * dy; + } + D = D + 2 * dx; + } +} +void display::drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t Colour) +{ + // Reference : https://en.wikipedia.org/wiki/Bresenham%27s_line_algorithm + if (iabs(y1 - y0) < iabs(x1 - x0)) + { + if (x0 > x1) + { + drawLineLowSlope(x1, y1, x0, y0, Colour); + } + else + { + drawLineLowSlope(x0, y0, x1, y1, Colour); + } + } + else + { + if (y0 > y1) + { + drawLineHighSlope(x1, y1, x0, y0, Colour); + } + else + { + drawLineHighSlope(x0, y0, x1, y1, Colour); + } + } +} + +void display::openAperture(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2) +{ + // open up an area for drawing on the display + /* + // For some strange reason, the LCD on the Sipeed Longan Nano has a 26 pixel + // offset on the x dimension and 1 pixel on the y-dimension + if (!XYSwapped) + { + x1 += 26; + x2 += 26; + y1++; + y2++; + } + else + { + y1 += 26; + y2 += 26; + x1++; + x2++; + } + */ + writeCommand(0x2A); // Set X limits + RSHigh(); + CSLow(); + SPI->writeData8(x1 >> 8); + SPI->writeData8(x1 & 0xff); + SPI->writeData8(x2 >> 8); + SPI->writeData8(x2 & 0xff); + CSHigh(); + writeCommand(0x2B); // Set Y limits + RSHigh(); + CSLow(); + SPI->writeData8(y1 >> 8); + SPI->writeData8(y1 & 0xff); + SPI->writeData8(y2 >> 8); + SPI->writeData8(y2 & 0xff); + CSHigh(); + writeCommand(0x2c); // put display in to data write mode +} + +void display::RSLow() +{ // drive D/C pin low + gpio_bit_reset(GPIOA, GPIO_PIN_11); +} +void display::RSHigh() +{ // drive D/C pin high + gpio_bit_set(GPIOA, GPIO_PIN_11); +} +void display::RSTLow() +{ // Drive reset low + gpio_bit_reset(GPIOA, GPIO_PIN_8); +} +void display::RSTHigh() +{ // Drive reset high + gpio_bit_set(GPIOA, GPIO_PIN_8); +} +void display::CSLow() +{ // Drive chip select low + // gpio_bit_reset(GPIOB,GPIO_PIN_2); +} +void display::CSHigh() +{ // Drive chip select high + // gpio_bit_set(GPIOB,GPIO_PIN_2); +} +void display::BLKLow() +{ // Drive backlight low (off) + gpio_bit_reset(GPIOB, GPIO_PIN_10); +} +void display::BLKHigh() +{ // Drive backlight high (on) + gpio_bit_set(GPIOB, GPIO_PIN_10); +} +void display::writeCommand(uint8_t Cmd) +{ + RSLow(); + CSLow(); + SPI->writeData8(Cmd); + CSHigh(); +} +void display::writeData8(uint8_t Data) +{ + RSHigh(); + CSLow(); + SPI->writeData8(Data); + CSHigh(); +} +void display::writeData16(uint16_t Data) +{ + RSHigh(); + CSLow(); + SPI->writeData16(Data); + CSHigh(); +} +void display::exchangeXY() +{ + writeCommand(0x36); + if (!XYSwapped) + { + XYSwapped = 1; + writeData8(0x20); + } + else + { + XYSwapped = 0; + writeData8(0x00); + } +} +uint32_t display::getWidth() +{ + if (!XYSwapped) + { + return SCREEN_WIDTH; + } + else + { + return SCREEN_HEIGHT; + } +} +uint32_t display::getHeight() +{ + if (!XYSwapped) + { + return SCREEN_HEIGHT; + } + else + { + return SCREEN_WIDTH; + } +} + +void display::showSprite(const uint8_t *rle_data, uint16_t size) +{ + const uint8_t *__ip, *__il, *__rd; + __ip = (rle_data); + __il = __ip + (size)*2; + __rd = (rle_data); + { /* RGB16 */ + while (__ip < __il) + { + uint16_t __l = *(__rd++); + if (__l & 128) + { + __l = __l - 128; + do + { + // memcpy (__ip, __rd, 2); + writeData8(*__rd); + writeData8(*(__rd + 1)); + __ip += 2; + } while (--__l); + __rd += 2; + } + else + { + __l *= 2; + //memcpy (__ip, __rd, __l); + for (int i = 0; i < __l; i++) + { + writeData8(*(__rd + i)); + } + __ip += __l; + __rd += __l; + } + } + } +} diff --git a/firmware/generic/src/drivers/display.h b/firmware/generic/src/drivers/display.h new file mode 100644 index 0000000..0242612 --- /dev/null +++ b/firmware/generic/src/drivers/display.h @@ -0,0 +1,58 @@ +#ifndef __display_h +#define __display_h +#include +#include "spi.h" +// Assumption: Top left of display is 0,0 +#define SCREEN_WIDTH 240 +#define SCREEN_HEIGHT 240 +// Define a macro to allow easy definition of colours +// Format of colour value: +//#define RGBToWord( R, G, B) ( ((G&0xf8) << (11-3)) | ((R&0xfc) << (5-2)) | ((B&0xf8)>>3) ) +#define RGBToWord( R, G, B) ( ((B&0xf8) << (11-3)) | ((G&0xfc) << (5-2)) | ((R&0xf8)>>3) ) +class display +{ +public: + display(){}; + void begin(spi *SPI, const uint8_t *font); + void showImg(const uint8_t *img, uint16_t size, uint8_t x, uint8_t y, uint16_t width, uint16_t height, uint16_t color); + void putChar(char ch, uint8_t x, uint8_t y, uint16_t txtFg, uint16_t txtBg); + void putStr(const char *str, uint8_t x, uint8_t y, uint16_t txtFg, uint16_t txtBg); + void putPixel(uint16_t x, uint16_t y, uint16_t colour); + void putImage(uint16_t x, uint16_t y, uint16_t width, uint16_t height, const uint16_t *Image); + void drawRectangle(uint16_t x, uint16_t y, uint16_t w, uint16_t h, uint16_t Colour); + void fillRectangle(uint16_t x, uint16_t y, uint16_t width, uint16_t height, uint16_t Colour); + void drawCircle(uint16_t x0, uint16_t y0, uint16_t radius, uint16_t Colour); + void fillCircle(uint16_t x0, uint16_t y0, uint16_t radius, uint16_t Colour); + void drawLineLowSlope(uint16_t x0, uint16_t y0, uint16_t x1,uint16_t y1, uint16_t Colour); + void drawLineHighSlope(uint16_t x0, uint16_t y0, uint16_t x1,uint16_t y1, uint16_t Colour); + void drawLine(uint16_t x0, uint16_t y0, uint16_t x1, uint16_t y1, uint16_t Colour); + void openAperture(uint16_t x1, uint16_t y1, uint16_t x2, uint16_t y2); + void exchangeXY(); + uint32_t getWidth(); + uint32_t getHeight(); + void showSprite(const uint8_t *rle_data, uint16_t size); +private: + void RSLow(); + void RSHigh(); + void resetDisplay(); + void writeCommand(uint8_t Cmd); + void writeData8(uint8_t Data); + void writeData16(uint16_t Data); + void RSTLow(); + void RSTHigh(); + void CSLow(); + void CSHigh(); + void BLKLow(); + void BLKHigh(); + int iabs(int x) // simple integer version of abs for use by graphics functions + { + if (x < 0) + return -x; + else + return x; + } + spi *SPI; + int XYSwapped; + const uint8_t *_font ; // ' ' .. '~' +}; +#endif \ No newline at end of file diff --git a/firmware/generic/src/drivers/encoder.cpp b/firmware/generic/src/drivers/encoder.cpp new file mode 100644 index 0000000..45e2304 --- /dev/null +++ b/firmware/generic/src/drivers/encoder.cpp @@ -0,0 +1,51 @@ +extern "C" +{ +#include "gd32vf103.h" +} +#include "encoder.h" + +// Check rotation encoder for changes. +// Does not use gpio interrupts, designed to be called @ ~44Khz inside timer int. + +char encoder::get() +{ + uint16_t portB = gpio_input_port_get(GPIOB) & 0x70; // PB4 select, PB5 & PB6 encoder data + if (portB == 0x70) + { + if (ccCount > 0) + ccCount--; + if (cwCount > 0) + cwCount--; + if (ccCount == 0 && cwCount == 0) + { + encDir = 0; + } + } + else if (cwCount < 32 && portB == 0x50) + cwCount++; + else if (ccCount < 32 && portB == 0x30) + ccCount++; + + // test clockwise + if (cwCount == 32 && encDir == 0) + { + encDir = 'W'; + return 'W'; + } + + // test counter clockwise + else if (ccCount == 32 && encDir == 0) + { + encDir = 'C'; + return 'C'; + } + + // test encoder click + else if (portB == 0x60 && encDir == 0) + { + encDir = 'S'; + ccCount = 32; // delay before reset (remove debounce jitter) + return 'S'; + } + return 0; +} \ No newline at end of file diff --git a/firmware/generic/src/drivers/encoder.h b/firmware/generic/src/drivers/encoder.h new file mode 100644 index 0000000..3315117 --- /dev/null +++ b/firmware/generic/src/drivers/encoder.h @@ -0,0 +1,19 @@ +#ifndef __encoder_h +#define __encoder_h +extern "C" +{ +#include +} + +class encoder +{ +public: + encoder(){}; + char get(); + +private: + char encDir; // encoder direction + uint8_t cwCount; // clockwise encoder count + uint8_t ccCount; // counter clockwise encoder count +}; +#endif \ No newline at end of file diff --git a/firmware/generic/src/drivers/led.h b/firmware/generic/src/drivers/led.h new file mode 100644 index 0000000..e313dd2 --- /dev/null +++ b/firmware/generic/src/drivers/led.h @@ -0,0 +1,73 @@ +#ifndef __led_h +#define __led_h +extern "C" { + #include +} +class led { +public: + led() {}; + void begin() { + /* enable the led clock */ + rcu_periph_clock_enable(RCU_GPIOC); + rcu_periph_clock_enable(RCU_GPIOA); + + /* configure led GPIO port */ + gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13); + gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); + gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); + + GPIO_BOP(GPIOC) = GPIO_PIN_13; + GPIO_BOP(GPIOA) = GPIO_PIN_1; + GPIO_BOP(GPIOA) = GPIO_PIN_2; + } + /*! + Turn on the red part of the RGB LED + by clearing PC13 + */ + void red_on() + { + GPIO_BC(GPIOC) = GPIO_PIN_13; + } + /*! + Turn off the red part of the RGB LED + by setting PC13 + */ + void red_off() + { + GPIO_BOP(GPIOC) = GPIO_PIN_13; + } + /*! + Turn on the blue part of the RGB LED + by clearing PA1 + */ + void green_on() + { + GPIO_BC(GPIOA) = GPIO_PIN_1; + } + /*! + Turn off the green part of the RGB LED + by setting PA1 + */ + void green_off() + { + GPIO_BOP(GPIOA) = GPIO_PIN_1; + } + /*! + Turn on the blue part of the RGB LED + by clearing PA2 + */ + void blue_on() + { + GPIO_BC(GPIOA) = GPIO_PIN_2; + } + /*! + Turn off the blue part of the RGB LED + by setting PA2 + */ + void blue_off() + { + GPIO_BOP(GPIOA) = GPIO_PIN_2; + } + +}; +#endif \ No newline at end of file diff --git a/firmware/generic/src/drivers/scope.cpp b/firmware/generic/src/drivers/scope.cpp new file mode 100644 index 0000000..f49ad27 --- /dev/null +++ b/firmware/generic/src/drivers/scope.cpp @@ -0,0 +1,46 @@ +#include "scope.h" +#include "drivers\display.h" +scope::scope(uint16_t Colour) +{ + this->Colour = Colour; + offset = 76; // add space above scope + scale = 1; + BufferInputIndex = 0; + for (uint32_t i = 0; i < SCOPE_BUFFER_SIZE; i++) + { + Buffer[i] = 0; + } +} + +void scope::draw(display &dsp) +{ + uint16_t YLocn; + for (uint32_t i = 0; i < SCOPE_BUFFER_SIZE; i++) + { + YLocn = /*dsp.getHeight()/2 +*/ offset + (Buffer[i] * scale); + dsp.putPixel(i, YLocn, Colour); + } +} + +void scope::draw1(display &dsp, uint16_t pos) +{ + uint16_t YLocn; + YLocn = /*dsp.getHeight()/2 +*/ offset + (Buffer[pos] * scale); + dsp.putPixel(pos, YLocn + 1, Colour); +} + +uint16_t scope::read(uint16_t pos) +{ + return (Buffer[pos]); +} + +void scope::write(uint16_t pos, uint16_t value) +{ + Buffer[pos] = value; +} + +void scope::insert(uint16_t value) +{ + Buffer[BufferInputIndex] = value; + BufferInputIndex = (BufferInputIndex + 1) % SCOPE_BUFFER_SIZE; +} diff --git a/firmware/generic/src/drivers/scope.h b/firmware/generic/src/drivers/scope.h new file mode 100644 index 0000000..74dd7ed --- /dev/null +++ b/firmware/generic/src/drivers/scope.h @@ -0,0 +1,41 @@ +#ifndef __SCOPE_H +#define __SCOPE_H +#include +#include "drivers\display.h" +// Drawing of scope data: +/* Two basic approaches: + 1: Don't remember any scope data and simply overwrite the + screen each time you want to draw. + 2: Remember the scope data and "undraw" before draw. + This also allows dot-joining +Third possible approach is to have a screen buffer and do DMA +A bit concerned that this might cause interrupt jitter though. +Whatever the mechanism it would be nice to avoid too much flicker +on the display. +*/ +// In order to avoid dynamic memory allocation for scope data +// a fixed size array has to be declared here. +#if SCREEN_WIDTH > SCREEN_HEIGHT +#define SCOPE_BUFFER_SIZE SCREEN_WIDTH +#else +#define SCOPE_BUFFER_SIZE SCREEN_HEIGHT +#endif + +class scope +{ +public: + scope(uint16_t Colour); + void draw(display &dsp); + void draw1(display &dsp, uint16_t pos); + uint16_t read(uint16_t pos); + void write(uint16_t pos, uint16_t value); + void insert(uint16_t value); + +private: + uint32_t offset; + uint32_t scale; + uint16_t Buffer[SCOPE_BUFFER_SIZE]; + uint32_t BufferInputIndex; + uint16_t Colour; +}; +#endif \ No newline at end of file diff --git a/firmware/generic/src/drivers/spi.cpp b/firmware/generic/src/drivers/spi.cpp new file mode 100644 index 0000000..8ad5f08 --- /dev/null +++ b/firmware/generic/src/drivers/spi.cpp @@ -0,0 +1,38 @@ +extern "C" { +#include +#include +} +#include "spi.h" +// SPI1 is wired to the LCD display on the eurorack module. +void spi::begin() +{ + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_SPI1); + spi_parameter_struct spi_init_struct; + spi_struct_para_init(&spi_init_struct); + /* SPI0 configuration 8-bit full duplex, software control of slave select, master more*/ + spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; + spi_init_struct.device_mode = SPI_MASTER; + spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; + spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE; + spi_init_struct.nss = SPI_NSS_SOFT; + spi_init_struct.prescale = SPI_PSC_8; + spi_init_struct.endian = SPI_ENDIAN_MSB; + spi_init(SPI1, &spi_init_struct); + spi_crc_off(SPI1); + spi_enable(SPI1); +} +uint8_t spi::writeData8(uint8_t data) +{ + spi_i2s_data_transmit(SPI1,data); + while(spi_i2s_flag_get(SPI1,SPI_FLAG_TRANS)); // wait for transmit to complete + return 0; +} +uint16_t spi::writeData16(uint16_t data) +{ + spi_i2s_data_transmit(SPI1,data>>8); + while(spi_i2s_flag_get(SPI1,SPI_FLAG_TRANS)); // wait for transmit to complete + spi_i2s_data_transmit(SPI1,data & 0xff); + while(spi_i2s_flag_get(SPI1,SPI_FLAG_TRANS)); // wait for transmit to complete + return 0; +} \ No newline at end of file diff --git a/firmware/generic/src/drivers/spi.h b/firmware/generic/src/drivers/spi.h new file mode 100644 index 0000000..6524fa3 --- /dev/null +++ b/firmware/generic/src/drivers/spi.h @@ -0,0 +1,11 @@ +#ifndef __spi_h +#define __spi_h +class spi { + +public: + spi() {}; + void begin(); + uint8_t writeData8(uint8_t data); + uint16_t writeData16(uint16_t data); +}; +#endif \ No newline at end of file diff --git a/firmware/generic/src/drivers/timer.cpp b/firmware/generic/src/drivers/timer.cpp new file mode 100644 index 0000000..6e563de --- /dev/null +++ b/firmware/generic/src/drivers/timer.cpp @@ -0,0 +1,97 @@ +extern "C" +{ +#include "gd32vf103.h" +} +#include "timer.h" +static timer *ptimer = 0; + +void timer::begin() +{ + ptimer = this; + /* ---------------------------------------------------------------------------- + TIMER6 Configuration: + Want the timer to run with an interrupt frequency of ~44.1kHz. + SystemCoreClock = 108MHz + TIMER6CLK = SystemCoreClock/2431 = 44.4KHz. + TIMER6 configuration is timing mode, and the timing is 44400/1 = 44400 + ---------------------------------------------------------------------------- */ + // timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER6); + + timer_deinit(TIMER6); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER6 configuration */ + timer_initpara.prescaler = 2430; // 108MHz /2431 => 44.4 kHz + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 1; // divide by one + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_init(TIMER6, &timer_initpara); + timer_interrupt_enable(TIMER6, TIMER_INT_UP); + timer_enable(TIMER6); + eclic_global_interrupt_enable(); + eclic_enable_interrupt(TIMER6_IRQn); + // zero out the callback array + for (int i = 0; i < MAX_CB; i++) + { + cb[i] = 0; + } +} + +int timer::attach(fptr Callback) +{ + for (int i = 0; i < MAX_CB; i++) + { + if (cb[i] == 0) + { + // found a free slot + cb[i] = Callback; + return 0; + } + } + return -1; // no room left +} + +int timer::detach(fptr Callback) +{ + for (int i = 0; i < MAX_CB; i++) + { + if (cb[i] == Callback) + { + // found the slot so empty it + cb[i] = 0; + return 0; + } + } + return -1; // didn't find that one +} + +void timer::OnInterrupt(void) +{ + for (int i = 0; i < MAX_CB; i++) + { // look through callback array and call the non-zero entries. + if (cb[i] != 0) + { + cb[i](); + } + } +} + +extern "C" +{ + void TIMER6_IRQHandler(void) + { + if (timer_interrupt_flag_get(TIMER6, TIMER_INT_UP) == SET) + { + /* clear Timer 6 update interrupt bit */ + timer_interrupt_flag_clear(TIMER6, TIMER_INT_UP); + } + if (ptimer) + { + ptimer->OnInterrupt(); + } + } +} diff --git a/firmware/generic/src/drivers/timer.h b/firmware/generic/src/drivers/timer.h new file mode 100644 index 0000000..47c4b56 --- /dev/null +++ b/firmware/generic/src/drivers/timer.h @@ -0,0 +1,16 @@ +#include +#define MAX_CB 10 +typedef void (*fptr)(void); +class timer +{ +public: + + timer() {}; + void begin(); + int attach(fptr Callback); + int detach(fptr Callback); + void OnInterrupt(void); + //friend void TIMER6_IRQHandler(void); +private: + fptr cb[MAX_CB]; +}; \ No newline at end of file diff --git a/firmware/generic/src/drivers/usbfs/drv_usb_core.c b/firmware/generic/src/drivers/usbfs/drv_usb_core.c new file mode 100644 index 0000000..b4cff05 --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/drv_usb_core.c @@ -0,0 +1,319 @@ +/*! + \file drv_usb_core.c + \brief USB core driver which can operate in host and device mode + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_core.h" +#include "drv_usb_hw.h" + +/*! + \brief config USB core to soft reset + \param[in] usb_regs: USB core registers + \param[out] none + \retval none +*/ +static void usb_core_reset (usb_core_regs *usb_regs) +{ + /* enable core soft reset */ + usb_regs->gr->GRSTCTL |= GRSTCTL_CSRST; + + /* wait for the core to be soft reset */ + while (usb_regs->gr->GRSTCTL & GRSTCTL_CSRST); + + /* wait for addtional 3 PHY clocks */ + usb_udelay(3); +} + +/*! + \brief config USB core basic + \param[in] usb_basic: pointer to usb capabilities + \param[in] usb_regs: USB core registers + \param[in] usb_core: USB core + \param[out] none + \retval operation status +*/ +usb_status usb_basic_init (usb_core_basic *usb_basic, + usb_core_regs *usb_regs, + usb_core_enum usb_core) +{ + uint32_t i = 0, reg_base = 0; + + /* config USB default transfer mode as FIFO mode */ + usb_basic->transfer_mode = USB_USE_FIFO; + + /* USB default speed is full-speed */ + usb_basic->core_speed = USB_SPEED_FULL; + + usb_basic->core_enum = usb_core; + + switch (usb_core) { + case USB_CORE_ENUM_HS: + reg_base = USBHS_REG_BASE; + + /* set the host channel numbers */ + usb_basic->num_pipe = USBHS_MAX_CHANNEL_COUNT; + + /* set the device endpoint numbers */ + usb_basic->num_ep = USBHS_MAX_EP_COUNT; + +#ifdef USB_ULPI_PHY_ENABLED + usb_basic->phy_itf = USB_ULPI_PHY; +#else + usb_basic->phy_itf = USB_EMBEDDED_PHY; +#endif /* USB_ULPI_PHY_ENABLED */ + +#ifdef USB_HS_INTERNAL_DMA_ENABLED + bp->transfer_mode = USB_USE_DMA; +#endif /* USB_HS_INTERNAL_DMA_ENABLED */ + break; + + case USB_CORE_ENUM_FS: + reg_base = USBFS_REG_BASE; + + /* set the host channel numbers */ + usb_basic->num_pipe = USBFS_MAX_CHANNEL_COUNT; + + /* set the device endpoint numbers */ + usb_basic->num_ep = USBFS_MAX_EP_COUNT; + + /* USBFS core use embedded physical layer */ + usb_basic->phy_itf = USB_EMBEDDED_PHY; + break; + + default: + return USB_FAIL; + } + + usb_basic->sof_enable = USB_SOF_OUTPUT; + usb_basic->low_power = USB_LOW_POWER; + + /* assign main registers address */ + *usb_regs = (usb_core_regs) { + .gr = (usb_gr*) (reg_base + USB_REG_OFFSET_CORE), + .hr = (usb_hr*) (reg_base + USB_REG_OFFSET_HOST), + .dr = (usb_dr*) (reg_base + USB_REG_OFFSET_DEV), + + .HPCS = (uint32_t*) (reg_base + USB_REG_OFFSET_PORT), + .PWRCLKCTL = (uint32_t*) (reg_base + USB_REG_OFFSET_PWRCLKCTL) + }; + + /* assign device endpoint registers address */ + for (i = 0; i < usb_basic->num_ep; i++) { + usb_regs->er_in[i] = (usb_erin *) \ + (reg_base + USB_REG_OFFSET_EP_IN + (i * USB_REG_OFFSET_EP)); + + usb_regs->er_out[i] = (usb_erout *)\ + (reg_base + USB_REG_OFFSET_EP_OUT + (i * USB_REG_OFFSET_EP)); + } + + /* assign host pipe registers address */ + for (i = 0; i < usb_basic->num_pipe; i++) { + usb_regs->pr[i] = (usb_pr *) \ + (reg_base + USB_REG_OFFSET_CH_INOUT + (i * USB_REG_OFFSET_CH)); + + usb_regs->DFIFO[i] = (uint32_t *) \ + (reg_base + USB_DATA_FIFO_OFFSET + (i * USB_DATA_FIFO_SIZE)); + } + + return USB_OK; +} + +/*! + \brief initializes the USB controller registers and + prepares the core device mode or host mode operation + \param[in] bp: usb capabilities + \param[in] core_regs: usb core registers + \param[out] none + \retval operation status +*/ +usb_status usb_core_init (usb_core_basic usb_basic, usb_core_regs *usb_regs) +{ + uint32_t reg_value = usb_regs->gr->GCCFG; + + /* disable USB global interrupt */ + usb_regs->gr->GAHBCS &= ~GAHBCS_GINTEN; + + if (USB_ULPI_PHY == usb_basic.phy_itf) { + reg_value &= ~GCCFG_PWRON; + + if (usb_basic.sof_enable) { + reg_value |= GCCFG_SOFOEN; + } + + usb_regs->gr->GCCFG = GCCFG_SOFOEN; + + /* init the ULPI interface */ + usb_regs->gr->GUSBCS &= ~(GUSBCS_EMBPHY | GUSBCS_ULPIEOI); + +#ifdef USBHS_EXTERNAL_VBUS_ENABLED + /* use external VBUS driver */ + usb_regs->gr->GUSBCS |= GUSBCS_ULPIEVD; +#else + /* use internal VBUS driver */ + usb_regs->gr->GUSBCS &= ~GUSBCS_ULPIEVD; +#endif + + /* soft reset the core */ + usb_core_reset (usb_regs); + } else { + usb_regs->gr->GUSBCS |= GUSBCS_EMBPHY; + + /* soft reset the core */ + usb_core_reset (usb_regs); + + /* active the transceiver and enable vbus sensing */ + reg_value = GCCFG_PWRON | GCCFG_VBUSACEN | GCCFG_VBUSBCEN; + +#ifndef VBUS_SENSING_ENABLED + reg_value |= GCCFG_VBUSIG; +#endif /* VBUS_SENSING_ENABLED */ + + /* enable SOF output */ + if (usb_basic.sof_enable) { + reg_value |= GCCFG_SOFOEN; + } + + usb_regs->gr->GCCFG = reg_value; + + usb_mdelay(20); + } + + if (USB_USE_DMA == usb_basic.transfer_mode) { + usb_regs->gr->GAHBCS |= GAHBCS_DMAEN; + usb_regs->gr->GAHBCS &= ~GAHBCS_BURST; + usb_regs->gr->GAHBCS |= DMA_INCR8; + } + +#ifdef USE_OTG_MODE + + /* enable USB OTG features */ + usb_regs->gr->GUSBCS |= GUSBCS_HNPCAP | GUSBCS_SRPCAP; + + /* enable the USB wakeup and suspend interrupts */ + usb_regs->gr->GINTF = 0xBFFFFFFFU; + + usb_regs->gr->GINTEN = GINTEN_WKUPIE | GINTEN_SPIE | \ + GINTEN_OTGIE | GINTEN_SESIE | GINTEN_CIDPSCIE; + +#endif /* USE_OTG_MODE */ + + return USB_OK; +} + +/*! + \brief write a packet into the Tx FIFO associated with the endpoint + \param[in] core_regs: usb core registers + \param[in] src_buf: pointer to source buffer + \param[in] fifo_num: FIFO number which is in (0..3) + \param[in] byte_count: packet byte count + \param[out] none + \retval operation status +*/ +usb_status usb_txfifo_write (usb_core_regs *usb_regs, + uint8_t *src_buf, + uint8_t fifo_num, + uint16_t byte_count) +{ + uint32_t word_count = (byte_count + 3U) / 4U; + + __IO uint32_t *fifo = usb_regs->DFIFO[fifo_num]; + + while (word_count-- > 0) { + *fifo = *((__packed uint32_t *)src_buf); + + src_buf += 4U; + } + + return USB_OK; +} + +/*! + \brief read a packet from the Rx FIFO associated with the endpoint + \param[in] core_regs: usb core registers + \param[in] dest_buf: pointer to destination buffer + \param[in] byte_count: packet byte count + \param[out] none + \retval void type pointer +*/ +void *usb_rxfifo_read (usb_core_regs *usb_regs, uint8_t *dest_buf, uint16_t byte_count) +{ + uint32_t word_count = (byte_count + 3U) / 4U; + + __IO uint32_t *fifo = usb_regs->DFIFO[0]; + + while (word_count-- > 0) { + *(__packed uint32_t *)dest_buf = *fifo; + + dest_buf += 4U; + } + + return ((void *)dest_buf); +} + +/*! + \brief flush a Tx FIFO or all Tx FIFOs + \param[in] core_regs: pointer to usb core registers + \param[in] fifo_num: FIFO number which is in (0..3) + \param[out] none + \retval operation status +*/ +usb_status usb_txfifo_flush (usb_core_regs *usb_regs, uint8_t fifo_num) +{ + usb_regs->gr->GRSTCTL = ((uint32_t)fifo_num << 6U) | GRSTCTL_TXFF; + + /* wait for Tx FIFO flush bit is set */ + while (usb_regs->gr->GRSTCTL & GRSTCTL_TXFF); + + /* wait for 3 PHY clocks*/ + usb_udelay(3); + + return USB_OK; +} + +/*! + \brief flush the entire Rx FIFO + \param[in] core_regs: pointer to usb core registers + \param[out] none + \retval operation status +*/ +usb_status usb_rxfifo_flush (usb_core_regs *usb_regs) +{ + usb_regs->gr->GRSTCTL = GRSTCTL_RXFF; + + /* wait for Rx FIFO flush bit is set */ + while (usb_regs->gr->GRSTCTL & GRSTCTL_RXFF); + + /* wait for 3 PHY clocks */ + usb_udelay(3); + + return USB_OK; +} diff --git a/firmware/generic/src/drivers/usbfs/drv_usb_core.h b/firmware/generic/src/drivers/usbfs/drv_usb_core.h new file mode 100644 index 0000000..70563ec --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/drv_usb_core.h @@ -0,0 +1,117 @@ +/*! + \file drv_usb_core.h + \brief USB core low level driver header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __DRV_USB_CORE_H +#define __DRV_USB_CORE_H + +#include "drv_usb_regs.h" +#include "usb_ch9_std.h" + +#define USB_FS_EP0_MAX_LEN 64U /* maximum packet size of EndPoint0 */ + +#define HC_MAX_PACKET_COUNT 140U /* maximum packet count */ + +#define EP_ID(x) ((uint8_t)((x) & 0x7FU)) /* endpoint number */ +#define EP_DIR(x) ((uint8_t)((x) >> 7)) /* endpoint direction */ + +enum _usb_eptype { + USB_EPTYPE_CTRL = 0U, /*!< control endpoint type */ + USB_EPTYPE_ISOC = 1U, /*!< isochronous endpoint type */ + USB_EPTYPE_BULK = 2U, /*!< bulk endpoint type */ + USB_EPTYPE_INTR = 3U, /*!< interrupt endpoint type */ + USB_EPTYPE_MASK = 3U, /*!< endpoint type mask */ +}; + +typedef enum +{ + USB_OTG_OK = 0, /*!< USB OTG status OK*/ + USB_OTG_FAIL /*!< USB OTG status fail*/ +} usb_otg_status; + +typedef enum +{ + USB_OK = 0, /*!< USB status OK*/ + USB_FAIL /*!< USB status fail*/ +} usb_status; + +typedef enum +{ + USB_USE_FIFO, /*!< USB use FIFO transfer mode */ + USB_USE_DMA /*!< USB use DMA transfer mode */ +} usb_transfer_mode; + +typedef struct +{ + uint8_t core_enum; /*!< USB core type */ + uint8_t core_speed; /*!< USB core speed */ + uint8_t num_pipe; /*!< USB host channel numbers */ + uint8_t num_ep; /*!< USB device endpoint numbers */ + uint8_t transfer_mode; /*!< USB transfer mode */ + uint8_t phy_itf; /*!< USB core PHY interface */ + uint8_t sof_enable; /*!< USB SOF output */ + uint8_t low_power; /*!< USB low power */ +} usb_core_basic; + +/* function declarations */ + +/* config core capabilities */ +usb_status usb_basic_init (usb_core_basic *usb_basic, + usb_core_regs *usb_regs, + usb_core_enum usb_core); + +/*initializes the USB controller registers and prepares the core device mode or host mode operation*/ +usb_status usb_core_init (usb_core_basic usb_basic, usb_core_regs *usb_regs); + +/* read a packet from the Rx FIFO associated with the endpoint */ +void *usb_rxfifo_read (usb_core_regs *core_regs, uint8_t *dest_buf, uint16_t byte_count); + +/* write a packet into the Tx FIFO associated with the endpoint */ +usb_status usb_txfifo_write (usb_core_regs *usb_regs, + uint8_t *src_buf, + uint8_t fifo_num, + uint16_t byte_count); + +/* flush a Tx FIFO or all Tx FIFOs */ +usb_status usb_txfifo_flush (usb_core_regs *usb_regs, uint8_t fifo_num); + +/* flush the entire Rx FIFO */ +usb_status usb_rxfifo_flush (usb_core_regs *usb_regs); + +/* get the global interrupts */ +static inline uint32_t usb_coreintr_get(usb_core_regs *usb_regs) +{ + return usb_regs->gr->GINTEN & usb_regs->gr->GINTF; +} + +#endif /* __DRV_USB_CORE_H */ diff --git a/firmware/generic/src/drivers/usbfs/drv_usb_dev.c b/firmware/generic/src/drivers/usbfs/drv_usb_dev.c new file mode 100644 index 0000000..5988ec5 --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/drv_usb_dev.c @@ -0,0 +1,749 @@ +/*! + \file drv_usb_dev.c + \brief USB device mode low level driver + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "drv_usb_core.h" +#include "drv_usb_dev.h" + +/* endpoint 0 max packet length */ +static const uint8_t EP0_MAXLEN[4] = { + [DSTAT_EM_HS_PHY_30MHZ_60MHZ] = EP0MPL_64, + [DSTAT_EM_FS_PHY_30MHZ_60MHZ] = EP0MPL_64, + [DSTAT_EM_FS_PHY_48MHZ] = EP0MPL_64, + [DSTAT_EM_LS_PHY_6MHZ] = EP0MPL_8 +}; + +#ifdef USB_FS_CORE + +/* USB endpoint Tx FIFO size */ +static uint16_t USBFS_TX_FIFO_SIZE[USBFS_MAX_EP_COUNT] = +{ + (uint16_t)TX0_FIFO_FS_SIZE, + (uint16_t)TX1_FIFO_FS_SIZE, + (uint16_t)TX2_FIFO_FS_SIZE, + (uint16_t)TX3_FIFO_FS_SIZE +}; + +#elif defined(USB_HS_CORE) + +uint16_t USBHS_TX_FIFO_SIZE[USBHS_MAX_EP_COUNT] = +{ + (uint16_t)TX0_FIFO_HS_SIZE, + (uint16_t)TX1_FIFO_HS_SIZE, + (uint16_t)TX2_FIFO_HS_SIZE, + (uint16_t)TX3_FIFO_HS_SIZE, + (uint16_t)TX4_FIFO_HS_SIZE, + (uint16_t)TX5_FIFO_HS_SIZE +}; + +#endif /* USBFS_CORE */ + +/*! + \brief initialize USB core registers for device mode + \param[in] udev: pointer to usb device + \param[out] none + \retval operation status +*/ +usb_status usb_devcore_init (usb_core_driver *udev) +{ + uint32_t i, ram_addr = 0; + + /* force to peripheral mode */ + udev->regs.gr->GUSBCS &= ~(GUSBCS_FDM | GUSBCS_FHM); + udev->regs.gr->GUSBCS |= GUSBCS_FDM; + // udev->regs.gr->GUSBCS &= ~(GUSBCS_FHM); + + /* restart the Phy Clock (maybe don't need to...) */ + *udev->regs.PWRCLKCTL = 0U; + + /* config periodic frame interval to default value */ + udev->regs.dr->DCFG &= ~DCFG_EOPFT; + udev->regs.dr->DCFG |= FRAME_INTERVAL_80; + + udev->regs.dr->DCFG &= ~DCFG_DS; + +#ifdef USB_FS_CORE + if (udev->bp.core_enum == USB_CORE_ENUM_FS) { + /* set full-speed PHY */ + udev->regs.dr->DCFG |= USB_SPEED_INP_FULL; + + /* set Rx FIFO size */ + udev->regs.gr->GRFLEN = RX_FIFO_FS_SIZE; + + /* set endpoint 0 Tx FIFO length and RAM address */ + udev->regs.gr->DIEP0TFLEN_HNPTFLEN = ((uint32_t)TX0_FIFO_FS_SIZE << 16) | \ + ((uint32_t)RX_FIFO_FS_SIZE); + + ram_addr = RX_FIFO_FS_SIZE; + + /* set endpoint 1 to 3's Tx FIFO length and RAM address */ + for (i = 1; i < USBFS_MAX_EP_COUNT; i++) { + ram_addr += USBFS_TX_FIFO_SIZE[i - 1]; + + udev->regs.gr->DIEPTFLEN[i - 1] = ((uint32_t)USBFS_TX_FIFO_SIZE[i] << 16U) | \ + ram_addr; + } + } +#endif + +#ifdef USB_HS_CORE + if (udev->bp.core == USB_CORE_HS) { + if (udev->bp.core_phy == USB_ULPI_PHY) { + udev->regs.dr->DCFG |= USB_SPEED_EXP_HIGH; + } else {/* set High speed phy in Full speed mode */ + udev->regs.dr->DCFG |= USB_SPEED_EXP_FULL; + } + + /* Set Rx FIFO size */ + udev->regs.gr->GRFLEN &= ~GRFLEN_RXFD; + udev->regs.gr->GRFLEN |= RX_FIFO_HS_SIZE; + + /* Set endpoint 0 Tx FIFO length and RAM address */ + udev->regs.gr->DIEP0TFLEN_HNPTFLEN = ((uint32_t)TX0_FIFO_HS_SIZE << 16) | \ + RX_FIFO_HS_SIZE; + + ram_addr = RX_FIFO_HS_SIZE; + + /* Set endpoint 1 to 3's Tx FIFO length and RAM address */ + for (i = 1; i < USBHS_MAX_EP_COUNT; i++) { + ram_addr += USBHS_TX_FIFO_SIZE[i - 1]; + + udev->regs.gr->DIEPTFLEN[i - 1] = ((uint32_t)USBHS_TX_FIFO_SIZE[i] << 16) | \ + ram_addr; + } + } +#endif + + /* make sure all FIFOs are flushed */ + + /* flush all Tx FIFOs */ + usb_txfifo_flush (&udev->regs, 0x10); + + /* flush entire Rx FIFO */ + usb_rxfifo_flush (&udev->regs); + + /* clear all pending device interrupts */ + udev->regs.dr->DIEPINTEN = 0U; + udev->regs.dr->DOEPINTEN = 0U; + udev->regs.dr->DAEPINT = 0xFFFFFFFFU; + udev->regs.dr->DAEPINTEN = 0U; + + /* configure all IN/OUT endpoints */ + for (i = 0; i < udev->bp.num_ep; i++) { + if (udev->regs.er_in[i]->DIEPCTL & DEPCTL_EPEN) { + udev->regs.er_in[i]->DIEPCTL |= DEPCTL_EPD | DEPCTL_SNAK; + } else { + udev->regs.er_in[i]->DIEPCTL = 0U; + } + + /* set IN endpoint transfer length to 0 */ + udev->regs.er_in[i]->DIEPLEN = 0U; + + /* clear all pending IN endpoint interrupts */ + udev->regs.er_in[i]->DIEPINTF = 0xFFU; + + if (udev->regs.er_out[i]->DOEPCTL & DEPCTL_EPEN) { + udev->regs.er_out[i]->DOEPCTL |= DEPCTL_EPD | DEPCTL_SNAK; + } else { + udev->regs.er_out[i]->DOEPCTL = 0U; + } + + /* set OUT endpoint transfer length to 0 */ + udev->regs.er_out[i]->DOEPLEN = 0U; + + /* clear all pending OUT endpoint interrupts */ + udev->regs.er_out[i]->DOEPINTF = 0xFFU; + } + + usb_devint_enable (udev); + + return USB_OK; +} + +/*! + \brief enable the USB device mode interrupts + \param[in] udev: pointer to usb device + \param[out] none + \retval operation status +*/ +usb_status usb_devint_enable (usb_core_driver *udev) +{ + /* clear any pending USB OTG interrupts */ + udev->regs.gr->GOTGINTF = 0xFFFFFFFFU; + + /* clear any pending interrupts */ + udev->regs.gr->GINTF = 0xBFFFFFFFU; + + /* enable the USB wakeup and suspend interrupts */ + udev->regs.gr->GINTEN = GINTEN_WKUPIE | GINTEN_SPIE; + + /* enable device_mode-related interrupts */ + if (USB_USE_FIFO == udev->bp.transfer_mode) { + udev->regs.gr->GINTEN |= GINTEN_RXFNEIE; + } + udev->regs.gr->GINTEN |= GINTEN_RSTIE | GINTEN_ENUMFIE | GINTEN_IEPIE |\ + GINTEN_OEPIE | GINTEN_SOFIE | GINTEN_MFIE; + +#ifdef VBUS_SENSING_ENABLED + udev->regs.gr->GINTEN |= GINTEN_SESIE | GINTEN_OTGIE; +#endif /* VBUS_SENSING_ENABLED */ + + /* enable USB global interrupt */ + udev->regs.gr->GAHBCS |= GAHBCS_GINTEN; + + return USB_OK; +} + +/*! + \brief config the USB device to be disconnected + \param[in] udev: pointer to usb device + \param[out] none + \retval operation status +*/ +void usb_dev_disconnect (usb_core_driver *udev) +{ + udev->regs.dr->DCTL |= DCTL_SD; +} + +/*! + \brief config the USB device to be connected + \param[in] udev: pointer to usb device + \param[out] none + \retval operation status +*/ +void usb_dev_connect (usb_core_driver *udev) +{ + udev->regs.dr->DCTL &= ~DCTL_SD; +} + +/*! + \brief set the USB device address + \param[in] udev: pointer to usb device + \param[in] dev_addr: device address for setting + \param[out] none + \retval operation status +*/ +void usb_devaddr_set (usb_core_driver *udev, uint8_t dev_addr) +{ + udev->regs.dr->DCFG &= ~DCFG_DAR; + udev->regs.dr->DCFG |= dev_addr << 4; +} + +/*! + \brief active the usb transaction + \param[in] udev: pointer to usb device + \param[in] transc: the usb transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_active (usb_core_driver *udev, usb_transc *transc) +{ + __IO uint32_t *reg_addr = NULL; + + __IO uint32_t epinten = 0U; + + /* get the endpoint number */ + uint8_t ep_num = transc->ep_addr.num; + + /* enable endpoint interrupt number */ + if (transc->ep_addr.dir) { + reg_addr = &udev->regs.er_in[ep_num]->DIEPCTL; + + epinten = 1 << ep_num; + } else { + reg_addr = &udev->regs.er_out[ep_num]->DOEPCTL; + + epinten = 1 << (16 + ep_num); + } + + /* if the endpoint is not active, need change the endpoint control register */ + if (!(*reg_addr & DEPCTL_EPACT)) { + *reg_addr &= ~(DEPCTL_MPL | DEPCTL_EPTYPE | DIEPCTL_TXFNUM); + + /* set endpoint maximum packet length */ + if (0U == ep_num) { + *reg_addr |= EP0_MAXLEN[udev->regs.dr->DSTAT & DSTAT_ES]; + } else { + *reg_addr |= transc->max_len; + } + + /* activate endpoint */ + *reg_addr |= (transc->ep_type << 18) | (ep_num << 22) | DEPCTL_SD0PID | DEPCTL_EPACT; + } + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if ((ep_num == 1) && (udev->bp.core == USB_HS_CORE_ID)) { + udev->regs.dr->DEP1INTEN |= epinten; + } + else +#endif + { + /* enable the interrupts for this endpoint */ + udev->regs.dr->DAEPINTEN |= epinten; + } + + return USB_OK; +} + +/*! + \brief deactive the usb transaction + \param[in] udev: pointer to usb device + \param[in] transc: the usb transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_deactivate(usb_core_driver *udev, usb_transc *transc) +{ + uint32_t epinten = 0U; + + uint8_t ep_num = transc->ep_addr.num; + + /* disable endpoint interrupt number */ + if (transc->ep_addr.dir) { + epinten = 1 << ep_num; + + udev->regs.er_in[ep_num]->DIEPCTL &= ~DEPCTL_EPACT; + } else { + epinten = 1 << (ep_num + 16); + + udev->regs.er_out[ep_num]->DOEPCTL &= ~DEPCTL_EPACT; + } + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if ((ep_num == 1) && (udev->bp.core == USB_CORE_HS)) { + udev->regs.dr->DEP1INTEN &= ~epinten; + } + else +#endif + { + /* disable the interrupts for this endpoint */ + udev->regs.dr->DAEPINTEN &= ~epinten; + } + + return USB_OK; +} + +/*! + \brief configure usb transaction to start IN transfer + \param[in] udev: pointer to usb device + \param[in] transc: the usb IN transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_inxfer (usb_core_driver *udev, usb_transc *transc) +{ + usb_status status = USB_OK; + + uint8_t ep_num = transc->ep_addr.num; + + __IO uint32_t epctl = udev->regs.er_in[ep_num]->DIEPCTL; + __IO uint32_t eplen = udev->regs.er_in[ep_num]->DIEPLEN; + + eplen &= ~(DEPLEN_TLEN | DEPLEN_PCNT); + + /* zero length packet or endpoint 0 */ + if (0U == transc->xfer_len) { + /* set transfer packet count to 1 */ + eplen |= 1 << 19; + } else { + /* set transfer packet count */ + if (0U == ep_num) { + transc->xfer_len = USB_MIN(transc->xfer_len, transc->max_len); + + eplen |= 1 << 19; + } else { + eplen |= ((transc->xfer_len - 1 + transc->max_len) / transc->max_len) << 19; + } + + /* set endpoint transfer length */ + eplen |= transc->xfer_len; + + if (transc->ep_type == USB_EPTYPE_ISOC) { + eplen |= DIEPLEN_MCNT; + } + } + + udev->regs.er_in[ep_num]->DIEPLEN = eplen; + + if (USB_USE_DMA == udev->bp.transfer_mode) { + udev->regs.er_in[ep_num]->DIEPDMAADDR = transc->dma_addr; + } + + if (transc->ep_type == USB_EPTYPE_ISOC) { + if (((udev->regs.dr->DSTAT & DSTAT_FNRSOF) >> 8) & 0x1) { + epctl |= DEPCTL_SD1PID; + } else { + epctl |= DEPCTL_SD0PID; + } + } + + /* enable the endpoint and clear the NAK */ + epctl |= DEPCTL_CNAK | DEPCTL_EPEN; + + udev->regs.er_in[ep_num]->DIEPCTL = epctl; + + if (transc->ep_type != USB_EPTYPE_ISOC) { + /* enable the Tx FIFO empty interrupt for this endpoint */ + if (transc->xfer_len > 0) { + udev->regs.dr->DIEPFEINTEN |= 1 << ep_num; + } + } else { + usb_txfifo_write (&udev->regs, transc->xfer_buf, ep_num, transc->xfer_len); + } + + return status; +} + +/*! + \brief configure usb transaction to start OUT transfer + \param[in] udev: pointer to usb device + \param[in] transc: the usb OUT transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_outxfer (usb_core_driver *udev, usb_transc *transc) +{ + usb_status status = USB_OK; + + uint8_t ep_num = transc->ep_addr.num; + + uint32_t epctl = udev->regs.er_out[ep_num]->DOEPCTL; + uint32_t eplen = udev->regs.er_out[ep_num]->DOEPLEN; + + eplen &= ~(DEPLEN_TLEN | DEPLEN_PCNT); + + /* zero length packet or endpoint 0 */ + if ((0U == transc->xfer_len) || (0U == ep_num)) { + /* set the transfer length to max packet size */ + eplen |= transc->max_len; + + /* set the transfer packet count to 1 */ + eplen |= 1U << 19; + } else { + /* configure the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + uint32_t packet_count = (transc->xfer_len + transc->max_len - 1) / transc->max_len; + + eplen |= packet_count << 19; + eplen |= packet_count * transc->max_len; + } + + udev->regs.er_out[ep_num]->DOEPLEN = eplen; + + if (USB_USE_DMA == udev->bp.transfer_mode) { + udev->regs.er_out[ep_num]->DOEPDMAADDR = transc->dma_addr; + } + + if (transc->ep_type == USB_EPTYPE_ISOC) { + if (transc->frame_num) { + epctl |= DEPCTL_SD1PID; + } else { + epctl |= DEPCTL_SD0PID; + } + } + + /* enable the endpoint and clear the NAK */ + epctl |= DEPCTL_EPEN | DEPCTL_CNAK; + + udev->regs.er_out[ep_num]->DOEPCTL = epctl; + + return status; +} + +/*! + \brief set the usb transaction STALL status + \param[in] udev: pointer to usb device + \param[in] transc: the usb transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_stall (usb_core_driver *udev, usb_transc *transc) +{ + __IO uint32_t *reg_addr = NULL; + + uint8_t ep_num = transc->ep_addr.num; + + if (transc->ep_addr.dir) { + reg_addr = &(udev->regs.er_in[ep_num]->DIEPCTL); + + /* set the endpoint disable bit */ + if (*reg_addr & DEPCTL_EPEN) { + *reg_addr |= DEPCTL_EPD; + } + } else { + /* set the endpoint stall bit */ + reg_addr = &(udev->regs.er_out[ep_num]->DOEPCTL); + } + + /* set the endpoint stall bit */ + *reg_addr |= DEPCTL_STALL; + + return USB_OK; +} + +/*! + \brief clear the usb transaction STALL status + \param[in] udev: pointer to usb device + \param[in] transc: the usb transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_clrstall(usb_core_driver *udev, usb_transc *transc) +{ + __IO uint32_t *reg_addr = NULL; + + uint8_t ep_num = transc->ep_addr.num; + + if (transc->ep_addr.dir) { + reg_addr = &(udev->regs.er_in[ep_num]->DIEPCTL); + } else { + reg_addr = &(udev->regs.er_out[ep_num]->DOEPCTL); + } + + /* clear the endpoint stall bits */ + *reg_addr &= ~DEPCTL_STALL; + + /* reset data PID of the periodic endpoints */ + if ((transc->ep_type == USB_EPTYPE_INTR) || (transc->ep_type == USB_EPTYPE_BULK)) { + *reg_addr |= DEPCTL_SD0PID; + } + + return USB_OK; +} + +/*! + \brief read device all OUT endpoint interrupt register + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +uint32_t usb_oepintnum_read (usb_core_driver *udev) +{ + uint32_t value = udev->regs.dr->DAEPINT; + + value &= udev->regs.dr->DAEPINTEN; + + return (value & DAEPINT_OEPITB) >> 16; +} + +/*! + \brief read device OUT endpoint interrupt flag register + \param[in] udev: pointer to usb device + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +uint32_t usb_oepintr_read (usb_core_driver *udev, uint8_t ep_num) +{ + uint32_t value = udev->regs.er_out[ep_num]->DOEPINTF; + + value &= udev->regs.dr->DOEPINTEN; + + return value; +} + +/*! + \brief read device all IN endpoint interrupt register + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +uint32_t usb_iepintnum_read (usb_core_driver *udev) +{ + uint32_t value = udev->regs.dr->DAEPINT; + + value &= udev->regs.dr->DAEPINTEN; + + return value & DAEPINT_IEPITB; +} + + +/*! + \brief read device IN endpoint interrupt flag register + \param[in] udev: pointer to usb device + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +uint32_t usb_iepintr_read (usb_core_driver *udev, uint8_t ep_num) +{ + uint32_t value = 0U, fifoemptymask = 0U, commonintmask = 0U; + + commonintmask = udev->regs.dr->DIEPINTEN; + fifoemptymask = udev->regs.dr->DIEPFEINTEN; + + /* check FIFO empty interrupt enable bit */ + commonintmask |= ((fifoemptymask >> ep_num) & 0x1U) << 7; + + value = udev->regs.er_in[ep_num]->DIEPINTF & commonintmask; + + return value; +} + +/*! + \brief configures OUT endpoint 0 to receive SETUP packets + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_ctlep_startout (usb_core_driver *udev) +{ + /* set OUT endpoint 0 receive length to 24 bytes, 1 packet and 3 setup packets */ + udev->regs.er_out[0]->DOEPLEN = DOEP0_TLEN(8U * 3U) | DOEP0_PCNT(1U) | DOEP0_STPCNT(3U); + + if (USB_USE_DMA == udev->bp.transfer_mode) { + udev->regs.er_out[0]->DOEPDMAADDR = (uint32_t)&udev->dev.control.req; + + /* endpoint enable */ + udev->regs.er_out[0]->DOEPCTL |= DEPCTL_EPACT | DEPCTL_EPEN; + } +} + +/*! + \brief set remote wakeup signalling + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_rwkup_set (usb_core_driver *udev) +{ + if (udev->dev.pm.dev_remote_wakeup) { + /* enable remote wakeup signaling */ + udev->regs.dr->DCTL |= DCTL_RWKUP; + } +} + +/*! + \brief reset remote wakeup signalling + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_rwkup_reset (usb_core_driver *udev) +{ + if (udev->dev.pm.dev_remote_wakeup) { + /* disable remote wakeup signaling */ + udev->regs.dr->DCTL &= ~DCTL_RWKUP; + } +} + +/*! + \brief active remote wakeup signalling + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_rwkup_active (usb_core_driver *udev) +{ + if (udev->dev.pm.dev_remote_wakeup) { + if (udev->regs.dr->DSTAT & DSTAT_SPST) { + if (udev->bp.low_power) { + /* ungate USB core clock */ + *udev->regs.PWRCLKCTL &= ~(PWRCLKCTL_SHCLK | PWRCLKCTL_SUCLK); + } + + /* active remote wakeup signaling */ + udev->regs.dr->DCTL |= DCTL_RWKUP; + + usb_mdelay(5); + + udev->regs.dr->DCTL &= ~DCTL_RWKUP; + } + } +} + +/*! + \brief active USB core clock + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_clock_active (usb_core_driver *udev) +{ + if (udev->bp.low_power) { + if (udev->regs.dr->DSTAT & DSTAT_SPST) { + /* un-gate USB Core clock */ + *udev->regs.PWRCLKCTL &= ~(PWRCLKCTL_SHCLK | PWRCLKCTL_SUCLK); + } + } +} + +/*! + \brief usb device suspend + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_dev_suspend (usb_core_driver *udev) +{ + __IO uint32_t devstat = udev->regs.dr->DSTAT; + + if ((udev->bp.low_power) && (devstat & DSTAT_SPST)) { + /* switch-off the USB clocks */ + *udev->regs.PWRCLKCTL |= PWRCLKCTL_SHCLK; + + /* enter DEEP_SLEEP mode with LDO in low power mode */ + pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD); + } +} + +/*! + \brief stop the device and clean up fifos + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_dev_stop (usb_core_driver *udev) +{ + uint32_t i; + + udev->dev.cur_status = 1; + + /* clear all interrupt flag and enable bits */ + for (i = 0; i < udev->bp.num_ep; i++) { + udev->regs.er_in[i]->DIEPINTF = 0xFFU; + udev->regs.er_out[i]->DOEPINTF = 0xFFU; + } + + udev->regs.dr->DIEPINTEN = 0U; + udev->regs.dr->DOEPINTEN = 0U; + udev->regs.dr->DAEPINTEN = 0U; + udev->regs.dr->DAEPINT = 0xFFFFFFFFU; + + /* flush the FIFO */ + usb_rxfifo_flush (&udev->regs); + usb_txfifo_flush (&udev->regs, 0x10); +} diff --git a/firmware/generic/src/drivers/usbfs/drv_usb_dev.h b/firmware/generic/src/drivers/usbfs/drv_usb_dev.h new file mode 100644 index 0000000..6b85712 --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/drv_usb_dev.h @@ -0,0 +1,217 @@ +/*! + \file drv_usb_dev.h + \brief USB device low level driver header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __DRV_USB_DEV_H +#define __DRV_USB_DEV_H + +#include "drv_usb_core.h" + +enum usb_ctl_status { + USB_CTL_IDLE = 0U, /*!< USB control transfer idle state */ + USB_CTL_DATA_IN, /*!< USB control transfer data in state */ + USB_CTL_LAST_DATA_IN, /*!< USB control transfer last data in state */ + USB_CTL_DATA_OUT, /*!< USB control transfer data out state */ + USB_CTL_LAST_DATA_OUT, /*!< USB control transfer last data out state */ + USB_CTL_STATUS_IN, /*!< USB control transfer status in state*/ + USB_CTL_STATUS_OUT /*!< USB control transfer status out state */ +}; + +#define EP_IN(x) ((uint8_t)(0x80U | (x))) /*!< device IN endpoint */ +#define EP_OUT(x) ((uint8_t)(x)) /*!< device OUT endpoint */ + +/* USB descriptor */ +typedef struct _usb_desc { + uint8_t *dev_desc; /*!< device descriptor */ + uint8_t *config_desc; /*!< config descriptor */ + uint8_t *bos_desc; /*!< BOS descriptor */ + + void* const *strings; /*!< string descriptor */ +} usb_desc; + +/* USB power management */ +typedef struct _usb_pm { + uint8_t power_mode; /*!< power mode */ + uint8_t power_low; /*!< power low */ + uint8_t dev_remote_wakeup; /*!< remote wakeup */ + uint8_t remote_wakeup_on; /*!< remote wakeup on */ +} usb_pm; + +/* USB control information */ +typedef struct _usb_control { + usb_req req; /*!< USB standard device request */ + + uint8_t ctl_state; /*!< USB control transfer state */ + uint8_t ctl_zlp; /*!< zero lenth package */ +} usb_control; + +typedef struct +{ + struct { + uint8_t num: 4; /*!< the endpoint number.it can be from 0 to 6 */ + uint8_t pad: 3; /*!< padding between number and direction */ + uint8_t dir: 1; /*!< the endpoint direction */ + } ep_addr; + + uint8_t ep_type; /*!< USB endpoint type */ + uint8_t ep_stall; /*!< USB endpoint stall status */ + + uint8_t frame_num; /*!< number of frame */ + uint16_t max_len; /*!< Maximum packet lenth */ + + /* transaction level variables */ + uint8_t *xfer_buf; /*!< transmit buffer */ + uint32_t xfer_len; /*!< transmit buffer length */ + uint32_t xfer_count; /*!< transmit buffer count */ + + uint32_t remain_len; /*!< remain packet lenth */ + + uint32_t dma_addr; /*!< DMA address */ +} usb_transc; + +typedef struct _usb_core_driver usb_dev; + +typedef struct _usb_class_core +{ + uint8_t command; /*!< device class request command */ + uint8_t alter_set; /*!< alternative set */ + + uint8_t (*init) (usb_dev *udev, uint8_t config_index); /*!< initialize handler */ + uint8_t (*deinit) (usb_dev *udev, uint8_t config_index); /*!< de-initialize handler */ + + uint8_t (*req_proc) (usb_dev *udev, usb_req *req); /*!< device request handler */ + + uint8_t (*data_in) (usb_dev *udev, uint8_t ep_num); /*!< device data in handler */ + uint8_t (*data_out) (usb_dev *udev, uint8_t ep_num); /*!< device data out handler */ + + uint8_t (*SOF) (usb_dev *udev); /*!< Start of frame handler */ + + uint8_t (*incomplete_isoc_in) (usb_dev *udev); /*!< Incomplete synchronization IN transfer handler */ + uint8_t (*incomplete_isoc_out) (usb_dev *udev); /*!< Incomplete synchronization OUT transfer handler */ +} usb_class_core; + +typedef struct _usb_perp_dev +{ + uint8_t config; /*!< configuration */ + uint8_t dev_addr; /*!< device address */ + + __IO uint8_t cur_status; /*!< current status */ + __IO uint8_t backup_status; /*!< backup status */ + + usb_transc transc_in[USBFS_MAX_TX_FIFOS]; /*!< endpoint IN transaction */ + usb_transc transc_out[USBFS_MAX_TX_FIFOS]; /*!< endpoint OUT transaction */ + + usb_pm pm; /*!< power management */ + usb_desc desc; /*!< USB descriptors */ + usb_control control; /*!< USB control information */ + + usb_class_core *class_core; /*!< class driver */ +} usb_perp_dev; + +typedef struct _usb_core_driver +{ + usb_core_basic bp; /*!< USB basic parameters */ + usb_core_regs regs; /*!< USB registers */ + usb_perp_dev dev; /*!< USB peripheral device */ +} usb_core_driver; + +/* function declarations */ + +/* initialize USB core registers for device mode */ +usb_status usb_devcore_init (usb_core_driver *udev); + +/* enable the USB device mode interrupts */ +usb_status usb_devint_enable (usb_core_driver *udev); + +/* active the usb transaction */ +usb_status usb_transc_active (usb_core_driver *udev, usb_transc *transc); + +/* deactive the usb transaction */ +usb_status usb_transc_deactivate (usb_core_driver *udev, usb_transc *transc); + +/* configure usb transaction to start IN transfer */ +usb_status usb_transc_inxfer (usb_core_driver *udev, usb_transc *transc); + +/* configure usb transaction to start OUT transfer */ +usb_status usb_transc_outxfer (usb_core_driver *udev, usb_transc *transc); + +/* set the usb transaction STALL status */ +usb_status usb_transc_stall (usb_core_driver *udev, usb_transc *transc); + +/* clear the usb transaction STALL status */ +usb_status usb_transc_clrstall (usb_core_driver *udev, usb_transc *transc); + +/* read device all OUT endpoint interrupt register */ +uint32_t usb_oepintnum_read (usb_core_driver *udev); + +/* read device OUT endpoint interrupt flag register */ +uint32_t usb_oepintr_read (usb_core_driver *udev, uint8_t ep_num); + +/* read device all IN endpoint interrupt register */ +uint32_t usb_iepintnum_read (usb_core_driver *udev); + +/* read device IN endpoint interrupt flag register */ +uint32_t usb_iepintr_read (usb_core_driver *udev, uint8_t ep_num); + +/* config the USB device to be disconnected */ +void usb_dev_disconnect (usb_core_driver *udev); + +/* config the USB device to be connected */ +void usb_dev_connect (usb_core_driver *udev); + +/* set the USB device address */ +void usb_devaddr_set (usb_core_driver *pudev, uint8_t dev_addr); + +/* configures OUT endpoint 0 to receive SETUP packets */ +void usb_ctlep_startout (usb_core_driver *udev); + +/* active remote wakeup signalling */ +void usb_rwkup_active (usb_core_driver *udev); + +/* reset remote wakeup signalling */ +void usb_rwkup_reset (usb_core_driver *udev); + +/* set remote wakeup signalling */ +void usb_rwkup_set (usb_core_driver *udev); + +/* active USB core clock */ +void usb_clock_active (usb_core_driver *udev); + +/* usb device suspend */ +void usb_dev_suspend (usb_core_driver *udev); + +/* stop the device and clean up fifos */ +void usb_dev_stop (usb_core_driver *udev); + +#endif /* __DRV_USB_DEV_H */ + diff --git a/firmware/generic/src/drivers/usbfs/drv_usb_hw.h b/firmware/generic/src/drivers/usbfs/drv_usb_hw.h new file mode 100644 index 0000000..058efa8 --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/drv_usb_hw.h @@ -0,0 +1,62 @@ +/*! + \file drv_usb_hw.h + \brief usb hardware configuration header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __DRV_USB_HW_H +#define __DRV_USB_HW_H + +#include "usb_conf.h" + +/* configure USB clock */ +void usb_rcu_config (void); + +/* configure USB interrupt */ +void usb_intr_config (void); + +/* initializes delay unit using Timer2 */ +void usb_timer_init (void); + +/* delay in micro seconds */ +void usb_udelay (const uint32_t usec); + +/* delay in milli seconds */ +void usb_mdelay (const uint32_t msec); + +#ifdef USE_HOST_MODE +/* configure USB VBus */ + void usb_vbus_config (void); +/* drive usb VBus */ + void usb_vbus_drive (uint8_t State); +#endif /* USE_HOST_MODE */ + +#endif /* __DRV_USB_HW_H */ diff --git a/firmware/generic/src/drivers/usbfs/gd32vf103_hw.c b/firmware/generic/src/drivers/usbfs/gd32vf103_hw.c new file mode 100644 index 0000000..204c678 --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/gd32vf103_hw.c @@ -0,0 +1,206 @@ +/*! + \file gd32vf103_hw.c + \brief USB hardware configuration for GD32VF103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include +#include +#include + + +#define TIM_MSEC_DELAY 0x01 +#define TIM_USEC_DELAY 0x02 + +__IO uint32_t delay_time = 0; +__IO uint32_t timer_prescaler; +__IO uint32_t usbfs_prescaler = 0; + +static void hw_time_set (uint8_t unit); +static void hw_delay (uint32_t ntime, uint8_t unit); + + +/*! + \brief configure USB clock + \param[in] none + \param[out] none + \retval none +*/ +void usb_rcu_config(void) +{ + uint32_t system_clock = rcu_clock_freq_get(CK_SYS); + + if (system_clock == 48000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1; + timer_prescaler = 3; + } else if (system_clock == 72000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1_5; + timer_prescaler = 5; + } else if (system_clock == 96000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV2; + timer_prescaler = 7; + } else { + /* reserved */ + } + + rcu_usb_clock_config(usbfs_prescaler); + rcu_periph_clock_enable(RCU_USBFS); +} + +/*! + \brief configure USB interrupt + \param[in] none + \param[out] none + \retval none +*/ +void usb_intr_config(void) +{ + eclic_irq_enable((uint8_t)USBFS_IRQn, 1, 0); + + /* enable the power module clock */ + rcu_periph_clock_enable(RCU_PMU); + + /* USB wakeup EXTI line configuration */ + exti_interrupt_flag_clear(EXTI_18); + exti_init(EXTI_18, EXTI_INTERRUPT, EXTI_TRIG_RISING); + exti_interrupt_enable(EXTI_18); + + eclic_irq_enable((uint8_t)USBFS_WKUP_IRQn, 3, 0); +} + +/*! + \brief initializes delay unit using Timer2 + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_init (void) +{ + rcu_periph_clock_enable(RCU_TIMER2); + + eclic_irq_enable(TIMER2_IRQn, 2, 0); +} + +/*! + \brief delay in micro seconds + \param[in] usec: value of delay required in micro seconds + \param[out] none + \retval none +*/ +void usb_udelay (const uint32_t usec) +{ + hw_delay(usec, TIM_USEC_DELAY); +} + +/*! + \brief delay in milli seconds + \param[in] msec: value of delay required in milli seconds + \param[out] none + \retval none +*/ +void usb_mdelay (const uint32_t msec) +{ + hw_delay(msec, TIM_MSEC_DELAY); +} + +/*! + \brief time base IRQ + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_irq (void) +{ + if (RESET != timer_flag_get(TIMER2, TIMER_FLAG_UP)){ + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + + if (delay_time > 0x00U){ + delay_time--; + } else { + timer_disable(TIMER2); + } + } +} + +/*! + \brief delay routine based on TIM0 + \param[in] nTime: delay Time + \param[in] unit: delay Time unit = mili sec / micro sec + \param[out] none + \retval none +*/ +static void hw_delay(uint32_t ntime, uint8_t unit) +{ + delay_time = ntime; + + hw_time_set(unit); + + while (0U != delay_time) { + } + + timer_disable(TIMER2); +} + +/*! + \brief configures TIM0 for delay routine based on TIM0 + \param[in] unit: msec /usec + \param[out] none + \retval none +*/ +static void hw_time_set(uint8_t unit) +{ + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER2); + timer_deinit(TIMER2); + + if(TIM_USEC_DELAY == unit) { + timer_initpara.period = 11; + } else if(TIM_MSEC_DELAY == unit) { + timer_initpara.period = 11999; + } + + timer_initpara.prescaler = timer_prescaler; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER2, &timer_initpara); + + timer_update_event_enable(TIMER2); + timer_interrupt_enable(TIMER2,TIMER_INT_UP); + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + timer_update_source_config(TIMER2, TIMER_UPDATE_SRC_GLOBAL); + + /* TIMER2 counter enable */ + timer_enable(TIMER2); +} diff --git a/firmware/generic/src/drivers/usbfs/midi.c b/firmware/generic/src/drivers/usbfs/midi.c new file mode 100644 index 0000000..9778a39 --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/midi.c @@ -0,0 +1,319 @@ +/* + MIT License + + Copyright (c) 2019 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include +#include "midi.h" + +typedef enum _Parse_MIDI_Message_Event { + PARSE_MIDI_EVENT_RCV_STS_CH_MSG_1 = 0, + PARSE_MIDI_EVENT_RCV_STS_CH_MSG_2, + PARSE_MIDI_EVENT_RCV_SYS_RT, + PARSE_MIDI_EVENT_RCV_DAT, + PARSE_MIDI_EVENT_RCV_SYS_EX_START, + PARSE_MIDI_EVENT_RCV_SYS_EX_EOX, + NUM_OF_PARSE_MIDI_MESSAGE_EVENT +}Parse_MIDI_Message_Event_t; + +typedef struct _Parse_MIDI_FSM { + Parse_MIDI_Message_State_t next; + void (*pTransStateFunc)(MIDI_Handle_t *phMIDI, uint8_t msg); +}Parse_MIDI_FSM_t; + + +MIDI_Handle_t *MIDI_Alloc(void); +void MIDI_Free(MIDI_Handle_t *phMIDI); + + +static inline Parse_MIDI_Message_Event_t _GetParseMIDIMessageEvent(uint8_t msg) { + + if ( (msg & 0x80) == 0 ) { + return PARSE_MIDI_EVENT_RCV_DAT; + } + else if ( (msg & 0xF0) == 0xF0 ) { + switch ( msg ) { + case 0xF0: + return PARSE_MIDI_EVENT_RCV_SYS_EX_START; + + case 0xF7: + return PARSE_MIDI_EVENT_RCV_SYS_EX_EOX; + + default: + return PARSE_MIDI_EVENT_RCV_SYS_RT; + } + } + else { + + switch ( msg & 0xF0 ) { + case 0x80: + case 0x90: + case 0xA0: + case 0xB0: + case 0xE0: + return PARSE_MIDI_EVENT_RCV_STS_CH_MSG_2; + + case 0xC0: + case 0xD0: + return PARSE_MIDI_EVENT_RCV_STS_CH_MSG_1; + + default: + // unexpected + return PARSE_MIDI_EVENT_RCV_SYS_RT; + } + } + +} + + +static void _StoreChannelMessageStatus(MIDI_Handle_t *phMIDI, uint8_t msg); +static void _StoreChannelMessageData(MIDI_Handle_t *phMIDI, uint8_t msg); +static void _StoreSystemExclusiveMessage(MIDI_Handle_t *phMIDI, uint8_t msg); +static void _ExecChannelMessage1(MIDI_Handle_t *phMIDI, uint8_t msg); +static void _ExecChannelMessage2(MIDI_Handle_t *phMIDI, uint8_t msg); +static void _ExecSystemExclusiveMessage(MIDI_Handle_t *phMIDI, uint8_t msg); + +static const Parse_MIDI_FSM_t _midi_trans_state_tbl[NUM_OF_PARSE_MIDI_MESSAGE_STATE][NUM_OF_PARSE_MIDI_MESSAGE_EVENT] = { + /* IDLE */ + { + {PARSE_MIDI_CH_MSG_1, _StoreChannelMessageStatus}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_CH_MSG_2_1, _StoreChannelMessageStatus}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_RT + {PARSE_MIDI_IDLE, NULL}, // RCV_DAT + {PARSE_MIDI_SYS_EX, _StoreSystemExclusiveMessage}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_EOX + }, + /* CH_MSG_1 */ + { + {PARSE_MIDI_IDLE, NULL}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_IDLE, NULL}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_RT + {PARSE_MIDI_CH_MSG_RUNNING_1, _ExecChannelMessage1}, // RCV_DAT + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_EOX + }, + /* CH_MSG_2_1 */ + { + {PARSE_MIDI_IDLE, NULL}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_IDLE, NULL}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_RT + {PARSE_MIDI_CH_MSG_2_2, _StoreChannelMessageData}, // RCV_DAT + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_EOX + }, + /* CH_MSG_2_2 */ + { + {PARSE_MIDI_IDLE, NULL}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_IDLE, NULL}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_RT + {PARSE_MIDI_CH_MSG_RUNNING_2, _ExecChannelMessage2}, // RCV_DAT + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_EOX + }, + /* CH_MSG_RUNNING_1 */ + { + {PARSE_MIDI_CH_MSG_1, _StoreChannelMessageStatus}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_CH_MSG_2_1, _StoreChannelMessageStatus}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_RT + {PARSE_MIDI_CH_MSG_RUNNING_1, _ExecChannelMessage1}, // RCV_DAT + {PARSE_MIDI_SYS_EX, NULL}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_EOX + }, + /* CH_MSG_RUNNING_2 */ + { + {PARSE_MIDI_CH_MSG_1, _StoreChannelMessageStatus}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_CH_MSG_2_1, _StoreChannelMessageStatus}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_RT + {PARSE_MIDI_CH_MSG_2_2, _StoreChannelMessageData}, // RCV_DAT + {PARSE_MIDI_SYS_EX, NULL}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_EOX + }, + /* PARSE_MIDI_SYS_EX */ + { + {PARSE_MIDI_SYS_EX, _StoreSystemExclusiveMessage}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_SYS_EX, _StoreSystemExclusiveMessage}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_SYS_EX, _StoreSystemExclusiveMessage}, // RCV_SYS_RT + {PARSE_MIDI_SYS_EX, _StoreSystemExclusiveMessage}, // RCV_DAT + {PARSE_MIDI_SYS_EX, _StoreSystemExclusiveMessage}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, _ExecSystemExclusiveMessage}, // RCV_SYS_EX_EOX + } +}; + + +MIDI_Handle_t *MIDI_Init(const MIDI_Message_Callbacks_t *pcallbacks ) { + + MIDI_Handle_t *phMIDI = NULL; + phMIDI = MIDI_Alloc(); + + if ( phMIDI != NULL ) { + uint32_t i = 0; + phMIDI->chmsg_buf.msg0 = 0; + phMIDI->chmsg_buf.msg1 = 0; + phMIDI->chmsg_buf.msg2 = 0; + phMIDI->chmsg_buf.pad = 0; + phMIDI->sysex_buf.len = 0; + for ( i = 0; i < MAX_SYS_EX_BUF_SIZE; i++ ) { + phMIDI->sysex_buf.msg[i] = 0; + } + + phMIDI->state = PARSE_MIDI_IDLE; + phMIDI->pcallback = pcallbacks; + } + + return phMIDI; +} + +void MIDI_DeInit( MIDI_Handle_t *phMIDI ) { + + if ( phMIDI != NULL ) { + MIDI_Free(phMIDI); + } +} + +int32_t MIDI_Play(MIDI_Handle_t *phMIDI, const uint8_t *midi_msg, size_t len) { + + uint32_t i = 0; + Parse_MIDI_Message_Event_t event = PARSE_MIDI_EVENT_RCV_STS_CH_MSG_1; + const Parse_MIDI_FSM_t *pfsm = NULL; + + for ( i = 0; i < len; i++ ) { + event = _GetParseMIDIMessageEvent(midi_msg[i]); + + pfsm = &_midi_trans_state_tbl[phMIDI->state][event]; + + if ( pfsm->pTransStateFunc != NULL ) { + pfsm->pTransStateFunc(phMIDI, midi_msg[i]); + } + phMIDI->state = pfsm->next; + } + + return 0; +} + +__WEAK__ MIDI_Handle_t *MIDI_Alloc(void) +{ + static MIDI_Handle_t hMIDI; + return &hMIDI; +} + +__WEAK__ void MIDI_Free(MIDI_Handle_t *phMIDI) +{ + (void)phMIDI; +} + +static void _StoreChannelMessageStatus(MIDI_Handle_t *phMIDI, uint8_t msg) { + phMIDI->chmsg_buf.msg0 = msg; +} + +static void _StoreChannelMessageData(MIDI_Handle_t *phMIDI, uint8_t msg) { + phMIDI->chmsg_buf.msg1 = msg; +} + +static void _StoreSystemExclusiveMessage(MIDI_Handle_t *phMIDI, uint8_t msg) { + MIDI_System_Exclusive_Buffer_t *psys_ex_buf = &phMIDI->sysex_buf; + if ( psys_ex_buf->len < MAX_SYS_EX_BUF_SIZE ) { + psys_ex_buf->msg[(psys_ex_buf->len)++] = msg; + } +} + +static void _ExecChannelMessage1(MIDI_Handle_t *phMIDI, uint8_t msg) { + + const MIDI_ChannelVoiceMessage_t *pchvmsg = &phMIDI->pcallback->channel.voice_msg; + + phMIDI->chmsg_buf.msg1 = msg; + + switch (phMIDI->chmsg_buf.msg0 & 0xF0) { + case 0xC0: + if ( pchvmsg->pProgramChange != NULL ) { + pchvmsg->pProgramChange(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1); + } + break; + + case 0xD0: + if ( pchvmsg->pChannelPressure != NULL ) { + pchvmsg->pChannelPressure(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1); + } + break; + + default: + break; + } +} + +static void _ExecChannelMessage2(MIDI_Handle_t *phMIDI, uint8_t msg) { + + const MIDI_ChannelVoiceMessage_t *pchvmsg = &phMIDI->pcallback->channel.voice_msg; + phMIDI->chmsg_buf.msg2 = msg; + + switch (phMIDI->chmsg_buf.msg0 & 0xF0) { + case 0x80: + if ( pchvmsg->pNoteOff != NULL ) { + pchvmsg->pNoteOff(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1, phMIDI->chmsg_buf.msg2); + gpio_bit_set(GPIOA, GPIO_PIN_2); + } + break; + + case 0x90: + if ( pchvmsg->pNoteOn != NULL ) { + pchvmsg->pNoteOn(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1, phMIDI->chmsg_buf.msg2); + gpio_bit_reset(GPIOA, GPIO_PIN_2); + } + break; + + case 0xA0: + if ( pchvmsg->pPolyphonicKeyPressure != NULL ) { + pchvmsg->pPolyphonicKeyPressure(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1, phMIDI->chmsg_buf.msg2); + } + break; + + case 0xB0: + if ( pchvmsg->pControlChange != NULL ) { + pchvmsg->pControlChange(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1, phMIDI->chmsg_buf.msg2); + } + break; + + case 0xE0: + if ( pchvmsg->pPitchBendChange != NULL ) { + pchvmsg->pPitchBendChange(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1, phMIDI->chmsg_buf.msg2); + } + break; + + default: + break; + } +} + + +static void _ExecSystemExclusiveMessage(MIDI_Handle_t *phMIDI, uint8_t msg) { + + const MIDI_SystemExclusiveMessage_t *psys_ex = &phMIDI->pcallback->system.exclusive_msg; + MIDI_System_Exclusive_Buffer_t *psys_ex_buf = &phMIDI->sysex_buf; + + (void)msg; + + if ( psys_ex->pSystemExclusive != NULL ) { + psys_ex->pSystemExclusive(psys_ex_buf->msg, psys_ex_buf->len); + } + + // clear + psys_ex_buf->len = 0; +} \ No newline at end of file diff --git a/firmware/generic/src/drivers/usbfs/midi.h b/firmware/generic/src/drivers/usbfs/midi.h new file mode 100644 index 0000000..bfa1af6 --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/midi.h @@ -0,0 +1,93 @@ +/* + MIT License + + Copyright (c) 2019 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#ifndef __MIDI_H__ +#define __MIDI_H__ + +#include "midiconf.h" + +typedef struct _MIDI_Channel_Message_Buffer { + uint8_t msg0; // status byte + uint8_t msg1; // data byte 1 + uint8_t msg2; // data byte 2 + uint8_t pad; // padding +}MIDI_Channel_Message_Buffer_t; + +typedef struct _MIDI_System_Exclusive_Buffer { + uint8_t msg[MAX_SYS_EX_BUF_SIZE]; + size_t len; +}MIDI_System_Exclusive_Buffer_t; + + +typedef enum _Parse_MIDI_Message_State { + PARSE_MIDI_IDLE = 0, + PARSE_MIDI_CH_MSG_1, + PARSE_MIDI_CH_MSG_2_1, + PARSE_MIDI_CH_MSG_2_2, + PARSE_MIDI_CH_MSG_RUNNING_1, + PARSE_MIDI_CH_MSG_RUNNING_2, + PARSE_MIDI_SYS_EX, + NUM_OF_PARSE_MIDI_MESSAGE_STATE +}Parse_MIDI_Message_State_t; + + +typedef struct _MIDI_ChannelVoiceMessage { + void (*pNoteOff)(uint8_t ch, uint8_t kk, uint8_t uu); + void (*pNoteOn)(uint8_t ch, uint8_t kk, uint8_t vv); + void (*pPolyphonicKeyPressure)(uint8_t ch, uint8_t kk, uint8_t vv); + void (*pControlChange)(uint8_t ch, uint8_t cc, uint8_t vv); + void (*pProgramChange)(uint8_t ch, uint8_t pp); + void (*pChannelPressure)(uint8_t ch, uint8_t vv); + void (*pPitchBendChange)(uint8_t ch, uint8_t ll, uint8_t hh); +}MIDI_ChannelVoiceMessage_t; + +typedef struct _MIDI_ChannelMessage { + MIDI_ChannelVoiceMessage_t voice_msg; +}MIDI_ChannelMessage_t; + +typedef struct _MIDI_SystemExclusiveMessage { + void (*pSystemExclusive)(uint8_t *dat, size_t len); +}MIDI_SystemExclusiveMessage_t; + +typedef struct _MIDI_SystemMessage { + MIDI_SystemExclusiveMessage_t exclusive_msg; +}MIDI_SystemMessage_t; + +typedef struct _MIDI_Message_Callbacks { + MIDI_ChannelMessage_t channel; + MIDI_SystemMessage_t system; +}MIDI_Message_Callbacks_t; + +typedef struct _MIDI_Handle { + MIDI_Channel_Message_Buffer_t chmsg_buf; + MIDI_System_Exclusive_Buffer_t sysex_buf; + const MIDI_Message_Callbacks_t *pcallback; + Parse_MIDI_Message_State_t state; +}MIDI_Handle_t; + +extern MIDI_Handle_t *MIDI_Init(const MIDI_Message_Callbacks_t *pcallbacks ); +extern void MIDI_DeInit( MIDI_Handle_t *phMIDI ); +extern int32_t MIDI_Play(MIDI_Handle_t *phMIDI, const uint8_t *midi_msg, size_t len); + +#endif // __MIDI_H__ diff --git a/firmware/generic/src/drivers/usbfs/midi_cdc_core.c b/firmware/generic/src/drivers/usbfs/midi_cdc_core.c new file mode 100644 index 0000000..4307063 --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/midi_cdc_core.c @@ -0,0 +1,430 @@ +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ +#include +#include + +#include +#include +#include +#include "usbd_core.h" +#include "drv_usb_hw.h" +#include "usbd_enum.h" +#include "midi_cdc_desc.h" +#include "midi_cdc_core.h" + + +// usb cdc acm data send buffer page +#define USB_CDC_TX_BUF_PAGE_NUM 2 + +// each usb cdc acm data send buffer size +#ifndef USB_CDC_TX_BUF_SIZE +#define USB_CDC_TX_BUF_SIZE (CDC_ACM_DATA_PACKET_SIZE * 10) +#endif + +#define SEND_ENCAPSULATED_COMMAND 0x00 +#define GET_ENCAPSULATED_RESPONSE 0x01 +#define SET_COMM_FEATURE 0x02 +#define GET_COMM_FEATURE 0x03 +#define CLEAR_COMM_FEATURE 0x04 +#define SET_LINE_CODING 0x20 +#define GET_LINE_CODING 0x21 +#define SET_CONTROL_LINE_STATE 0x22 +#define SEND_BREAK 0x23 +#define NO_CMD 0xFF + +// usb cdc acm data send status +typedef enum +{ + USB_CDC_SEND_STATUS_INIT = 0, + USB_CDC_SEND_STATUS_BUSY, + USB_CDC_SEND_STATUS_FINISHED +}usb_cdc_send_status_t; + +typedef struct +{ + uint32_t dwDTERate; /* data terminal rate */ + uint8_t bCharFormat; /* stop bits */ + uint8_t bParityType; /* parity */ + uint8_t bDataBits; /* data bits */ +}line_coding_struct; + + +static uint32_t cdc_cmd = 0xFFU; +static uint8_t usb_cmd_buffer[CDC_ACM_CMD_PACKET_SIZE]; + + +// current usb cdc acm data send status +static usb_cdc_send_status_t usb_cdc_send_status = USB_CDC_SEND_STATUS_INIT; + +// current usb cdc acm data buffer page +static uint8_t current_buffer_page = 0; + +// current usb cdc acm data buffer position +static uint16_t current_end_position = 0; + +// usb cdc acm data send buffer (double buffer) +static uint8_t usb_cdc_tx_buffer[USB_CDC_TX_BUF_PAGE_NUM][USB_CDC_TX_BUF_SIZE]; + +// usb cdc data receive buffer +uint8_t usb_cdc_receive_buffer[CDC_ACM_DATA_PACKET_SIZE]; + +// usb midi receive buffer +uint8_t usb_midi_receive_buffer[AUDIO_MS_PACKET_SIZE]; + +// receive callback functions +static pf_usb_midi_receive_callback_t usb_midi_recv_cb = (pf_usb_midi_receive_callback_t)0; +static pf_usb_cdc_receive_callback_t usb_cdc_recv_cb = (pf_usb_cdc_receive_callback_t)0; + + +static uint8_t midi_cdc_init(usb_dev *udev, uint8_t config_index); +static uint8_t midi_cdc_deinit(usb_dev *udev, uint8_t config_index); +static uint8_t midi_cdc_req_proc(usb_dev *udev, usb_req *req); +static uint8_t midi_cdc_data_in(usb_dev *udev, uint8_t ep_num); +static uint8_t midi_cdc_data_out(usb_dev *udev, uint8_t ep_num); + + +static uint8_t cdc_acm_req_handler (usb_dev *pudev, usb_req *req); +static uint8_t cdc_acm_EP0_RxReady (usb_dev *pudev); + + +static void start_usb_cdc_send_service_irq(void); + + +static line_coding_struct linecoding = +{ + 115200, /* baud rate */ + 0x00, /* stop bits - 1 */ + 0x00, /* parity - none */ + 0x08 /* num of bits 8 */ +}; + +static usb_class_core class_core = +{ + .command = NO_CMD, /*!< device class request command */ + .alter_set = 0, /*!< alternative set */ + .init = midi_cdc_init, /*!< initialize handler */ + .deinit = midi_cdc_deinit, /*!< de-initialize handler */ + .req_proc = midi_cdc_req_proc, /*!< device request handler */ + .data_in = midi_cdc_data_in, /*!< device data in handler */ + .data_out = midi_cdc_data_out, /*!< device data out handler */ + .SOF = NULL, /*!< Start of frame handler */ + .incomplete_isoc_in = NULL, /*!< Incomplete synchronization IN transfer handler */ + .incomplete_isoc_out = NULL, /*!< Incomplete synchronization OUT transfer handler */ +}; + + +void init_usbd_midi(const pf_usb_midi_receive_callback_t midi_recv_cb) +{ + // register_usb_cdc_receive_callback(cdc_recv_cb); + + register_usb_midi_receive_callback(midi_recv_cb); + + eclic_irq_enable(TIMER2_IRQn, 2, 0); + + /* USB device stack configure */ + usbd_init (&g_midi_cdc_udev, USB_CORE_ENUM_FS, &class_core); + + // start_usb_cdc_send_service_irq(); + + /* USB interrupt configure */ + usb_intr_config(); + + /* check if USB device is enumerated successfully */ + while (g_midi_cdc_udev.dev.cur_status != USBD_CONFIGURED) + { + } +} + +// register a callback function to be called when usb midi message received. +void register_usb_midi_receive_callback(const pf_usb_midi_receive_callback_t callback) +{ + usb_midi_recv_cb = callback; +} + +// register a callback function to be called when usb cdc data received. +void register_usb_cdc_receive_callback(const pf_usb_cdc_receive_callback_t callback) +{ + usb_cdc_recv_cb = callback; +} + +int usb_cdc_printf(const char *format, ...) +{ + int written_num = 0; + size_t max_write_num = 0; + + va_list arg; + va_start(arg, format); + + // entry critical section + eclic_global_interrupt_disable(); + max_write_num = USB_CDC_TX_BUF_SIZE - current_end_position; + written_num = vsnprintf( + (char *)&usb_cdc_tx_buffer[current_buffer_page][current_end_position] + ,max_write_num, format, arg); + + if ( ( 0 < written_num ) && ( written_num < max_write_num ) ) + { + current_end_position += written_num; + } + // leave critical section + eclic_global_interrupt_enable(); + + va_end(arg); + + return 0; +} + +// send data and switch send buffer page. +void usb_cdc_send_service_irq(void) +{ + if (RESET != timer_flag_get(TIMER6, TIMER_FLAG_UP)) + { + if (USBD_CONFIGURED == g_midi_cdc_udev.dev.cur_status) + { + // entry critical section + eclic_global_interrupt_disable(); + if ( usb_cdc_send_status != USB_CDC_SEND_STATUS_BUSY ) + { + if ( current_end_position > 0 ) + { + usb_cdc_send_status = USB_CDC_SEND_STATUS_BUSY; + usbd_ep_send(&g_midi_cdc_udev, CDC_IN_EP, &usb_cdc_tx_buffer[current_buffer_page][0] , current_end_position); + current_end_position = 0; + current_buffer_page++; + if ( current_buffer_page >= USB_CDC_TX_BUF_PAGE_NUM ) + { + current_buffer_page = 0; + } + } + } + // leave critical section + eclic_global_interrupt_enable(); + } + + timer_flag_clear(TIMER6, TIMER_FLAG_UP); + } +} + +static uint8_t midi_cdc_init(usb_dev *udev, uint8_t config_index) +{ + midi_cdc_desc_ep_setup(udev); + + // prepare receive data + usbd_ep_recev(udev, MIDI_OUT_EP, usb_midi_receive_buffer, AUDIO_MS_PACKET_SIZE); + usbd_ep_recev(udev, CDC_OUT_EP, usb_cdc_receive_buffer, CDC_ACM_DATA_PACKET_SIZE); + + return 0; +} + + +static uint8_t midi_cdc_deinit(usb_dev *udev, uint8_t config_index) +{ + midi_cdc_desc_ep_clear(udev); + return 0; +} + + +static uint8_t midi_cdc_req_proc(usb_dev *udev, usb_req *req) +{ + switch (req->wIndex) + { + case AUDIO_AC_ITF_NUMBER: + break; + + case AUDIO_MS_ITF_NUMBER: + break; + + case CDC_CDC_ITF_NUMBER: + cdc_acm_req_handler(udev, req); + break; + + case CDC_DATA_ITF_NUMBER: + break; + + default: + break; + } + return 0; +} + + +static uint8_t midi_cdc_data_in(usb_dev *udev, uint8_t ep_num) +{ + if ((CDC_IN_EP & 0x7F) == ep_num) + { + usb_transc *transc = &udev->dev.transc_in[EP_ID(ep_num)]; + + if ((transc->xfer_len % transc->max_len == 0) && (transc->xfer_len != 0)) + { + usbd_ep_send (udev, ep_num, NULL, 0U); + } + else + { + usb_cdc_send_status = USB_CDC_SEND_STATUS_FINISHED; + } + } + + return 0; +} + + +static uint8_t midi_cdc_data_out(usb_dev *udev, uint8_t ep_num) +{ + uint32_t receive_length = 0U; + + if ((EP0_OUT & 0x7F) == ep_num) + { + cdc_acm_EP0_RxReady (udev); + } + else if ((CDC_OUT_EP & 0x7F) == ep_num) + { + receive_length = usbd_rxcount_get(udev, CDC_OUT_EP); + if ( usb_cdc_recv_cb ) + { + usb_cdc_recv_cb(usb_cdc_receive_buffer, receive_length); + } + usbd_ep_recev(udev, CDC_OUT_EP, usb_cdc_receive_buffer, CDC_ACM_DATA_PACKET_SIZE); + } + else if ((MIDI_OUT_EP & 0x7F) == ep_num) + { + receive_length = usbd_rxcount_get(udev, MIDI_OUT_EP); + if ( usb_midi_recv_cb ) + { + usb_midi_recv_cb(usb_midi_receive_buffer, receive_length); + } + usbd_ep_recev(udev, MIDI_OUT_EP, usb_midi_receive_buffer, AUDIO_MS_PACKET_SIZE); + } + else + { + } + + return 0; +} + +/*! + \brief handle the CDC ACM class-specific requests + \param[in] pudev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_req_handler (usb_dev *pudev, usb_req *req) +{ + switch (req->bRequest) + { + case SEND_ENCAPSULATED_COMMAND: + break; + case GET_ENCAPSULATED_RESPONSE: + break; + case SET_COMM_FEATURE: + break; + case GET_COMM_FEATURE: + break; + case CLEAR_COMM_FEATURE: + break; + case SET_LINE_CODING: + /* set the value of the current command to be processed */ + cdc_cmd = req->bRequest; + /* enable EP0 prepare to receive command data packet */ + pudev->dev.transc_out[0].xfer_buf = usb_cmd_buffer; + pudev->dev.transc_out[0].remain_len = req->wLength; + break; + case GET_LINE_CODING: + usb_cmd_buffer[0] = (uint8_t)(linecoding.dwDTERate); + usb_cmd_buffer[1] = (uint8_t)(linecoding.dwDTERate >> 8); + usb_cmd_buffer[2] = (uint8_t)(linecoding.dwDTERate >> 16); + usb_cmd_buffer[3] = (uint8_t)(linecoding.dwDTERate >> 24); + usb_cmd_buffer[4] = linecoding.bCharFormat; + usb_cmd_buffer[5] = linecoding.bParityType; + usb_cmd_buffer[6] = linecoding.bDataBits; + /* send the request data to the host */ + pudev->dev.transc_in[0].xfer_buf = usb_cmd_buffer; + pudev->dev.transc_in[0].remain_len = req->wLength; + break; + case SET_CONTROL_LINE_STATE: + break; + case SEND_BREAK: + break; + default: + break; + } + + return USBD_OK; +} + +/*! + \brief command data received on control endpoint + \param[in] pudev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_EP0_RxReady (usb_dev *pudev) +{ + if (NO_CMD != cdc_cmd) { + /* process the command data */ + linecoding.dwDTERate = (uint32_t)(usb_cmd_buffer[0] | + (usb_cmd_buffer[1] << 8) | + (usb_cmd_buffer[2] << 16) | + (usb_cmd_buffer[3] << 24)); + + linecoding.bCharFormat = usb_cmd_buffer[4]; + linecoding.bParityType = usb_cmd_buffer[5]; + linecoding.bDataBits = usb_cmd_buffer[6]; + + cdc_cmd = NO_CMD; + } + + return USBD_OK; +} + +// start usb cdc send service routine. +static void start_usb_cdc_send_service_irq(void) +{ + timer_parameter_struct timer_initpara; + + eclic_irq_enable(TIMER6_IRQn, 2, 0); + + timer_struct_para_init(&timer_initpara); + + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.prescaler = 9599;// 96 MHz/ 9600 = 10 kHz + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 10; + + timer_deinit(TIMER6); + timer_init(TIMER6, &timer_initpara); + + timer_update_event_enable(TIMER6); + timer_interrupt_enable(TIMER6,TIMER_INT_UP); + timer_flag_clear(TIMER6, TIMER_FLAG_UP); + timer_update_source_config(TIMER6, TIMER_UPDATE_SRC_GLOBAL); + + /* TIMER6 counter enable */ + timer_enable(TIMER6); +} + diff --git a/firmware/generic/src/drivers/usbfs/midi_cdc_core.h b/firmware/generic/src/drivers/usbfs/midi_cdc_core.h new file mode 100644 index 0000000..f095b48 --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/midi_cdc_core.h @@ -0,0 +1,46 @@ +/* + MIT License + + Copyright (c) 2020 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#ifndef MIDI_CDC_CORE_H +#define MIDI_CDC_CORE_H + +#include +#include + + + + +typedef int32_t (*pf_usb_midi_receive_callback_t)(const uint8_t *recv_msg, size_t len); +typedef int32_t (*pf_usb_cdc_receive_callback_t)(const uint8_t *recv_data, size_t len); + +extern void register_usb_midi_receive_callback(const pf_usb_midi_receive_callback_t callback); +extern void register_usb_cdc_receive_callback(const pf_usb_cdc_receive_callback_t callback); + +extern void init_usbd_midi(const pf_usb_midi_receive_callback_t midi_recv_cb); + +extern void usb_cdc_send_service_irq(void); + +extern int usb_cdc_printf(const char *format, ...); + +#endif/* MIDI_CDC_CORE_H */ + diff --git a/firmware/generic/src/drivers/usbfs/midi_cdc_desc.c b/firmware/generic/src/drivers/usbfs/midi_cdc_desc.c new file mode 100644 index 0000000..4777c3b --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/midi_cdc_desc.c @@ -0,0 +1,386 @@ +/* + MIT License + + Copyright (c) 2020 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#include +#include +#include "midi_cdc_desc.h" + +#define USBD_VID 0xaaaa// replace 0xaaaa with your vid +#define USBD_PID 0xbbbb// replace 0xbbbb with your pid + +#define LITTLE_ENDIAN_16(x) (x) + +static const usb_desc_dev device_descriptor = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200, + .bDeviceClass = 0xEF, + .bDeviceSubClass = 0x02, + .bDeviceProtocol = 0x01, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = LITTLE_ENDIAN_16(0x0100), + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +static const usb_descriptor_configuration_set_struct configuration_descriptor= +{ + .config = + {/* Configuration 1 */ + .header = + { + .bLength = 0x09, + .bDescriptorType = USB_DESCTYPE_CONFIG, + }, + .wTotalLength = LITTLE_ENDIAN_16(0x00AF), + .bNumInterfaces = 0x04, /* audio 2 + cdc 2 = 4 */ + .bConfigurationValue = 0x01, + .iConfiguration = 0x00, + .bmAttributes = 0xC0, + .bMaxPower = 0x32, + }, + .usb_iad_audio = + {/* Interface Associated Descriptor */ + .bLength = 0x08, + .bDescriptorType = 0x0B, + .bFirstInterface = AUDIO_AC_ITF_NUMBER, + .bInterfaceCount = 0x02, + .bFunctionClass = 0x01, + .bFunctionSubClass = 0x01, + .bFunctionProtocol = 0x00, + .iFunction = 0x02, + }, + .audio = + {/* Audio device */ + .standard_ac_itf = + {/* Standard AC Interface Descriptor */ + .header = + { + .bLength = 0x09, + .bDescriptorType = USB_DESCTYPE_ITF, + }, + .bInterfaceNumber = AUDIO_AC_ITF_NUMBER, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x00, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x01, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00, + }, + .class_specific_ac_itf = + {/* Class-specific AC Interface Descriptor */ + .bLength = 0x09, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x01, + .bcdADC = LITTLE_ENDIAN_16(0x0100),/* 1.00 */ + .wTotalLength = LITTLE_ENDIAN_16(0x0009), + .bInCollection = 0x01, + .baInterfaceNr = AUDIO_MS_ITF_NUMBER, + }, + .standard_ms_itf = + {/* Standard MS Interface Descriptor */ + .header = + { + .bLength = 0x09, + .bDescriptorType = USB_DESCTYPE_ITF, + }, + .bInterfaceNumber = AUDIO_MS_ITF_NUMBER, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x02, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x03, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00, + }, + .class_specific_ms_itf = + {/* Class-specific MS Interface Descriptor */ + .bLength = 0x07, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x01, + .BcdADC = LITTLE_ENDIAN_16(0x0100), + .wTotalLength = LITTLE_ENDIAN_16(0x0025), + }, + .midi_in_jack_embedded = + {/* MIDI IN Jack Descriptor (Embedded) */ + .bLength = 0x06, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x02, + .bJackType = 0x01,/* embedded */ + .bJackID = 0x01, + .iJack = 0x00, + }, + .midi_in_jack_external = + {/* MIDI In Jack Descriptor (External) */ + .bLength = 0x06, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x02, + .bJackType = 0x02, /* external */ + .bJackID = 0x02, + .iJack = 0x00, + }, + .midi_out_jack_embedded = + {/* MIDI OUT Jack Descriptor (Embedded) */ + .bLength = 0x09, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x03, + .bJackType = 0x01, + .bJackID = 0x03, + .bNtInputPins = 0x01, + .BaSourceID = 0x02, + .BaSourcePin = 0x01, + .iJack = 0x00, + }, + .midi_out_jack_external = + {/* MIDI OUT Jack Descriptor (External) */ + .bLength = 0x09, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x03, + .bJackType = 0x02, + .bJackID = 0x04, + .bNtInputPins = 0x01, + .BaSourceID = 0x01, + .BaSourcePin = 0x01, + .iJack = 0x00, + }, + .bulk_out_ep_desc = + {/* Standard Bulk OUT EndPoint Descriptor */ + .desc_ep = + { + .header = + { + .bLength = 0x09, + .bDescriptorType= 0x05, + }, + .bEndpointAddress = MIDI_OUT_EP, + .bmAttributes = 0x02, + .wMaxPacketSize = LITTLE_ENDIAN_16(AUDIO_MS_PACKET_SIZE), + .bInterval = 0x01, + }, + .bRefresh = 0x00, + .bSynchAddress = 0x00, + }, + .class_specific_ms_bulk_out_ep = + {/* Class-specific Bulk OUT EndPoint Descriptor */ + .bLength = 0x05, + .bDescriptorType = 0x25, + .bDescriptorSubtype = 0x01, + .bNumEmbMIDIJack = 0x01, + .BaAssocJackID = 0x01, + }, + .bulk_in_ep_desc = + {/* Standard Bulk IN EndPoint Descriptor */ + .desc_ep = + { + .header = + { + .bLength = 0x09, + .bDescriptorType= 0x05, + }, + .bEndpointAddress = MIDI_IN_EP, + .bmAttributes = 0x02, + .wMaxPacketSize = LITTLE_ENDIAN_16(AUDIO_MS_PACKET_SIZE), + .bInterval = 0x00, + }, + .bRefresh = 0x00, + .bSynchAddress = 0x00, + }, + .class_specific_ms_bulk_in_ep = + {/* Class-specific Bulk IN EndPoint Descriptor */ + .bLength = 0x05, + .bDescriptorType = 0x25, + .bDescriptorSubtype = 0x01, + .bNumEmbMIDIJack = 0x01, + .BaAssocJackID = 0x03, + }, + }, + .usb_iad_cdc = + {/* Interface Associated Descriptor */ + .bLength = 0x08, + .bDescriptorType = 0x0B, + .bFirstInterface = CDC_CDC_ITF_NUMBER, + .bInterfaceCount = 0x02, + .bFunctionClass = 0x02, + .bFunctionSubClass = 0x02, + .bFunctionProtocol = 0x01, + .iFunction = 0x02, + }, + .cdc = + { + .cdc_cdc_itf = + {/* Interface Descriptor */ + .header = + { + .bLength = 0x09, + .bDescriptorType = 0x04, + }, + .bInterfaceNumber = CDC_CDC_ITF_NUMBER, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x01, + .bInterfaceClass = 0x02, + .bInterfaceSubClass = 0x02, + .bInterfaceProtocol = 0x01, + .iInterface = 0x00, + }, + .header_func_desc = + {/* Header Functional Descriptor */ + .bLength = 0x05, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x00, + .bcdCDC = LITTLE_ENDIAN_16(0x0110), + }, + .call_mng_func_desc = + {/* Call Management Functional Descriptor */ + .bFunctionLength = 0x05, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x01, + .bmCapabilities = 0x00, + .bDataInterface = 0x01, + }, + .acm_func_desc = + {/* ACM Functional Descriptor */ + .bFunctionLength = 0x04, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x02, + .bmCapabilities = 0x02, + }, + .union_func_desc = + {/* Union Functional Descriptor */ + .bFunctionLength = 0x05, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x06, + .bMasterInterface = CDC_CDC_ITF_NUMBER, + .bSlaveInterface0 = CDC_DATA_ITF_NUMBER, + }, + .cmd_ep = + {/* Endpoint Descriptor */ + .header = + { + .bLength = 0x07, + .bDescriptorType = 0x05, + }, + .bEndpointAddress = CDC_CMD_EP, + .bmAttributes = 0x03, + .wMaxPacketSize = LITTLE_ENDIAN_16(CDC_ACM_CMD_PACKET_SIZE), + .bInterval = 0x10, + }, + .cdc_data_itf = + {/* Data Class Interface Descriptor */ + .header = + { + .bLength = 0x09, + .bDescriptorType = 0x04, + }, + .bInterfaceNumber = CDC_DATA_ITF_NUMBER, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x02, + .bInterfaceClass = 0x0A, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00, + }, + .end_out = + {/* Endpoint OUT Descriptor */ + .header = + { + .bLength = 0x07, + .bDescriptorType = 0x05, + }, + .bEndpointAddress = CDC_OUT_EP, + .bmAttributes = 0x02, + .wMaxPacketSize = LITTLE_ENDIAN_16(CDC_ACM_DATA_PACKET_SIZE), + .bInterval = 0x00, + }, + .end_in = + {/* Endpoint IN Descriptor */ + .header = + { + .bLength = 0x07, + .bDescriptorType = 0x05, + }, + .bEndpointAddress = CDC_IN_EP, + .bmAttributes = 0x02, + .wMaxPacketSize = LITTLE_ENDIAN_16(CDC_ACM_DATA_PACKET_SIZE), + .bInterval = 0x00, + }, + }, +}; + +static const usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +static void* const usbd_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = USBD_STRING_DESC("GigaDevice"), + [STR_IDX_PRODUCT] = USBD_STRING_DESC("nano_midi"), + [STR_IDX_SERIAL] = USBD_STRING_DESC("GD32XXX-3.0.0-7z8x9yer") +}; + +usb_core_driver g_midi_cdc_udev = +{ + .dev = + { + .desc = + { + .dev_desc = (uint8_t *)&device_descriptor, + .config_desc = (uint8_t *)&configuration_descriptor, + .strings = usbd_strings + + } + } +}; + +void midi_cdc_desc_ep_setup(usb_dev *udev) +{ + usbd_ep_setup(udev, &configuration_descriptor.audio.bulk_in_ep_desc.desc_ep); + usbd_ep_setup(udev, &configuration_descriptor.audio.bulk_out_ep_desc.desc_ep); + + usbd_ep_setup(udev, &configuration_descriptor.cdc.end_in); + usbd_ep_setup(udev, &configuration_descriptor.cdc.end_out); + usbd_ep_setup(udev, &configuration_descriptor.cdc.cmd_ep); +} + +void midi_cdc_desc_ep_clear(usb_dev *udev) +{ + usbd_ep_clear(udev, configuration_descriptor.audio.bulk_in_ep_desc.desc_ep.bEndpointAddress); + usbd_ep_clear(udev, configuration_descriptor.audio.bulk_out_ep_desc.desc_ep.bEndpointAddress); + + usbd_ep_clear(udev, configuration_descriptor.cdc.end_in.bEndpointAddress); + usbd_ep_clear(udev, configuration_descriptor.cdc.end_out.bEndpointAddress); + usbd_ep_clear(udev, configuration_descriptor.cdc.cmd_ep.bEndpointAddress); +} diff --git a/firmware/generic/src/drivers/usbfs/midi_cdc_desc.h b/firmware/generic/src/drivers/usbfs/midi_cdc_desc.h new file mode 100644 index 0000000..f868e8b --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/midi_cdc_desc.h @@ -0,0 +1,199 @@ +/* + MIT License + + Copyright (c) 2020 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#ifndef __MIDI_CDC_DESC_H__ +#define __MIDI_CDC_DESC_H__ + + +#define CDC_ACM_CMD_PACKET_SIZE 0x0008 // 8 byte +#define CDC_ACM_DATA_PACKET_SIZE 0x0040 // 64 byte +#define AUDIO_MS_PACKET_SIZE 0x0040 // 64 byte + +#pragma pack(1) + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint16_t bcdADC; + uint16_t wTotalLength; + uint8_t bInCollection; + uint8_t baInterfaceNr; +} usb_desc_class_specific_ac_itf;/* 9 byte */ + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint16_t BcdADC; + uint16_t wTotalLength; +} usb_desc_class_specific_ms_itf;/* 7 byte */ + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bJackType; + uint8_t bJackID; + uint8_t iJack; +} usb_desc_midi_in_jack_desc; /* 6 byte */ + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bJackType; + uint8_t bJackID; + uint8_t bNtInputPins; + uint8_t BaSourceID; + uint8_t BaSourcePin; + uint8_t iJack; +} usb_desc_midi_out_jack_desc; /* 9 byte */ + + +typedef struct +{ + usb_desc_ep desc_ep; + uint8_t bRefresh; + uint8_t bSynchAddress; +} usb_desc_ep_audio; /* 9 byte */ + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bNumEmbMIDIJack; + uint8_t BaAssocJackID; +} usb_desc_class_specific_ms_ep; /* 5 byte */ + + +typedef struct +{ + usb_desc_itf standard_ac_itf; + usb_desc_class_specific_ac_itf class_specific_ac_itf; + usb_desc_itf standard_ms_itf; + usb_desc_class_specific_ms_itf class_specific_ms_itf; + usb_desc_midi_in_jack_desc midi_in_jack_embedded; + usb_desc_midi_in_jack_desc midi_in_jack_external; + usb_desc_midi_out_jack_desc midi_out_jack_embedded; + usb_desc_midi_out_jack_desc midi_out_jack_external; + usb_desc_ep_audio bulk_out_ep_desc; + usb_desc_class_specific_ms_ep class_specific_ms_bulk_out_ep; + usb_desc_ep_audio bulk_in_ep_desc; + usb_desc_class_specific_ms_ep class_specific_ms_bulk_in_ep; +} usb_desc_audio; + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bFirstInterface; + uint8_t bInterfaceCount; + uint8_t bFunctionClass; + uint8_t bFunctionSubClass; + uint8_t bFunctionProtocol; + uint8_t iFunction; +} usb_desc_iad; /* 8 byte */ + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint16_t bcdCDC; +} usb_desc_header_func_desc; /* 5 byte */ + + +typedef struct +{ + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmCapabilities; + uint8_t bDataInterface; +} usb_desc_call_mng_func_desc; /* 5 byte */ + + +typedef struct +{ + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmCapabilities; +} usb_desc_acm_func_desc; /* 4 byte */ + + +typedef struct +{ + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bMasterInterface; + uint8_t bSlaveInterface0; +} usb_desc_union_func_desc; /* 5 byte */ + + +typedef struct +{ + usb_desc_itf cdc_cdc_itf; + usb_desc_header_func_desc header_func_desc; + usb_desc_call_mng_func_desc call_mng_func_desc; + usb_desc_acm_func_desc acm_func_desc; + usb_desc_union_func_desc union_func_desc; + usb_desc_ep cmd_ep; + usb_desc_itf cdc_data_itf; + usb_desc_ep end_out; + usb_desc_ep end_in; +} usb_desc_cdc; + + +typedef struct +{ + usb_desc_config config; + usb_desc_iad usb_iad_audio; + usb_desc_audio audio; + usb_desc_iad usb_iad_cdc; + usb_desc_cdc cdc; +} usb_descriptor_configuration_set_struct; + +#pragma pack() + + + +extern usb_core_driver g_midi_cdc_udev; + +extern void midi_cdc_desc_ep_setup(usb_dev *udev); +extern void midi_cdc_desc_ep_clear(usb_dev *udev); + +#endif/*__MIDI_CDC_DESC_H__*/ diff --git a/firmware/generic/src/drivers/usbfs/midiconf.h b/firmware/generic/src/drivers/usbfs/midiconf.h new file mode 100644 index 0000000..d4d9152 --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/midiconf.h @@ -0,0 +1,37 @@ +/* + MIT License + + Copyright (c) 2019 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#ifndef __MIDICONF_H__ +#define __MIDICONF_H__ + +#include +#include + +#define __WEAK__ __attribute__((weak)) + +#ifndef MAX_SYS_EX_BUF_SIZE +#define MAX_SYS_EX_BUF_SIZE 256 +#endif + +#endif /* __MIDICONF_H__ */ \ No newline at end of file diff --git a/firmware/generic/src/drivers/usbfs/usb_conf.h b/firmware/generic/src/drivers/usbfs/usb_conf.h new file mode 100644 index 0000000..651ba3e --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/usb_conf.h @@ -0,0 +1,75 @@ +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ +#ifndef __USB_CONF_H__ +#define __USB_CONF_H__ + +#include + +#ifdef USE_USB_FS +#define USB_FS_CORE +#endif + +#ifdef USB_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 64 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 0 + #define TX3_FIFO_FS_SIZE 0 +#endif /* USB_FS_CORE */ + +#define USB_SOF_OUTPUT 1 +#define USB_LOW_POWER 1 + +#if defined ( __GNUC__ ) + #ifndef __weak + #define __weak __attribute__((weak)) + #endif /* __weak */ + #ifndef __packed + #define __packed __attribute__((__packed__)) + #endif /* __packed */ +#endif /* __GNUC__ */ + + +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ + +#if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned (4))) + #define __ALIGN_BEGIN +#else + #define __ALIGN_END + #if defined (__CC_ARM) /* ARM Compiler */ + #define __ALIGN_BEGIN __align(4) + #elif defined (__ICCARM__) /* IAR Compiler */ + #define __ALIGN_BEGIN + #elif defined (__TASKING__) /* TASKING Compiler */ + #define __ALIGN_BEGIN __align(4) + #endif /* __CC_ARM */ +#endif /* __GNUC__ */ + + +#endif \ No newline at end of file diff --git a/firmware/generic/src/drivers/usbfs/usb_midi_app.c b/firmware/generic/src/drivers/usbfs/usb_midi_app.c new file mode 100644 index 0000000..7359b86 --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/usb_midi_app.c @@ -0,0 +1,98 @@ +/* + MIT License + + Copyright (c) 2020 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#include "usb_midi_app.h" +#include "midi.h" +//#include "mode4_ymf825.h" +//#include "music_box_ymf825.h" +//#include "single_ymz294.h" + + +#include + +#define MAX_MIDI_HANDLE_LIST_COUNT 2 +#define MIDI_HANDLE_FREE 0 +#define MIDI_HANDLE_OCCUPIED 1 + +#define USB_MIDI_APP_ASSERT(cond) + +typedef struct +{ + uint32_t status; + MIDI_Handle_t hMIDI; +} midi_handle_list_t; + +typedef struct _usb_midi_event_packet +{ + uint8_t header; + uint8_t midi[3]; +} usb_midi_event_packet_t; + +typedef struct +{ + MIDI_Handle_t* (*midi_init)(void); + void (*midi_deinit)(MIDI_Handle_t *phMIDI); +} sound_driver_api_t; + +static midi_handle_list_t hmidi_list[MAX_MIDI_HANDLE_LIST_COUNT]; + + +int32_t usb_midi_proc(const uint8_t *mid_msg, size_t len) +{ + gpio_bit_set(GPIOA, GPIO_PIN_1); + if(gpio_input_bit_get(GPIOA, GPIO_PIN_2)){ + gpio_bit_reset(GPIOA, GPIO_PIN_2); + } else{ + gpio_bit_set(GPIOA, GPIO_PIN_2); + } + return 0; +} + + +MIDI_Handle_t *MIDI_Alloc(void) +{ + uint32_t i = 0; + for ( i = 0; i < MAX_MIDI_HANDLE_LIST_COUNT; i++ ) + { + if ( hmidi_list[i].status == MIDI_HANDLE_FREE ) + { + hmidi_list[i].status = MIDI_HANDLE_OCCUPIED; + return &hmidi_list[i].hMIDI; + } + } + return (MIDI_Handle_t * )0; +} + +void MIDI_Free(MIDI_Handle_t *phMIDI) +{ + uint32_t i = 0; + for ( i = 0; i < MAX_MIDI_HANDLE_LIST_COUNT; i++ ) + { + if ( &hmidi_list[i].hMIDI == phMIDI ) + { + hmidi_list[i].status = MIDI_HANDLE_FREE; + break; + } + } +} + diff --git a/firmware/generic/src/drivers/usbfs/usb_midi_app.h b/firmware/generic/src/drivers/usbfs/usb_midi_app.h new file mode 100644 index 0000000..b4dd370 --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/usb_midi_app.h @@ -0,0 +1,43 @@ +/* + MIT License + + Copyright (c) 2020 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#ifndef __USB_MIDI_H__ +#define __USB_MIDI_H__ + +#include +#include + +typedef enum +{ + YMF825_SOUND_DRIVER_MODE4 = 0, + YMF825_SOUND_DRIVER_MUSIC_BOX, + NUM_OF_YMF825_SOUND_DRIVER +} ymf825_sound_driver_t; + + +extern void init_usb_midi_app(void); +extern int32_t usb_midi_proc(const uint8_t *mid_msg, size_t len); +extern int32_t switch_ymf825_sound_driver(ymf825_sound_driver_t driver); +extern ymf825_sound_driver_t get_selected_ymf825_sound_driver(void); + +#endif//__USB_MIDI_H__ diff --git a/firmware/generic/src/drivers/usbfs/usbd_conf.h b/firmware/generic/src/drivers/usbfs/usbd_conf.h new file mode 100644 index 0000000..c30e68a --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/usbd_conf.h @@ -0,0 +1,23 @@ +#ifndef __USBD_CONF_H__ +#define __USBD_CONF_H__ + +#include "usb_conf.h" + +#define USBD_CFG_MAX_NUM 1 + + +#define CDC_OUT_EP 0x01U +#define CDC_CMD_EP 0x82U +#define CDC_IN_EP 0x81U + +#define MIDI_OUT_EP 0x02U +#define MIDI_IN_EP 0x83U + +#define AUDIO_AC_ITF_NUMBER 0 +#define AUDIO_MS_ITF_NUMBER 1 +#define CDC_CDC_ITF_NUMBER 2 +#define CDC_DATA_ITF_NUMBER 3 +#define USBD_ITF_MAX_NUM CDC_DATA_ITF_NUMBER + + +#endif//__USBD_CONF_H__ \ No newline at end of file diff --git a/firmware/generic/src/drivers/usbfs/usbd_core.c b/firmware/generic/src/drivers/usbfs/usbd_core.c new file mode 100644 index 0000000..d7a8eae --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/usbd_core.c @@ -0,0 +1,329 @@ +/*! + \file usbd_core.c + \brief USB device mode core functions + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "../Include/usbd_core.h" +#include "../Include/drv_usb_hw.h" + +/* endpoint type */ +const uint32_t ep_type[] = { + [USB_EP_ATTR_CTL] = USB_EPTYPE_CTRL, + [USB_EP_ATTR_BULK] = USB_EPTYPE_BULK, + [USB_EP_ATTR_INT] = USB_EPTYPE_INTR, + [USB_EP_ATTR_ISO] = USB_EPTYPE_ISOC +}; + +/*! + \brief initailizes the USB device-mode stack and load the class driver + \param[in] udev: pointer to USB core instance + \param[in] core: usb core type + \param[in] class_core: class driver + \param[out] none + \retval none +*/ +void usbd_init (usb_core_driver *udev, usb_core_enum core, usb_class_core *class_core) +{ + /* device descriptor, class and user callbacks */ + udev->dev.class_core = class_core; + + /* configure USB capabilites */ + usb_basic_init (&udev->bp, &udev->regs, core); + + /* initailizes the USB core*/ + usb_core_init (udev->bp, &udev->regs); + + /* set device disconnect */ + usbd_disconnect (udev); + + /* initailizes device mode */ + usb_devcore_init (udev); + + /* set device connect */ + usbd_connect (udev); + + udev->dev.cur_status = USBD_DEFAULT; +} + +/*! + \brief endpoint initialization + \param[in] udev: pointer to USB core instance + \param[in] ep_desc: pointer to endpoint descriptor + \param[out] none + \retval none +*/ +uint32_t usbd_ep_setup (usb_core_driver *udev, const usb_desc_ep *ep_desc) +{ + usb_transc *transc; + + uint8_t ep_addr = ep_desc->bEndpointAddress; + uint8_t max_len = ep_desc->wMaxPacketSize; + + /* set endpoint direction */ + if (EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + + transc->ep_addr.dir = 1U; + } else { + transc = &udev->dev.transc_out[ep_addr]; + + transc->ep_addr.dir = 0U; + } + + transc->ep_addr.num = EP_ID(ep_addr); + transc->max_len = max_len; + transc->ep_type = ep_type[ep_desc->bmAttributes & USB_EPTYPE_MASK]; + + /* active USB endpoint function */ + usb_transc_active (udev, transc); + + return 0; +} + +/*! + \brief configure the endpoint when it is disabled + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_ep_clear (usb_core_driver *udev, uint8_t ep_addr) +{ + usb_transc *transc; + + if (EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + } else { + transc = &udev->dev.transc_out[ep_addr]; + } + + /* deactive USB endpoint function */ + usb_transc_deactivate (udev, transc); + + return 0; +} + + +/*! + \brief endpoint prepare to receive data + \param[in] udev: pointer to usb core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[in] pbuf: user buffer address pointer + \param[in] len: buffer length + \param[out] none + \retval none +*/ +uint32_t usbd_ep_recev (usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t len) +{ + usb_transc *transc = &udev->dev.transc_out[EP_ID(ep_addr)]; + + /* setup the transfer */ + transc->xfer_buf = pbuf; + transc->xfer_len = len; + transc->xfer_count = 0; + + if (USB_USE_DMA == udev->bp.transfer_mode) { + transc->dma_addr = (uint32_t)pbuf; + } + + /* start the transfer */ + usb_transc_outxfer (udev, transc); + + return 0; +} + +/*! + \brief endpoint prepare to transmit data + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[in] pbuf: transmit buffer address pointer + \param[in] len: buffer length + \param[out] none + \retval none +*/ +uint32_t usbd_ep_send (usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t len) +{ + usb_transc *transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + + /* setup the transfer */ + transc->xfer_buf = pbuf; + transc->xfer_len = len; + transc->xfer_count = 0; + + if (USB_USE_DMA == udev->bp.transfer_mode) { + transc->dma_addr = (uint32_t)pbuf; + } + + /* start the transfer */ + usb_transc_inxfer (udev, transc); + + return 0; +} + +/*! + \brief set an endpoint to STALL status + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_ep_stall (usb_core_driver *udev, uint8_t ep_addr) +{ + usb_transc *transc = NULL; + + if (EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + } else { + transc = &udev->dev.transc_out[ep_addr]; + } + + transc->ep_stall = 1; + + usb_transc_stall (udev, transc); + + return (0); +} + +/*! + \brief clear endpoint STALLed status + \param[in] udev: pointer to usb core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_ep_stall_clear (usb_core_driver *udev, uint8_t ep_addr) +{ + usb_transc *transc = NULL; + + if (EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + } else { + transc = &udev->dev.transc_out[ep_addr]; + } + + transc->ep_stall = 0; + + usb_transc_clrstall (udev, transc); + + return (0); +} + +/*! + \brief flush the endpoint FIFOs + \param[in] udev: pointer to usb core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_fifo_flush (usb_core_driver *udev, uint8_t ep_addr) +{ + if (EP_DIR(ep_addr)) { + usb_txfifo_flush (&udev->regs, EP_ID(ep_addr)); + } else { + usb_rxfifo_flush (&udev->regs); + } + + return (0); +} + +/*! + \brief set USB device address + \param[in] udev: pointer to USB core instance + \param[in] addr: device address to set + \param[out] none + \retval none +*/ +void usbd_addr_set (usb_core_driver *udev, uint8_t addr) +{ + usb_devaddr_set(udev, addr); +} + +/*! + \brief get the received data length + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval USB device operation cur_status +*/ +uint16_t usbd_rxcount_get (usb_core_driver *udev, uint8_t ep_num) +{ + return udev->dev.transc_out[ep_num].xfer_count; +} + +/*! + \brief device connect + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void usbd_connect (usb_core_driver *udev) +{ +#ifndef USE_OTG_MODE + /* connect device */ + usb_dev_connect (udev); + usb_mdelay(3); + +#endif /* USE_OTG_MODE */ +} + +/*! + \brief device disconnect + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void usbd_disconnect (usb_core_driver *udev) +{ +#ifndef USE_OTG_MODE + /* disconnect device for 3ms */ + usb_dev_disconnect (udev); + usb_mdelay(3); +#endif /* USE_OTG_MODE */ +} diff --git a/firmware/generic/src/drivers/usbfs/usbd_core.h b/firmware/generic/src/drivers/usbfs/usbd_core.h new file mode 100644 index 0000000..c4ec47a --- /dev/null +++ b/firmware/generic/src/drivers/usbfs/usbd_core.h @@ -0,0 +1,95 @@ +/*! + \file usbd_core.h + \brief USB device mode core functions protype + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_CORE_H +#define __USBD_CORE_H + + +#include "drv_usb_core.h" +#include "drv_usb_dev.h" + +typedef enum +{ + USBD_OK = 0, /*!< status OK */ + USBD_BUSY, /*!< status busy */ + USBD_FAIL, /*!< status fail */ +} usbd_status; + +enum _usbd_status { + USBD_DEFAULT = 1, /*!< default status */ + USBD_ADDRESSED = 2, /*!< address send status */ + USBD_CONFIGURED = 3, /*!< configured status */ + USBD_SUSPENDED = 4 /*!< suspended status */ +}; + +/* function declarations */ + +/* device connect */ +void usbd_connect (usb_core_driver *udev); + +/* device disconnect */ +void usbd_disconnect (usb_core_driver *udev); + +/* set USB device address */ +void usbd_addr_set (usb_core_driver *udev, uint8_t addr); + +/* initailizes the USB device-mode stack and load the class driver */ +void usbd_init (usb_core_driver *udev, usb_core_enum core, usb_class_core *class_core); + +/* endpoint initialization */ +uint32_t usbd_ep_setup (usb_core_driver *udev, const usb_desc_ep *ep_desc); + +/* configure the endpoint when it is disabled */ +uint32_t usbd_ep_clear (usb_core_driver *udev, uint8_t ep_addr); + +/* endpoint prepare to receive data */ +uint32_t usbd_ep_recev (usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t len); + +/* endpoint prepare to transmit data */ +uint32_t usbd_ep_send (usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t len); + +/* set an endpoint to STALL status */ +uint32_t usbd_ep_stall (usb_core_driver *udev, uint8_t ep_addr); + +/* clear endpoint STALLed status */ +uint32_t usbd_ep_stall_clear (usb_core_driver *udev, uint8_t ep_addr); + +/* flush the endpoint FIFOs */ +uint32_t usbd_fifo_flush (usb_core_driver *udev, uint8_t ep_addr); + +/* get the received data length */ +uint16_t usbd_rxcount_get (usb_core_driver *udev, uint8_t ep_num); + +#endif /* __USBD_CORE_H */ + diff --git a/firmware/generic/src/main.cpp b/firmware/generic/src/main.cpp new file mode 100644 index 0000000..c123a20 --- /dev/null +++ b/firmware/generic/src/main.cpp @@ -0,0 +1,918 @@ +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| + +// *********************************************************************************** +// LEET modular - a versatile, easy to build, affordable and powerful eurorack module! +// *********************************************************************************** + +// todo: +// * integrate midi to cv code +// * clean up code +// * implement s&h +// * implement vca, attenuverter etc +// * transparent image for dual color intro +// * rainbow intro? +// * why is one ouput affecting the other in calibration manual cv? (variations in AD or vcc -> pots?) +// * move generated contents (python scripts) to external files (with .h) +// * improve potentiometer calibration +// * design and print dual attenuated output (with improved clip) + +// done: +// * implement vcf and a few different filters +// * implement primitive delay +// * add dead zone for pot controling ammount of modulation +// * add logo for playback +// * invert tempo for playback +// * fix levels for am (enabling folding) +// * color code cv and pot levels +// * fix voltage levels for osc, adsr etc (not 20VPP) +// * implement adsr +// * add boot image +// * improve vco implementation (new menu with am,fm etc) +// * change AD range (amplification to allow 16 steps between each note (10V @1920 instead of 2048)) +// * replace qLut with function (divide AD to get index) +// * switch to float xStep? (incl LUTs) +// * add quantization for cv-in +// * add pulsewidth for squarewave +// * add icons to modes +// * clean up code in modules +// * implement tft menu system with encoder interrupt +// * implement potentiometer filtering (running average) +// * replace waveform with 16 bit position (0-65534) +// * implement reliable rotation encoder support +// * implement ADC DMA reading +// * implement tmrIRQ for playback @ 44.1kHz +// * update spi and display to support 240x240 tft with st7789 driver +// * verify ADC resolution +// * optimize display update (remove flickering) + +// note: calibration values for unconnected input (potentiometer calibration): 3238 // target 2473 + +// #define pcb_version 0 // the first 3dpcb version +#define pcb_version 1 // the first pcb version, marked rev 1 (menu and P2,P3 direction changed) + +#include +extern "C" +{ +#include "drivers\SysTick.h" +#include "drivers\led.h" +#include "drivers\display.h" +#include "drivers\spi.h" +#include "drivers\timer.h" +#include "drivers\encoder.h" +#include "drivers\adc.h" +#include "drivers\scope.h" +#include "module_vco.h" +#include "module_noise.h" +#include "module_vcf.h" +#include "module_adsr.h" +#include "module_delay.h" +#include "gd32vf103.h" + extern "C" const uint8_t font[1520]; + extern "C" const float freq[2113]; +} + +timer T; +led LED; +SysTick stk; +display Display; +spi SPI; +encoder enc; +adc ADC; +module_vco vco; +module_noise noise; +module_vcf vcf; +module_adsr adsr; +module_delay delay; +scope ch0(RGBToWord(0xff, 0x00, 0xff)); +scope ch1(RGBToWord(0x00, 0xff, 0xff)); +scope ch0old(RGBToWord(0x00, 0x00, 0x00)); +scope ch1old(RGBToWord(0x00, 0x00, 0x00)); + +// menu structure generated by python script: +const char *menuTxt[] = {"OSC", "< back", "sine am", "sine add", "sine fm", "square am", "square add", "square fm", "square pw", "square 2x", "square 3x", "triangle am", "triangle add", "triangle fm", "triangle saw", "triangle 2x", "triangle 3x", "quantize", "cvout", "Noise", "LFO", "< back", "LFO sine", "LFO square", "LFO triangle", "VCF", "< back", "2 pole v1", "2 pole v2", "4 pole", "test", "VCA", "SnH", "Envelope", " 127)) +// uint8_t moduleMode = mode_triangle_saw; // function of module selected by menu (fixed menu positions > 127)) +// uint8_t moduleMode = mode_ADSR; // function of module selected by menu (fixed menu positions > 127)) +// uint8_t moduleMode = mode_4_pole; // function of module selected by menu (fixed menu positions > 127)) +// uint8_t moduleMode = mode_Delay; // function of module selected by menu (fixed menu positions > 127)) + +volatile int dispPos = 0; // counter for scope column (update screen when dispPos == 240) +uint8_t menuPos = 0; // current menu position (< 127) +uint8_t menuUpd = 1; // signals if menu was updated (=>redraw display) +float phaseC = 0; // phaseCount | stepsize within one period (0-65535). frequenzy = xStep * 44100 / (2*65536) +uint8_t quantized = 0; // quantize CV input of module? +uint8_t cvOut = 0; // use dac0 as cv for vco? +uint8_t scopeTrig = 0; // flag to init scope sampling + +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| + +void rcu_config(void) +{ + rcu_periph_clock_enable(RCU_AF); // GPIO IRQ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_ADC0); + rcu_periph_clock_enable(RCU_DAC); + rcu_periph_clock_enable(RCU_DMA0); + rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8); // ADC clock = 108MHz / 8 = 13.5MHz(14MHz max.) +} + +void gpio_config(void) +{ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0); // ADC ch0 + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_3); // ADC ch1 + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_6); // ADC pot UR + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_7); // ADC pot LR + gpio_init(GPIOB, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0); // ADC pot LL + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4); // DAC ch0 + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_5); // DAC ch1 + gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_5); // rotary enc A + gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_6); // rotary enc B + gpio_init(GPIOB, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_4); // rotary enc C + gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13); // red LED + gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); // green LED + gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); // blue LED +} + +void dma_config(void) +{ + /* ADC_DMA_channel configuration */ + dma_parameter_struct dma_data_parameter; + /* ADC DMA_channel configuration */ + dma_deinit(DMA0, DMA_CH0); + /* initialize DMA single data mode */ + dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0)); + dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_data_parameter.memory_addr = (uint32_t)(&ADC.anRaw); + dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; + dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT; + dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_data_parameter.number = 5; + dma_data_parameter.priority = DMA_PRIORITY_HIGH; + dma_init(DMA0, DMA_CH0, &dma_data_parameter); + dma_circulation_enable(DMA0, DMA_CH0); + /* enable DMA channel */ + dma_channel_enable(DMA0, DMA_CH0); +} + +void initADC() +{ + /* reset ADC */ + adc_deinit(ADC0); + /* ADC mode config */ + adc_mode_config(ADC_MODE_FREE); // ADC0 and ADC1 work independently + /* ADC data alignment config */ + adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); + /* Configure word length */ + adc_resolution_config(ADC0, ADC_RESOLUTION_12B); + /* ADC channel length config */ + adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 5); + adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_13POINT5); // ADC left 41.4+12.5=54 cycles =5uS *5=20us => 50.1Hz + adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_3, ADC_SAMPLETIME_13POINT5); // ADC right + adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_6, ADC_SAMPLETIME_13POINT5); // pot0 (UR) + adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_7, ADC_SAMPLETIME_13POINT5); // pot1 (LR) + adc_regular_channel_config(ADC0, 4, ADC_CHANNEL_8, ADC_SAMPLETIME_13POINT5); // pot2 (LL) + /* ADC trigger config */ + adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); // software trigger + /* ADC external trigger enable */ + adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); + /* ADC discontinuous mode */ + adc_discontinuous_mode_config(ADC0, ADC_REGULAR_CHANNEL, 5); // should it be 4? + /* enable ADC interface */ + adc_enable(ADC0); + stk.delay(1); + /* ADC calibration and reset calibration */ + adc_calibration_enable(ADC0); + stk.delay(1); + /* ADC DMA function enable */ + adc_dma_mode_enable(ADC0); +} + +void initDAC(void) +{ + dac_deinit(); + dac_trigger_source_config(DAC0, DAC_TRIGGER_SOFTWARE); + dac_trigger_enable(DAC0); + dac_wave_mode_config(DAC0, DAC_WAVE_DISABLE); + dac_output_buffer_enable(DAC0); + dac_enable(DAC0); + + dac_trigger_source_config(DAC1, DAC_TRIGGER_SOFTWARE); + dac_trigger_enable(DAC1); + dac_wave_mode_config(DAC1, DAC_WAVE_DISABLE); + dac_output_buffer_enable(DAC1); + dac_enable(DAC1); +} + +void initUART() +{ + /* enable USART clock */ + rcu_periph_clock_enable(RCU_USART0); + /* connect port to USARTx_Tx */ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); + /* USART configure */ + usart_deinit(USART0); + usart_baudrate_set(USART0, 9600U); + usart_word_length_set(USART0, USART_WL_8BIT); + usart_stop_bit_set(USART0, USART_STB_1BIT); + usart_parity_config(USART0, USART_PM_NONE); + usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE); + usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE); + usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); + usart_enable(USART0); +} + +float ad2phase(uint16_t in) +{ + float xTmp; + if (in < 1472) // below -3V + xTmp = 24.135547645748918; + else if (in > 3584) // above 8V + xTmp = 49429.601578493784; + else + { + if (quantized == 0) + xTmp = freq[in - 1472]; + else + { + uint16_t q = (in - 1472 + 8) >> 4; // add 16/2 to quantize between notes + xTmp = freq[q << 4]; + } + } + return (xTmp); +} + +void addScope(uint16_t c0, uint16_t c1, uint8_t trig) +{ + if (dispPos < 240) + { + if (dispPos > 0 || trig == 1) + { + ch0.insert((4095 - c0) / 64); + ch1.insert((4095 - c1) / 64); + dispPos++; + } + } +} + +void dac_out(uint16_t d0, uint16_t d1) +{ + dac_data_set(DAC0, DAC_ALIGN_12B_R, 4095 - d0); // inverted due to inverting op amp + dac_data_set(DAC1, DAC_ALIGN_12B_R, 4095 - d1); // inverted due to inverting op amp + dac_software_trigger_enable(DAC0); + dac_software_trigger_enable(DAC1); +} + +int16_t fold(int16_t tmp) +{ + do + { + if (tmp < 1088) + tmp = (1088 * 2 - tmp); + if (tmp > 3008) + tmp = (3008 * 2 - tmp); + } while (tmp < 1088 || tmp > 3008); + return (tmp); +} + +uint16_t deadzone(uint16_t tmp) +{ + if (tmp < 255) // within? + return (0); // ..yes - return zero + else // .. no + return (tmp - 255); // return value - deadzone +} + +float getPhase() +{ + uint8_t p_note; + uint16_t p_octave; + p_note = deadzone(ADC.anAvg[2]) >> 4; // add deadzone, one octave is 192 AD steps (1V). (4096-1024/16)=192 + p_octave = (ADC.anAvg[4] >> 9) * 192; // 4096/512 => 8 octaves + phaseC = ad2phase(ADC.anAvg[0] + p_octave - (192 << 1) + p_note); // convert CV to logaritmic scale + return (phaseC); +} + +/* potentiometer and I/O mapping + R P2 + P4 P3 + C0 C1 + D0 D1 +*/ + +void OnTimer() +{ + +#if (pcb_version == 1) + ADC.anRaw[2] = 4096 - ADC.anRaw[2]; // pot inverted in this pcb version + ADC.anRaw[3] = 4096 - ADC.anRaw[3]; // pot inverted in this pcb version +#endif + + // static float x; + static uint8_t songPos; // position in song + static uint16_t tCount; // temp for song + static uint8_t prevMode; // + int16_t tmp = 0; + uint32_t cv2; + if (moduleMode == mode_quantize) + { + quantized ^= 1; + moduleMode = prevMode; + } + if (moduleMode == mode_cvout) + { + cvOut ^= 1; + moduleMode = prevMode; + } + + //-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| + switch (moduleMode) + { + case mode_sine_am: // sine (ampitude modulation) + cv2 = ((ADC.anRaw[1] << 2) * ADC.anAvg[3] >> 11); // 0-8192. pot2 (bottom right) sets level for CV2 that attenuates or amplifies amplitude + tmp = 2048 + ((int(vco.sine(getPhase()) - 2048) * cv2) >> 12); // get level from position + tmp = fold(tmp); // fold if outside range + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_sine_add: // sine (sum: in1 is added to the oscillator) + cv2 = ((ADC.anRaw[1] << 2) * ADC.anAvg[3] >> 11); // 0-8192. pot2 (bottom right) sets level for CV2 that attenuates or amplifies amplitude + tmp = (int(vco.sine(getPhase()) + cv2) >> 1); // get level from position + tmp = fold(tmp); // fold if outside range + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_sine_fm: // sine (frequency modulation) + cv2 = (ADC.anRaw[1] * ADC.anAvg[3] >> 12); // 12+12-13=11 (0-2048). pot2 (bottom right) sets level for CV2 that modulates the frequency + tmp = int(vco.sine(getPhase() + cv2 - 1024)); // get level from position (1088-3008 => -5V to +5V) + tmp = fold(tmp); // fold if outside range + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_square_am: // square (amplitude modulation) + cv2 = (ADC.anRaw[1] * ADC.anAvg[3] >> 11); // 0-8192. pot2 (bottom right) sets level for CV2 that attenuates or amplifies amplitude + tmp = 2048 + ((int(vco.square(getPhase(), 32768) - 2048) * cv2) >> 12); // get level from position + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_square_add: // square (sum: in1 is added to the oscillator) + cv2 = (ADC.anRaw[1] * ADC.anAvg[3] >> 11); // 0-8192. pot2 (bottom right) sets level for CV2 that attenuates or amplifies amplitude + tmp = (int(vco.square(getPhase(), 32768) + cv2) >> 1); // get level from position + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_square_fm: // square (frequency modulation) + cv2 = (ADC.anRaw[1] * ADC.anAvg[3] >> 12); // 12+12-8=16 (0-65535). pot2 (bottom right) sets level for CV2 that modulates the frequency + tmp = vco.square(getPhase() + cv2, 32768); // get level from position (50% dyuty cycle) + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_square_pw: // square (pulsewidth modulation) + cv2 = (ADC.anRaw[1] * ADC.anAvg[3] >> 8); // 12+12-8=16 (0-65535). pot2 (bottom right) sets level for CV2 that modulates the pulse width + tmp = vco.square(getPhase(), cv2); // get level from position (50% dyuty cycle) + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_square_2x: // 2 slightly detuned square oscillators + cv2 = (ADC.anRaw[1] * ADC.anAvg[3] >> 18); // 12+12-8=16 (0-65535). pot2 (bottom right) sets level for CV2 that modulates the pulse width + tmp = vco.square2x(getPhase(), cv2); // get level from position (50% dyuty cycle) + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_square_3x: // 3 slightly detuned square oscillators + cv2 = (ADC.anRaw[1] * ADC.anAvg[3] >> 17); // 12+12-8=16 (0-65535). pot2 (bottom right) sets level for CV2 that modulates the pulse width + tmp = vco.square3x(getPhase(), cv2); // get level from position (50% dyuty cycle) + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_triangle_am: // triangle (amplitude modulation) + cv2 = ((ADC.anRaw[1] << 2) * ADC.anAvg[3] >> 11); // 0-8192. pot2 (bottom right) sets level for CV2 that attenuates or amplifies amplitude + tmp = 2048 + ((int(vco.triangle(getPhase(), 32768) - 2048) * cv2) >> 12); // get level from position + tmp = fold(tmp); // fold if outside range + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_triangle_add: // triangle (sum: in1 is added to the oscillator) + cv2 = ((ADC.anRaw[1] << 2) * ADC.anAvg[3] >> 11); // 0-8192. pot2 (bottom right) sets level for CV2 that attenuates or amplifies amplitude + tmp = (int(vco.triangle(getPhase(), 32768) + cv2) >> 1); // get level from position + tmp = fold(tmp); // fold if outside range + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_triangle_fm: // triangle (frequency modulation) + cv2 = (ADC.anRaw[1] * ADC.anAvg[3] >> 8); // 12+12-8=16 (0-65535). pot2 (bottom right) sets level for CV2 that modulates the frequency + tmp = vco.triangle(getPhase() + cv2, 32768); // get level from position (50% dyuty cycle) + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_triangle_saw: // triangle (shape modulation) + cv2 = (ADC.anRaw[1] * ADC.anAvg[3] >> 8); // 12+12-8=16 (0-65535). pot2 (bottom right) sets level for CV2 that modulates the pulse width + if (cv2 > 32767) // prevent wrap around + cv2 = 32767; // .. + cv2 = cv2 * 2; // double value to get full range without modulation signal (pot only) + tmp = vco.triangle(getPhase(), cv2); // get level from position (50% dyuty cycle) + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_triangle_2x: // 2 slightly detuned triangle oscillators + cv2 = (ADC.anRaw[1] * ADC.anAvg[3] >> 18); // 0-256. pot2 (bottom right) sets level for CV2 that attenuates or amplifies amplitude + tmp = vco.triangle2x(getPhase(), cv2); // get level from position + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_triangle_3x: // 3 slightly detuned triangle oscillators + cv2 = (ADC.anRaw[1] * ADC.anAvg[3] >> 17); // 0-256. pot2 (bottom right) sets level for CV2 that attenuates or amplifies amplitude + tmp = vco.triangle3x(getPhase(), cv2); // get level from position + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_Noise: // white noise generator (PRNG) + cv2 = (ADC.anRaw[0] * ADC.anAvg[4] >> 13); // pot2 (bottom right) sets level for CV2 that attenuates or amplifies amplitude + tmp = noise.prng(cv2); // get level from position + dac_out(cvOut ? ADC.anRaw[0] : tmp, tmp); // output level on DAC1 & DAC0 if ! cvOut (else CV out on DAC0) + addScope(ADC.anRaw[1], tmp * 2 - 2048, 1); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_LFO_sine: // LFO sine + cv2 = ((ADC.anRaw[1] << 2) * ADC.anAvg[3] >> 11); // 0-8192. pot2 (bottom right) sets level for CV2 that attenuates or amplifies amplitude + tmp = 2048 + ((int(vco.sine(getPhase() / 512) - 2048) * cv2) >> 12); // get level from position + tmp = fold(tmp); // fold if outside range + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[1], tmp * 2 - 2048, 1); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_LFO_square: // LFO square + tmp = vco.square(getPhase() / 512, ADC.anAvg[3] << 4); // get level from position + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[1], tmp * 2 - 2048, 1); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_LFO_triangle: // LFO triangle + tmp = vco.triangle(getPhase() / 512, ADC.anAvg[3] << 4); // get level from position + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[1], tmp * 2 - 2048, 1); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_4_pole: // VCF (Voltage Controled Filter) + tmp = vcf.r4pole1(ADC.anRaw[0], ADC.anAvg[4], ADC.anAvg[3]); // sample, cutoff, resonance + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[0], tmp, vcf.phaseTrig); // store levels in scope buffer + break; + + case mode_2_pole_v1: // VCF (Voltage Controled Filter) + tmp = vcf.r2pole1(ADC.anRaw[0], ADC.anAvg[4], ADC.anAvg[3]); // sample, cutoff, resonance + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[0], tmp, vcf.phaseTrig); // store levels in scope buffer + break; + + case mode_2_pole_v2: // VCF (Voltage Controled Filter) + tmp = vcf.r2pole2(ADC.anRaw[0], ADC.anAvg[4], ADC.anAvg[3]); // sample, cutoff, resonance + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[0], tmp, vcf.phaseTrig); // store levels in scope buffer + break; + + case mode_test: // VCF (Voltage Controled Filter) + tmp = vcf.test(ADC.anRaw[0], ADC.anAvg[4], ADC.anAvg[3]); // sample, cutoff, resonance + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[0], tmp, vcf.phaseTrig); // store levels in scope buffer + break; + + case mode_VCA: // VCA (Voltage Controled Amplifier) + cv2 = ((ADC.anRaw[0] * ADC.anRaw[1] * ADC.anAvg[3]) >> 21); // pot2 (bottom right) sets level for CV2 that attenuates or amplifies amplitude + cv2 += (ADC.anAvg[2] >> 1) - 2048; // add offset + dac_out(cv2, cv2); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[0], cv2, 1); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_SnH: // SnH (Sample and Hold) + tmp = vcf.test(ADC.anRaw[0], ADC.anAvg[4], ADC.anAvg[3]); // sample, cutoff, resonance + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[0], tmp * 2 - 2048, 1); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_ADSR: // adsr + tmp = adsr.int_adsr(ADC.anRaw[0], ADC.anAvg[2] << 1, ADC.anAvg[4] << 1, ADC.anAvg[3] << 2, 0); // trig, A,D,R,!S + cv2 = 2048 + (((tmp - 2048) * (ADC.anRaw[1] - 2048)) >> 9); // + dac_out(tmp, cv2); // output level on DAC0 & DAC1 + break; + + case mode_ADR: // adsr + tmp = adsr.int_adsr(ADC.anRaw[0], ADC.anAvg[2] << 1, ADC.anAvg[4] << 1, ADC.anAvg[3] << 2, 1); // trig, A,D,R,!S + cv2 = 2048 + (((tmp - 2048) * (ADC.anRaw[1] - 2048)) >> 9); // + dac_out(tmp, cv2); // output level on DAC0 & DAC1 + break; + + case mode_Delay: // Delay + tmp = delay.delay(ADC.anRaw[0], ADC.anAvg[4], ADC.anAvg[3]); // sample, mix, length + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[0], tmp * 2 - 2048, 1); // store levels in scope buffer (amplifies oscillator output 2x) + break; + + case mode_CV_Play: + tCount++; + if (tCount < (4095 - ADC.anAvg[2]) * 5) // genereate trig signal (50% duty) + cv2 = 3008; // 5V trig signal (> 3.3V threshold) + else // no trig + cv2 = 2048; // 0V + if (tCount > (4095 - ADC.anAvg[2]) * 10) // playback speed / tempo + { + tCount = 0; + songPos++; + if (songPos >= 48) + songPos = 0; + } + tmp = song[songPos]; // add pot + quantization? + dac_out(tmp, cv2); // output level on DAC0 & DAC1 + phaseC = 0; // DC => 0Hz + addScope(tmp, cv2, tCount ^ 1); // store levels in scope buffer + break; + + case mode_out_minus10: // callibrate -10V + dac_out(128, 128); // 3840*(-10+10)/20+128 = 128 + phaseC = 0; // DC => 0Hz + addScope(ADC.anRaw[1], tmp, 1); // store levels in scope buffer + break; + + case mode_out_0V: // callibrate 0V + dac_out(2048, 2048); // 3840*(0+10)/20+128 = 2048 + phaseC = 0; // DC => 0Hz + addScope(ADC.anRaw[1], tmp, 1); // store levels in scope buffer + break; + + case mode_out_3V3: // callibrate 3V3 + dac_out(2682, 2682); // 3840*(3.3+10)/20+128 = 2682 + phaseC = 0; // DC => 0Hz + addScope(ADC.anRaw[1], tmp, 1); // store levels in scope buffer + break; + + case mode_out_10V: // callibrate 10V + dac_out(3968, 3968); // 3840*(10+10)/20+128 = 3968 + phaseC = 0; // DC => 0Hz + addScope(ADC.anRaw[1], tmp, 1); // store levels in scope buffer + break; + + case mode_in1_to_out1: // calibrate input (connect out to in and match triangle waveform) + phaseC = 450; // + tmp = vco.triangle(phaseC, ADC.anAvg[3] << 4); // triangle waveform (get level from position) + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[0] * 2 - 2048, tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer + break; + + case mode_in2_to_out1: // calibrate input (connect out to in and match triangle waveform) + phaseC = 450; // + tmp = vco.triangle(phaseC, ADC.anAvg[3] << 4); // triangle waveform (get level from position) + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[1] * 2 - 2048, tmp * 2 - 2048, vco.phaseTrig); // store levels in scope buffer + break; + + case mode_pass_thru: // pass thru to meassure noise and crosstalk + dac_out(ADC.anRaw[0], ADC.anRaw[1]); // output ADC0 to DAC0 & ACD1 to DAC1 + addScope(ADC.anRaw[0] * 2 - 2048, ADC.anRaw[1] * 2 - 2048, 1); // store levels in scope buffer + break; + + case mode_square_A4: // used to measure frequency accuracy + phaseC = 1299; // 440Hz - A4 concert pitch (midi 69) Should be 2611.2 @ 108MHz -> 44.4KHz + tmp = vco.square(phaseC, 32768); // square waveform (get level from position) + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anRaw[0], tmp, vco.phaseTrig); // store levels in scope buffer + break; + + case mode_manual_sine: + tmp = (ADC.anAvg[2] >> 1) + 1472; // 1472->3520 (not full range:1472->3584) + phaseC = ad2phase(tmp); // convert CV to logaritmic scale + tmp = vco.sine(phaseC); // get level from position + dac_out(tmp, tmp); // output level on DAC0 & DAC1 + addScope(ADC.anAvg[2], tmp, vco.phaseTrig); // store levels in scope buffer + break; + + case mode_manual_CV: // pot 3 controls cv1, pot2 controls cv2 + dac_out(ADC.anAvg[4], ADC.anAvg[3]); // 4095*(10+10)/20 = 4095 + phaseC = 0; // DC => 0Hz + addScope(ADC.anAvg[4], ADC.anAvg[3], 1); // store levels in scope buffer + break; + } + prevMode = moduleMode; + + // LED.green_off(); + + // Running average is done after DAC since it will add jitter due to uneven number of cycles + ADC.anCount++; + ADC.update(0); // ADC0 + ADC.update(1); // ADC1 + ADC.update(2); // pot0 (not inverted anymore) + ADC.update(3); // pot1 (not inverted anymore) + ADC.update(4); // pot2 + + // Start ADC sampling (using DMA) + adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); // start ADC: DMA => adc_value[] + + // handle menu from rotation encoder + + #if (pcb_version == 0) + #define cw 'W' + #define cc 'C' + #else + #define cw 'C' + #define cc 'W' + #endif + + switch (enc.get()) + { + case 0: + LED.red_off(); + LED.blue_off(); + break; + case cw: // test clockwise (next menu) + LED.red_on(); + menuPos = menuNxt[menuPos]; + menuUpd = 1; + break; + case cc: // test counter clockwise (previous menu) + LED.blue_on(); + menuPos = menuPre[menuPos]; + menuUpd = 1; + break; + case 'S': // test encoder click (menu select) + if (menuSel[menuPos] < 128) + { + menuPos = menuSel[menuPos]; + } + else + moduleMode = menuSel[menuPos]; + menuUpd = 1; // for main loop (update display) + break; + } +} +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| +int main() +{ + SPI.begin(); + LED.begin(); + stk.begin(1000); + rcu_config(); + gpio_config(); + dma_config(); + initADC(); + initDAC(); + // initUART(); + Display.begin(&SPI, font); + Display.showImg(img_1337, sizeof(img_1337), 0, 50, 240, 86, RGBToWord(0x00, 0xff, 0xff)); + Display.showImg(img_modular, sizeof(img_modular), 0, 150, 240, 32, RGBToWord(0xff, 0x00, 0xff)); + stk.delay(2000); + Display.fillRectangle(0, 0, 240, 240, RGBToWord(0x0, 0x0, 0x0)); + Display.drawRectangle(0, 70, 239, 79, RGBToWord(0xff, 0xff, 0xff)); + T.begin(); + T.attach(OnTimer); + uint8_t oldMode = 0; + while (1) + { + if (moduleMode != oldMode) // update display icon + { + switch (moduleMode) + { + case mode_sine_am: + case mode_sine_add: + case mode_sine_fm: + case mode_square_am: + case mode_square_add: + case mode_square_fm: + case mode_square_pw: + case mode_triangle_am: + case mode_triangle_add: + case mode_triangle_fm: + case mode_triangle_saw: + case mode_triangle_2x: + case mode_triangle_3x: + Display.showImg(img_vco, sizeof(img_vco), 0, 0, 240, 60, RGBToWord(0x00, 0xff, 0xff)); + break; + case mode_Noise: + noise.init(Display); + break; + case mode_LFO_sine: + case mode_LFO_square: + case mode_LFO_triangle: + Display.showImg(img_lfo, sizeof(img_lfo), 0, 0, 240, 60, RGBToWord(0x00, 0xff, 0xff)); + break; + case mode_4_pole: + case mode_2_pole_v1: + case mode_2_pole_v2: + case mode_test: + Display.showImg(img_vcf, sizeof(img_vcf), 0, 0, 240, 60, RGBToWord(0x00, 0xff, 0xff)); + break; + case mode_ADSR: + adsr.init(Display); + adsr.draw(Display, ADC.anRaw[0], ADC.anAvg[2], ADC.anAvg[4], ADC.anAvg[3], 0); + case mode_ADR: + adsr.init(Display); + adsr.draw(Display, ADC.anRaw[0], ADC.anAvg[2], ADC.anAvg[4], ADC.anAvg[3], 1); + break; + case mode_VCA: + Display.showImg(img_vca, sizeof(img_vca), 0, 0, 240, 60, RGBToWord(0x00, 0xff, 0xff)); + break; + case mode_SnH: + Display.showImg(img_snh, sizeof(img_snh), 0, 0, 240, 60, RGBToWord(0x00, 0xff, 0xff)); + break; + case mode_Delay: + Display.showImg(img_dly, sizeof(img_dly), 0, 0, 240, 60, RGBToWord(0x00, 0xff, 0xff)); + break; + case mode_CV_Play: + Display.showImg(img_play, sizeof(img_play), 0, 0, 240, 60, RGBToWord(0x00, 0xff, 0xff)); + break; + case mode_out_minus10: + case mode_out_0V: + case mode_out_3V3: + case mode_out_10V: + case mode_in1_to_out1: + case mode_in2_to_out1: + case mode_manual_sine: + case mode_square_A4: + Display.showImg(img_cal, sizeof(img_cal), 0, 0, 240, 60, RGBToWord(0xff, 0x00, 0xff)); + break; + default: + Display.fillRectangle(0, 0, 240, 60, RGBToWord(0x0, 0x0, 0x0)); + break; + } + oldMode = moduleMode; + } + + switch (moduleMode) + { + case mode_ADSR: + adsr.draw(Display, ADC.anRaw[0], ADC.anAvg[2], ADC.anAvg[4], ADC.anAvg[3], 0); // display, gate, A, D, R, !S + break; + case mode_ADR: + adsr.draw(Display, ADC.anRaw[0], ADC.anAvg[2], ADC.anAvg[4], ADC.anAvg[3], 1); // display, gate, A, D, R, !S + break; + } + + if (dispPos >= 240) + { + // show scope + for (uint32_t i = 1; i < SCOPE_BUFFER_SIZE - 1; i++) + { + ch0old.draw1(Display, i); // clear old pixel + ch0.draw1(Display, i); // write new pixel + ch0old.write(i, ch0.read(i)); // save old position + ch1old.draw1(Display, i); + ch1.draw1(Display, i); + ch1old.write(i, ch1.read(i)); + } + dispPos = 0; + + // show AD values + char str[11]; + sprintf(str, "%d", ADC.anAvg[0]); + Display.fillRectangle(130, 160, 40, 16, RGBToWord(0x00, 0x00, 0x00)); + Display.putStr(str, 130 - 9, 160, RGBToWord(0x00, 0x00, 0xff), RGBToWord(0x00, 0x00, 0x00)); + sprintf(str, "%d", ADC.anAvg[1]); + Display.fillRectangle(190, 160, 40, 16, RGBToWord(0x00, 0x00, 0x00)); + Display.putStr(str, 190 - 9, 160, RGBToWord(0x00, 0x00, 0xff), RGBToWord(0x00, 0x00, 0x00)); + if (!quantized || !cvOut) + Display.fillRectangle(190, 180, 40, 16, RGBToWord(0x00, 0x00, 0x00)); + if (quantized) + { + sprintf(str, "Q"); + Display.putStr(str, 190 - 9, 180, RGBToWord(0xff, 0x00, 0x00), RGBToWord(0x00, 0x00, 0x00)); + } + if (cvOut) + { + sprintf(str, "C"); + Display.putStr(str, 210 - 9, 180, RGBToWord(0xff, 0x00, 0xff), RGBToWord(0x00, 0x00, 0x00)); + } + // show pot values + sprintf(str, "%d", ADC.anAvg[2]); + Display.fillRectangle(130, 180, 40, 16, RGBToWord(0x00, 0x00, 0x00)); + Display.putStr(str, 130 - 9, 180, RGBToWord(0x00, 0xff, 0x00), RGBToWord(0x00, 0x00, 0x00)); + sprintf(str, "%d", ADC.anAvg[3]); + Display.fillRectangle(130, 200, 40, 16, RGBToWord(0x00, 0x00, 0x00)); + Display.putStr(str, 130 - 9, 200, RGBToWord(0x00, 0xff, 0x00), RGBToWord(0x00, 0x00, 0x00)); + sprintf(str, "%d", ADC.anAvg[4]); + Display.fillRectangle(130, 220, 40, 16, RGBToWord(0x00, 0x00, 0x00)); + Display.putStr(str, 130 - 9, 220, RGBToWord(0x00, 0xff, 0x00), RGBToWord(0x00, 0x00, 0x00)); + uint16_t freqency = int(phaseC * 44400 / (2 * 65536)); + if (freqency < 1000) + sprintf(str, "%dHz", freqency); + else + sprintf(str, "%d", freqency); + Display.fillRectangle(190, 200, 50, 16, RGBToWord(0x00, 0x00, 0x00)); + Display.putStr(str, 190 - 9, 200, RGBToWord(0xff, 0xff, 0xff), RGBToWord(0x00, 0x00, 0x00)); + sprintf(str, "%d V", (4095 - ADC.anAvg[2]) * 10 / 2048 - 10); + Display.fillRectangle(190, 220, 50, 16, RGBToWord(0x00, 0x00, 0x00)); + Display.putStr(str, 190 - 9, 220, RGBToWord(0xff, 0xff, 0xff), RGBToWord(0x00, 0x00, 0x00)); + } + + // show menu + if (menuUpd != 0) + { + char str[11]; + Display.fillRectangle(18, 160, 110, 20, RGBToWord(0x00, 0x00, 0x00)); + if (menuPos != menuPre[menuPos]) + Display.putStr(menuTxt[menuPre[menuPos]], 10, 160, RGBToWord(0xff, 0xff, 0xff), RGBToWord(0x00, 0x00, 0x00)); + + sprintf(str, ">"); + Display.putStr(str, 0, 180, RGBToWord(0x00, 0xff, 0xff), RGBToWord(0x00, 0x00, 0x00)); + + Display.fillRectangle(18, 180, 110, 20, RGBToWord(0x00, 0x00, 0x00)); + Display.putStr(menuTxt[menuPos], 10, 180, RGBToWord(0x00, 0xff, 0xff), RGBToWord(0x00, 0x00, 0x00)); + if (menuPos != menuNxt[menuPos]) + { + Display.fillRectangle(18, 200, 110, 40, RGBToWord(0x00, 0x00, 0x00)); + Display.putStr(menuTxt[menuNxt[menuPos]], 10, 200, RGBToWord(0xff, 0xff, 0xff), RGBToWord(0x00, 0x00, 0x00)); + if (menuNxt[menuPos] != menuNxt[menuNxt[menuPos]]) + { + Display.fillRectangle(18, 220, 110, 20, RGBToWord(0x00, 0x00, 0x00)); + Display.putStr(menuTxt[menuNxt[menuNxt[menuPos]]], 10, 220, RGBToWord(0xff, 0xff, 0xff), RGBToWord(0x00, 0x00, 0x00)); + } + } + else + { + Display.fillRectangle(18, 200, 110, 40, RGBToWord(0x00, 0x00, 0x00)); // end of menu, clear display + } + menuUpd = 0; + } + } +} +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| \ No newline at end of file diff --git a/firmware/generic/src/module_adsr.cpp b/firmware/generic/src/module_adsr.cpp new file mode 100644 index 0000000..18a909b --- /dev/null +++ b/firmware/generic/src/module_adsr.cpp @@ -0,0 +1,191 @@ +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| +#include "module_adsr.h" +//#include +#include +#include "drivers\display.h" +// compressed image generated with python script (used by init) +const uint8_t img_env[196] = {255, 255, 255, 255, 255, 255, 255, 255, 126, 65, 15, 59, 15, 4, 48, 10, 82, 0, 12, 1, 59, 0, 12, 1, 52, 0, 94, 0, 10, 0, 62, 0, 10, 0, 151, 0, 8, 0, 64, 0, 8, 0, 66, 0, 85, 0, 6, 0, 66, 0, 6, 0, 55, 0, 255, 83, 0, 4, 0, 68, 0, 4, 0, 67, 0, 226, 0, 255, 234, 0, 226, 0, 41, 59, 15, 48, 255, 55, 0, 10, 0, 255, 255, 195, 0, 10, 0, 31, 59, 255, 255, 103, 0, 10, 0, 255, 255, 195, 0, 10, 0, 255, 255, 195, 0, 10, 0, 255, 255, 4, 59, 130, 0, 10, 0, 255, 222, 0, 226, 0, 255, 33, 59, 91, 37, 10, 0, 255, 255, 207, 0, 103, 0, 74, 0, 156, 0, 74, 0, 62, 0, 105, 0, 74, 0, 154, 0, 74, 0, 62, 0, 97, 0, 8, 0, 64, 0, 8, 0, 52, 0, 97, 0, 10, 1, 61, 0, 10, 0, 50, 0, 96, 1, 13, 1, 56, 2, 12, 1, 46, 1, 32, 64, 17, 3, 48, 3, 17, 46, 255, 255, 255, 255, 255, 255, 177}; + +#define black RGBToWord(0x00, 0x00, 0x00) +#define aColor RGBToWord(0xff, 0x00, 0xff) +#define dColor RGBToWord(0xff, 0xff, 0x00) +#define sColor RGBToWord(0xaa, 0xaa, 0xaa) +#define rColor RGBToWord(0x00, 0x55, 0xff) +#define logoColor RGBToWord(0x00, 0xff, 0xff) + +// Generate envelope (ADSR / Attack Decay Sustain Release) waveform. +// All transitions are linear, but could be exponential by altering functions below. +// Operates between 0V to +5V (2048 - 3008) +// Sustain level is fixed to 50% (2.5V or 2528) since there are only three potentiometers avaliable +uint16_t module_adsr::int_adsr(uint16_t gate, uint16_t pot_a, uint16_t pot_d, uint16_t pot_r, uint8_t noSustain) +{ + uint16_t out = 2048; // out level (2048 = 0V) + + if (gate > 2528 && gateCount < 8) + gateCount++; + + if (gateCount == 8 && oldGate == 0) // confirmed rising edge (new envelope) + { + adsrMode = 1; + tCount = 0; + oldGate = 1; + xorGate ^= 1; + } + + if (gate < 2528 && gateCount > -8) + gateCount--; + + if (gateCount == -8 && oldGate == 1) // confirmed falling edge + oldGate = 0; + + tCount++; + + if (adsrMode == 1) // Attack + { + if (tCount < pot_a) + out = tCount * 960 / pot_a + 2048; + else + { + adsrMode = 2; + tCount = 0; + } + } + if (adsrMode == 2) // Decay + { + if (tCount < pot_d) + out = 3008 - tCount * 480 / pot_d; // 3008 - 480 = 2528 => 50% sustain level (2.5V) + else + { + adsrMode = 3; + tCount = 0; + if (noSustain == 1) + adsrMode = 4; // skip sustain (for percussion) + } + } + if (adsrMode == 3) // Sustain + { + if (gateCount > 4 && oldGate == 1) + out = 2528; // 50% sustain level (2.5V) + else + { + adsrMode = 4; + tCount = 0; + } + } + if (adsrMode == 4) // Release + { + if (tCount < pot_r) + out = 2528 - tCount * 480 / pot_r; + else + { + adsrMode = 0; + tCount = 0; + out = 2048; // 0V + } + } + return (out); +} + +void module_adsr::draw(display &disp, uint16_t gate, uint16_t pot_a, uint16_t pot_d, uint16_t pot_r, uint8_t noSustain) +{ + + uint16_t yOffset = 142; + uint16_t height = 64; + uint16_t sh = height >> 1; + uint8_t radius = 4; + uint8_t scale = 5; // scale for potentiometer value to pixels division = 2^scale + static int16_t xOffset, a, d, s, r; + if (xOffset <= 0) + xOffset = 1; + if (gate > 2682) // show trig 3v3 trig level + { + if (xorGate == 0) + disp.fillRectangle(220, 80, 10, 10, RGBToWord(0xff, 0xff, 0x00)); + else + disp.fillRectangle(220, 80, 10, 10, RGBToWord(0x00, 0xff, 0x00)); + disp.putPixel(220, 80, black); + disp.putPixel(220, 89, black); + disp.putPixel(229, 80, black); + disp.putPixel(229, 89, black); + } + + if (pot_a >> scale != a || pot_d >> scale != d || pot_r >> scale != r) + { + // delete previous envelope (lines + circles) + disp.drawLine(xOffset, yOffset, xOffset + a, yOffset - height, black); // A + disp.fillCircle(xOffset + a, yOffset - height, radius, black); + if (a + d < 238 - xOffset) + { + disp.drawLine(xOffset + a, yOffset - height, xOffset + a + d, yOffset - sh, black); // D + disp.fillCircle(xOffset + a + d, yOffset - sh, radius, black); + } + if (a + d + s < 238 - xOffset) + disp.drawLine(xOffset + a + d, yOffset - sh, xOffset + a + d + s, yOffset - sh, black); // S + if (a + d + s + r < 238 - xOffset) + { + disp.drawLine(xOffset + a + d + s, yOffset - sh, xOffset + a + d + s + r, yOffset, black); // R + disp.fillCircle(xOffset + a + d + s + r, yOffset, radius, black); + } + + a = pot_a >> scale; + d = pot_d >> scale; + if (noSustain == 1) + s = 0; + else + s = height >> 1; + r = pot_r >> scale; + xOffset = (240 - a - d - s - r) >> 1; + if (xOffset <= 0) + xOffset = 1; + + // draw new envelope + disp.drawLine(xOffset, yOffset, xOffset + a, yOffset - height, aColor); // A + if (a + d < 238 - xOffset) + disp.drawLine(xOffset + a, yOffset - height, xOffset + a + d, yOffset - sh, dColor); // D + if (a + d + s < 238 - xOffset) + disp.drawLine(xOffset + a + d, yOffset - sh, xOffset + a + d + s, yOffset - sh, sColor); // S + if (a + d + s + r < 238 - xOffset) + disp.drawLine(xOffset + a + d + s, yOffset - sh, xOffset + a + d + s + r, yOffset, rColor); // R + + disp.fillCircle(xOffset + a, yOffset - height, radius - 1, black); + disp.fillCircle(xOffset + a + d + s + r, yOffset, radius - 1, black); + if (a + d < 238 - xOffset) + { + disp.fillCircle(xOffset + a + d, yOffset - sh, radius - 1, black); + disp.drawCircle(xOffset + a + d, yOffset - sh, radius, dColor); + } + if (a + d + s + r < 238 - xOffset) + { + disp.drawCircle(xOffset + a, yOffset - height, radius, aColor); + disp.drawCircle(xOffset + a + d + s + r, yOffset, radius, rColor); + } + + // show pot values + char str[11]; + sprintf(str, "A: %d", pot_a); + disp.fillRectangle(130, 160, 70, 16, black); + disp.putStr(str, 130 - 9, 160, aColor, black); + sprintf(str, "D: %d", pot_d); + disp.fillRectangle(130, 180, 70, 16, black); + disp.putStr(str, 130 - 9, 180, dColor, black); + sprintf(str, "S: 50%%"); + disp.fillRectangle(130, 200, 70, 16, black); + disp.putStr(str, 130 - 9, 200, sColor, black); + sprintf(str, "R: %d", pot_r); + disp.fillRectangle(130, 220, 70, 16, black); + disp.putStr(str, 130 - 9, 220, rColor, black); + } + + if (gate < 2682) // 3V3 trig level + disp.fillRectangle(220, 80, 10, 10, black); +} + +void module_adsr::init(display &disp) +{ + // show logo + disp.showImg(img_env, sizeof(img_env), 0, 0, 240, 60, logoColor); + // clear background + disp.fillRectangle(0, 60, 240, 240 - 60, black); +} + +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| \ No newline at end of file diff --git a/firmware/generic/src/module_adsr.h b/firmware/generic/src/module_adsr.h new file mode 100644 index 0000000..d1c71b6 --- /dev/null +++ b/firmware/generic/src/module_adsr.h @@ -0,0 +1,24 @@ +#ifndef __module_adsr_h +#define __module_adsr_h +extern "C" +{ +#include "drivers/display.h" +} + +class module_adsr +{ +public: + module_adsr(){}; + uint16_t int_adsr(uint16_t gate, uint16_t pot_a, uint16_t pot_d, uint16_t pot_r, uint8_t noSustain); + void draw(display &disp, uint16_t gate, uint16_t pot_a, uint16_t pot_d, uint16_t pot_r, uint8_t noSustain); + void init(display &disp); + +private: + uint16_t tCount; + uint8_t adsrMode; + uint8_t oldGate; + uint8_t xorGate; + int8_t gateCount; + uint16_t a, d, s, r; +}; +#endif \ No newline at end of file diff --git a/firmware/generic/src/module_delay.cpp b/firmware/generic/src/module_delay.cpp new file mode 100644 index 0000000..9459280 --- /dev/null +++ b/firmware/generic/src/module_delay.cpp @@ -0,0 +1,31 @@ +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| +#include "module_delay.h" +extern "C" +{ +#include "gd32vf103.h" +} + +/* potentiometer and I/O mapping + R P2 + P4 P3 + C0 C1 + D0 D1 +*/ + +uint16_t module_delay::delay(uint16_t sample, uint16_t mix, uint16_t length) +{ + + static uint16_t anHistory[4096]; // old readings from the analog input. Uses 8192 bytes of RAM... + static uint16_t anPos = 0; // index of the current reading + uint16_t old; // + uint16_t tmp; // + if (anPos >= 4095) // Are we're at the end of the array ? + anPos = 0; // ...yes, wrap around to the beginning + old = anHistory[anPos]; // get saved sample + tmp = old * mix >> 12; // mix old sample.. + tmp += sample * (4095 - mix) >> 12; // ..with new sample + anHistory[anPos] = tmp; // save new sample + anPos++; // advance to the next position in the array: + return (tmp); // return (mix) +} +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| \ No newline at end of file diff --git a/firmware/generic/src/module_delay.h b/firmware/generic/src/module_delay.h new file mode 100644 index 0000000..77d7581 --- /dev/null +++ b/firmware/generic/src/module_delay.h @@ -0,0 +1,20 @@ +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| +#ifndef __module_delay_h +#define __module_delay_h +extern "C" +{ +#include +} + +class module_delay +{ +public: + module_delay(){}; + uint16_t delay(uint16_t sample, uint16_t mix, uint16_t length); + +private: + uint16_t anHistory[4096]; // old readings from the analog input. Uses 8192 bytes of RAM... + uint16_t anPos; // index of the current reading +}; +#endif +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| \ No newline at end of file diff --git a/firmware/generic/src/module_noise.cpp b/firmware/generic/src/module_noise.cpp new file mode 100644 index 0000000..b4b3309 --- /dev/null +++ b/firmware/generic/src/module_noise.cpp @@ -0,0 +1,37 @@ +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| +#include "module_noise.h" +#include "drivers\display.h" + +// compressed image generated with python script (used by init) +const uint8_t img_rnd[175] = {255, 255, 255, 255, 255, 255, 255, 255, 132, 59, 15, 59, 9, 65, 25, 1, 59, 0, 12, 1, 59, 0, 74, 0, 23, 0, 62, 0, 10, 0, 62, 0, 74, 1, 20, 0, 64, 0, 8, 0, 64, 0, 95, 0, 66, 0, 6, 0, 66, 0, 74, 0, 239, 0, 16, 0, 68, 0, 4, 0, 68, 0, 255, 255, 255, 255, 43, 48, 26, 48, 26, 48, 255, 255, 255, 233, 48, 255, 255, 255, 255, 189, 0, 255, 222, 0, 237, 0, 237, 0, 237, 0, 183, 41, 255, 224, 0, 11, 0, 255, 211, 0, 11, 0, 255, 79, 48, 82, 0, 11, 0, 255, 211, 0, 11, 0, 245, 0, 219, 0, 11, 0, 74, 0, 74, 0, 93, 0, 219, 0, 11, 0, 72, 0, 74, 0, 95, 0, 64, 0, 74, 0, 77, 0, 11, 0, 5, 1, 61, 0, 74, 0, 100, 1, 56, 2, 73, 1, 20, 10, 48, 12, 9, 3, 48, 3, 11, 64, 255, 255, 255, 255, 255, 255, 165}; +#define logoColor RGBToWord(0x00, 0xff, 0xff) +//#define black RGBToWord(0x00, 0x00, 0x00) + +/* potentiometer and I/O mapping + R P2 + P4 P3 + C0 C1 + D0 D1 +*/ + +// simple pseudo random noise generator +uint16_t module_noise::prng(uint16_t volume) +{ + LowBit = Rnd & 1; + Rnd >>= 1; + Rnd ^= LowBit ? 0x80000057ul : 0ul; + if (LowBit) + return (2048+volume); // 2048 = 0V + else + return (2048-volume); +} + +void module_noise::init(display &disp) +{ + Rnd = 4294967294; + // show logo + disp.showImg(img_rnd, sizeof(img_rnd), 0, 0, 240, 60, logoColor); +} + + +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| \ No newline at end of file diff --git a/firmware/generic/src/module_noise.h b/firmware/generic/src/module_noise.h new file mode 100644 index 0000000..a8d7e0b --- /dev/null +++ b/firmware/generic/src/module_noise.h @@ -0,0 +1,18 @@ +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| +#ifndef __module_noise_h +#define __module_noise_h +#include "drivers\display.h" + +class module_noise +{ +public: + module_noise(){}; + uint16_t prng(uint16_t volume); + void init(display &disp); + +private: + uint32_t Rnd; // random seed + uint8_t LowBit; // noise out +}; +#endif +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| \ No newline at end of file diff --git a/firmware/generic/src/module_vcf.cpp b/firmware/generic/src/module_vcf.cpp new file mode 100644 index 0000000..dd58b9c --- /dev/null +++ b/firmware/generic/src/module_vcf.cpp @@ -0,0 +1,234 @@ +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| +#include "module_vcf.h" +extern "C" +{ +#include "gd32vf103.h" +} + +/* potentiometer and I/O mapping + R P2 + P4 P3 + C0 C1 + D0 D1 +*/ + +// 4 pole ladder resonant low pass filter (Karlsen fast ladder) +uint16_t module_vcf::r4pole1(uint16_t sample, uint16_t cutoff, uint16_t resonance) +{ + static int16_t oldOut; + if (sample > 2048 && oldOut < 2048) + phaseTrig = 1; + else + phaseTrig = 0; + oldOut = sample; + + static float buf1, buf2, buf3, buf4, fb, in, cut, q; + in = float(sample - 2048) / 2048; + cut = float(cutoff) / 4096; + q = float(resonance) / 512; // 0 to 64 + fb = buf4; + if (fb > 1) + fb = 1; + if (fb < -1) + fb = -1; + in = in - (fb * q); + buf1 = ((in - buf1) * cut) + buf1; + buf2 = ((buf1 - buf2) * cut) + buf2; + buf3 = ((buf2 - buf3) * cut) + buf3; + buf4 = ((buf3 - buf4) * cut) + buf4; + + filterOut = buf4 * 2048 + 2048; + if (buf4 > 1) + filterOut = 4095; + else if (buf4 < -1) + filterOut = 0; + return (filterOut); +} + +// 2-pole resonant low pass filter (Paul Kellett) +uint16_t module_vcf::r2pole1(uint16_t sample, uint16_t cutoff, uint16_t resonance) +{ + static int16_t oldOut; + if (sample > 2048 && oldOut < 2048) + phaseTrig = 1; + else + phaseTrig = 0; + oldOut = sample; + + static float buf1, buf2, buf3, buf4, fb, in, cut, q; + oldOut = sample; + cut = float(cutoff) / 4096; + q = float(resonance) / 2048; + in = float(sample - 2048) / 2048; + fb = q + q / (1.0 - cut); + buf1 = buf1 + cut * (in - buf1 + fb * (buf1 - buf2)); + if (buf1 > 1) + buf1 = 1; + else if (buf1 < -1) + buf1 = -1; + buf2 = buf2 + cut * (buf1 - buf2); + filterOut = buf2 * 2048 + 2048; + if (buf2 > 1) + filterOut = 4095; + else if (buf2 < -1) + filterOut = 0; + return (filterOut); +} + +// 2-pole resonant low pass filter (BASS) +uint16_t module_vcf::r2pole2(uint16_t sample, uint16_t cutoff, uint16_t resonance) +{ + // F = LPF (cutoff) + // Q = RESONANCE + // q = SCALED_RESONANCE + // buf2 => output + // f = (1 - F) / 2 + Q_offset; + // q = Q - f = Q - (1 - F) / 2 + Q_offset; + + static int16_t oldOut; + if (sample > 2048 && oldOut < 2048) + phaseTrig = 1; + else + phaseTrig = 0; + oldOut = sample; + static float buf1, buf2, buf3, buf4, fb, in, cut, q; + + cut = float(cutoff) / 4096; + q = float(resonance) / 4096; + in = float(sample - 2048) / 2048; + + fb = q - (1 - cut) / 2 + 0; + buf1 += cut * (in - buf1 + fb * 4 * (buf1 - buf2)); + buf2 += cut * (buf1 - buf2); + + filterOut = buf2 * 2048 + 2048; + if (buf2 > 1) + filterOut = 4095; + else if (buf2 < -1) + filterOut = 0; + return (filterOut); +} + +// test for filter development +uint16_t module_vcf::test(uint16_t sample, uint16_t cutoff, uint16_t resonance) +{ + static int16_t oldOut; + if (sample > 2048 && oldOut < 2048) + phaseTrig = 1; + else + phaseTrig = 0; + oldOut = sample; + static float buf1, buf2, buf3, buf4, fb, in, cut, q; + + cut = float(cutoff) / 4096; + q = float(resonance) / 4096; + in = float(sample - 2048) / 2048; + + filterOut = in * 2048 + 2048; + if (buf2 > 1) + filterOut = 4095; + else if (buf2 < -1) + filterOut = 0; + return (filterOut); +} + +/* +// MOOG 4pole 24 db resonant low pass (Stilson/Smith & Timo Tossavainen) +// ***doesnt work*** - takes too long to calculate at 44kHz ;( +uint16_t module_vcf::moog24db(uint16_t sample, uint16_t cutoff, uint16_t resonance) +{ + + static int16_t oldOut; + if (sample > 2048 && oldOut < 2048) + phaseTrig = 1; + else + phaseTrig = 0; + oldOut = sample; + + // Tdouble MoogVCF::run(double input, double fc, double res) + static float in1, in2, in3, in4, buf1, buf2, buf3, buf4, fb, in, cut, q; + + in = float(sample - 2048) / 2048; + cut = float(cutoff) / 3531; // = cutoff*1.16 + q = float(resonance) / 1024; + + fb = q * (1.0 - 0.15 * cut * cut); + in -= buf4 * fb; + in *= 0.35013 * (cut * cut) * (cut * cut); + buf1 = in + 0.3 * in1 + (1 - cut) * buf1; // Pole 1 + in1 = in; + buf2 = buf1 + 0.3 * in2 + (1 - cut) * buf2; // Pole 2 + in2 = buf1; + buf3 = buf2 + 0.3 * in3 + (1 - cut) * buf3; // Pole 3 + in3 = buf2; + buf4 = buf3 + 0.3 * in4 + (1 - cut) * buf4; // Pole 4 + in4 = buf3; + filterOut = buf4 * 2048 + 2048; + if (buf4 > 1) filterOut = 4095; + else if (buf4 < -1) filterOut = 0; + return (filterOut); +} +*/ + +/* +// integer implementation of 2pole filter, without feedback division. fast, but not so good... +uint16_t module_vcf::r2pole3(uint16_t sample, uint16_t cutoff, uint16_t resonance) +{ + static int16_t filterValue; + static int16_t filterOut; + static int16_t out; + static int16_t oldOut; + + if (sample > 2048 && oldOut < 2048) + phaseTrig = 1; + else + phaseTrig = 0; + oldOut = sample; + + resonance = resonance - cutoff; + filterValue += cutoff * (((sample - 2048) >> 4) - (filterValue >> 8) + ((resonance * (filterValue - filterOut)) >> 24)) >> 6; // + filterOut += cutoff * (filterValue - filterOut) >> 14; + + // filterValue += cutoff * (sample - 2048 - filterValue + (resonance * (filterValue - filterOut) >> 14) ) >> 15; // + // filterOut += cutoff * (filterValue - filterOut) >> 13; + out = (filterOut >> 4) + 2048; + out = (out > 4095 ? 4095 : out); + out = (out < 0 ? 0 : out); + return (out); +} +*/ +/* +// Running average analog filter ***works bad, too steep (exponential by nature)***: +static uint16_t anHistory[4096]; // old readings from the analog input. Uses 8192 bytes of RAM... +static uint16_t anPos = 0; // index of the current reading +static uint16_t oldLength; // previous filterlength +static uint32_t anTotal = 0; // running total +uint16_t anAvg = 0; // analog average + +if (newLength > oldLength) // has filterlength increased ? +{ // + for (uint16_t i = oldLength + 1; i <= newLength; i++) // ..yes, update anHistory and anTotal + { + anHistory[i] = anHistory[oldLength]; + anTotal += anHistory[oldLength]; + } +} +else if (newLength < oldLength) // has filterlength decreased ? +{ // + for (uint16_t i = oldLength; i > newLength; i--) // ..yes, update anTotal + { + anTotal -= anHistory[i]; + } +} +if (anPos >= newLength) // Are we're at the end of the array ? + anPos = 0; // ...yes, wrap around to the beginning +anTotal -= anHistory[anPos]; // subtract old reading to be replaced +anHistory[anPos] = sample; // save new sampled value +anTotal += sample; // add sample to anTotal +anPos++; // advance to the next position in the array: +anAvg = anTotal / newLength; // calculate the average: +oldLength = newLength; // +return (anAvg); // return average value +*/ + +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| \ No newline at end of file diff --git a/firmware/generic/src/module_vcf.h b/firmware/generic/src/module_vcf.h new file mode 100644 index 0000000..6b915d6 --- /dev/null +++ b/firmware/generic/src/module_vcf.h @@ -0,0 +1,26 @@ +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| +#ifndef __module_vcf_h +#define __module_vcf_h +extern "C" +{ +#include +} + +class module_vcf +{ +public: + module_vcf(){}; + uint8_t phaseTrig; + int16_t filterValue; + int16_t filterOut; + uint16_t r4pole1(uint16_t sample, uint16_t cutoff, uint16_t resonance); + uint16_t r2pole1(uint16_t sample, uint16_t cutoff, uint16_t resonance); + uint16_t r2pole2(uint16_t sample, uint16_t cutoff, uint16_t resonance); + uint16_t test(uint16_t sample, uint16_t cutoff, uint16_t resonance); + +private: + static float in1, in2, in3, in4, buf1, buf2, buf3, buf4, fb, in, cut, q; + static int16_t oldOut; +}; +#endif +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| \ No newline at end of file diff --git a/firmware/generic/src/module_vco.cpp b/firmware/generic/src/module_vco.cpp new file mode 100644 index 0000000..20a64cf --- /dev/null +++ b/firmware/generic/src/module_vco.cpp @@ -0,0 +1,206 @@ +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| +#include "module_vco.h" +extern "C" +{ +#include "gd32vf103.h" +} + +float module_vco::sine(float xTmp) +{ + if (xTmp > 0) + { + phase += xTmp; + if (phase > 65535) + { + phase -= 65535; + } + if (phase > 32768 && oldPhase < 32768) + phaseTrig = 1; + else + phaseTrig = 0; + oldPhase = phase; + } + return (sin(phase)); +} + + +// square - pw (16 bit) controls pulse width / duty cycle +uint16_t module_vco::square(float xTmp, uint16_t pw) +{ + phase += xTmp; + if (phase > 65535) + { + phase -= 65535; + } + if (phase > 32768 && oldPhase < 32768) + phaseTrig = 1; + else + phaseTrig = 0; + oldPhase = phase; + if (phase > pw) + return (1088); // 1088 = -5V + else + return (3008); // 3008 = +5V +} +// square - pw (16 bit) controls pulse width / duty cycle +uint16_t module_vco::square2x(float xTmp, uint16_t dist) +{ + int16_t out1, out2, out3; + uint16_t pw = 32768; // 50%pw / 2 + phase2 += xTmp; + if (phase2 > 65535) phase2 -= 65535; + if (phase2 > 32768 && oldPhase < 32768) phaseTrig = 1; + else phaseTrig = 0; + oldPhase = phase2; + if (phase2 > pw) out2 = -480; // 1088 = -5V + else out2 = 480; // 3008 = +5V + phase1 += xTmp - dist; + if (phase1 > 65535) phase1 -= 65535; + if (phase1 > pw) out1 = -480; // 10192/88 = -5V + else out1 = 480; // 3008 = +5V + phase3 += xTmp + dist; + if (phase3 > 65535) phase3 -= 65535; + if (phase3 > pw) out3 = -480; // 1088 = -5V + else out3 = 480; // 3008 = +5V + return(2048+out1+out3); +} +// square - pw (16 bit) controls pulse width / duty cycle +uint16_t module_vco::square3x(float xTmp, uint16_t dist) +{ + int16_t out1, out2, out3; + uint16_t pw = 32768; // 50%pw / 2 + phase2 += xTmp; + if (phase2 > 65535) phase2 -= 65535; + if (phase2 > 32768 && oldPhase < 32768) phaseTrig = 1; + else phaseTrig = 0; + oldPhase = phase2; + if (phase2 > pw) out2 = -320; // 1088 = -5V + else out2 = 320; // 3008 = +5V + phase1 += xTmp - dist; + if (phase1 > 65535) phase1 -= 65535; + if (phase1 > pw) out1 = -320; // 10192/88 = -5V + else out1 = 320; // 3008 = +5V + phase3 += xTmp + dist; + if (phase3 > 65535) phase3 -= 65535; + if (phase3 > pw) out3 = -320; // 1088 = -5V + else out3 = 320; // 3008 = +5V + return(2048+out1+out2+out3); +} + +// triangle - shape (16 bit) morphs between reverse saw, triangle and saw (could use bresenham to avoid division...) +uint16_t module_vco::triangle(float xTmp, uint16_t shape) +{ + phase += xTmp; + if (phase > 65535) + { + phase -= 65535; + } + if (phase > 32768 && oldPhase < 32768) + phaseTrig = 1; + else + phaseTrig = 0; + oldPhase = phase; + + if (phase < (65535 - shape)) // 12 bit -> 16 bit + return (4095 - 1088 - (phase * 1920) / (65535 - shape)); // x*4095/(anAvg[2]*16) + else + return (4095 - 1088 - ((65535 - phase) * 1920) / (shape)); +} + + +// triangle - shape (16 bit) morphs between reverse saw, triangle and saw (could use bresenham to avoid division...) +uint16_t module_vco::triangle2x(float xTmp, uint16_t dist) +{ + uint16_t out1,out2,out3; + //uint16_t shape = 32768; // triangle shape (not saw) + uint16_t shape = 65000; // saw shape + phase2 += xTmp; + if (phase2 > 65535) phase2 -= 65535; + if (phase2 > 32768 && oldPhase < 32768) phaseTrig = 1; + else phaseTrig = 0; + oldPhase = phase2; + + if (phase2 < (65535 - shape)) // 12 bit -> 16 bit + out2 = (4095 - 1088 - (phase2 * 1920) / (65535 - shape)); // x*4095/(anAvg[2]*16) + else + out2 = (4095 - 1088 - ((65535 - phase2) * 1920) / (shape)); + + phase1 += xTmp - dist; + if (phase1 > 65535) phase1 -= 65535; + if (phase1 < (65535 - shape)) out1 = (4095 - 1088 - (phase1 * 1920) / (65535 - shape)); + else out1 = (4095 - 1088 - ((65535 - phase1) * 1920) / (shape)); + + phase3 += xTmp + dist; + if (phase3 > 65535) phase3 -= 65535; + if (phase3 < (65535 - shape)) out3 = (4095 - 1088 - (phase3 * 1920) / (65535 - shape)); + else out3 = (4095 - 1088 - ((65535 - phase3) * 1920) / (shape)); + return((out1+out3)>>1); +} + +// triangle - shape (16 bit) morphs between reverse saw, triangle and saw (could use bresenham to avoid division...) +uint16_t module_vco::triangle3x(float xTmp, uint16_t dist) +{ + uint16_t out1,out2,out3; + //uint16_t shape = 32768; // triangle shape (not saw) + uint16_t shape = 65000; // saw shape + phase2 += xTmp; + if (phase2 > 65535) phase2 -= 65535; + if (phase2 > 32768 && oldPhase < 32768) phaseTrig = 1; + else phaseTrig = 0; + oldPhase = phase2; + + if (phase2 < (65535 - shape)) // 12 bit -> 16 bit + out2 = (4095 - 1088 - (phase2 * 1920) / (65535 - shape)); // x*4095/(anAvg[2]*16) + else + out2 = (4095 - 1088 - ((65535 - phase2) * 1920) / (shape)); + + phase1 += xTmp - dist; + if (phase1 > 65535) phase1 -= 65535; + if (phase1 < (65535 - shape)) out1 = (4095 - 1088 - (phase1 * 1920) / (65535 - shape)); + else out1 = (4095 - 1088 - ((65535 - phase1) * 1920) / (shape)); + + phase3 += xTmp + dist; + if (phase3 > 65535) phase3 -= 65535; + if (phase3 < (65535 - shape)) out3 = (4095 - 1088 - (phase3 * 1920) / (65535 - shape)); + else out3 = (4095 - 1088 - ((65535 - phase3) * 1920) / (shape)); + return(((out1+out3)>>1)+out2>>1); +} + +/* +uint16_t module_vco::int_saw(uint16_t x) +{ + uint32_t tmp = 4095 - (x >> 4); // (16 bit -> 12 bit) + return (tmp); +} + +uint16_t module_vco::int_r_saw(uint16_t x) +{ + uint32_t tmp = x >> 4; // (16 bit -> 12 bit) + return (tmp); +} +*/ +float module_vco::sin(float x) +{ +#define PI 3.1415926535897932384626433832795028841971693993751058209749445923078164062 +#define r360 2 * PI +#define r180 PI +#define r90 PI / 2 +#define PIR PI / 32768 // 65536/2 + x = x * PIR; // convert uint16_t to rad + // x = x * PI / 180; // convert degrees to rad + int sign = 1; + if (x > r180) + { + x = r360 - x; + sign = -1; + } + if (x > r90) + { + x = r180 - x; + } + float x2 = x * x; + float y = sign * x * (x2 * (x2 * (42 - x2) - 840) + 5040) / 5040; + y = y * 960 + 2048; // convert from +/-1 to 1088 - 3008 (-5V to +5V) + return (y); +} +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| \ No newline at end of file diff --git a/firmware/generic/src/module_vco.h b/firmware/generic/src/module_vco.h new file mode 100644 index 0000000..c901b36 --- /dev/null +++ b/firmware/generic/src/module_vco.h @@ -0,0 +1,31 @@ +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| +#ifndef __module_vco_h +#define __module_vco_h +extern "C" +{ +#include +} + +class module_vco +{ +public: + module_vco(){}; + uint8_t phaseTrig; + float sine(float xTmp); + // float sine3x(float xTmp, uint16_t dist); + uint16_t square(float xTmp, uint16_t pw); + uint16_t square2x(float xTmp, uint16_t dist); + uint16_t square3x(float xTmp, uint16_t dist); + uint16_t triangle(float xTmp, uint16_t shape); + uint16_t triangle2x(float xTmp, uint16_t dist); + uint16_t triangle3x(float xTmp, uint16_t dist); + // uint16_t int_saw(uint16_t x); + // uint16_t int_r_saw(uint16_t x); + +private: + float phase, phase1, phase2, phase3; + float oldPhase; + float sin(float x); +}; +#endif +//-----10|-------20|-------30|-------40|-------50|-------60|-------70|-------80| \ No newline at end of file diff --git a/firmware/generic/src/workspace.code-workspace b/firmware/generic/src/workspace.code-workspace new file mode 100644 index 0000000..bab1b7f --- /dev/null +++ b/firmware/generic/src/workspace.code-workspace @@ -0,0 +1,8 @@ +{ + "folders": [ + { + "path": ".." + } + ], + "settings": {} +} \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/main.c new file mode 100644 index 0000000..5d5920a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/main.c @@ -0,0 +1,222 @@ +/*! + \file main.c + \brief ADC0_ADC1_regular_parallel + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include +#include "gd32vf103v_eval.h" + +uint32_t adc_value[2]; + +void rcu_config(void); +void gpio_config(void); +void dma_config(void); +void timer_config(void); +void adc_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ + +int main(void) +{ + /* system clocks configuration */ + rcu_config(); + /* GPIO configuration */ + gpio_config(); + /* TIMER configuration */ + timer_config(); + /* DMA configuration */ + dma_config(); + /* ADC configuration */ + adc_config(); + + /* enable TIMER1 */ + timer_enable(TIMER1); + + while(1){ + } +} + +/*! + \brief configure the different system clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOA clock */ + rcu_periph_clock_enable(RCU_GPIOA); + /* enable ADC0 clock */ + rcu_periph_clock_enable(RCU_ADC0); + /* enable ADC1 clock */ + rcu_periph_clock_enable(RCU_ADC1); + /* enable DMA0 clock */ + rcu_periph_clock_enable(RCU_DMA0); + /* enable timer1 clock */ + rcu_periph_clock_enable(RCU_TIMER1); + /* config ADC clock */ + rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* config the GPIO as analog mode */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_3); +} + +/*! + \brief configure the DMA peripheral + \param[in] none + \param[out] none + \retval none +*/ +void dma_config(void) +{ + /* ADC_DMA_channel configuration */ + dma_parameter_struct dma_data_parameter; + + /* ADC DMA_channel configuration */ + dma_deinit(DMA0, DMA_CH0); + + /* initialize DMA data mode */ + dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0)); + dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_data_parameter.memory_addr = (uint32_t)(&adc_value); + dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_32BIT; + dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_32BIT; + dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_data_parameter.number = 2; + dma_data_parameter.priority = DMA_PRIORITY_HIGH; + dma_init(DMA0, DMA_CH0, &dma_data_parameter); + + dma_circulation_enable(DMA0, DMA_CH0); + + /* enable DMA channel */ + dma_channel_enable(DMA0, DMA_CH0); +} + +/*! + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none +*/ +void timer_config(void) +{ + timer_oc_parameter_struct timer_ocintpara; + timer_parameter_struct timer_initpara; + + /* TIMER1 configuration */ + timer_struct_para_init(&timer_initpara); + timer_initpara.prescaler = 5399; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 9999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER1,&timer_initpara); + + /* CH0 configuration in PWM mode1 */ + timer_channel_output_struct_para_init(&timer_ocintpara); + timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocintpara.outputstate = TIMER_CCX_ENABLE; + timer_channel_output_config(TIMER1, TIMER_CH_1, &timer_ocintpara); + + timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 3999); + timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_PWM1); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE); +} + +/*! + \brief configure the ADC peripheral + \param[in] none + \param[out] none + \retval none +*/ +void adc_config(void) +{ + /* reset ADC */ + adc_deinit(ADC0); + adc_deinit(ADC1); + /* ADC mode config */ + adc_mode_config(ADC_DAUL_REGULAL_PARALLEL); + /* ADC continous function enable */ + adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE); + adc_special_function_config(ADC1, ADC_SCAN_MODE, ENABLE); + + /* ADC data alignment config */ + adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); + adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT); + /* ADC channel length config */ + adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 2); + adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, 2); + + /* ADC regular channel config */ + adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC1, 0, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC1, 1, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5); + + /* ADC trigger config */ + adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_T1_CH1); + adc_external_trigger_source_config(ADC1, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); + /* ADC external trigger enable */ + adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); + adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, ENABLE); + + /* enable ADC interface */ + adc_enable(ADC0); + /* ADC calibration and reset calibration */ + adc_calibration_enable(ADC0); + /* enable ADC interface */ + adc_enable(ADC1); + delay_1ms(1); + /* ADC calibration and reset calibration */ + adc_calibration_enable(ADC1); + + /* ADC DMA function enable */ + adc_dma_mode_enable(ADC0); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/readme.txt new file mode 100644 index 0000000..9892600 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/readme.txt @@ -0,0 +1,42 @@ +/*! + \file readme.txt + \brief description of the ADC0_ADC1_regular_parallel example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-1.0 board, it shows how to use ADC0 and ADC1 +regular_parallel convert function. PA3 and PA0 are configured in AIN mode. TIMER1_CH1 +is the trigger source of ADC0. ADC1 external trigger chooses none. When the rising edge +of TIMER1_CH1 coming, ADC0 and ADC1 regular channels are triggered at the same time. The +values of ADC0 and ADC1 are transmit to array adc_value[] by DMA. + + We can watch array adc_value[] in debug mode. + \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/systick.c new file mode 100644 index 0000000..d891c3b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/systick.h new file mode 100644 index 0000000..16746e5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_ADC1_regular_parallel/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/gd32vf103_it.c new file mode 100644 index 0000000..adc5762 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/gd32vf103_it.c @@ -0,0 +1,58 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "systick.h" +#include + +#include "gd32vf103_it.h" +#include "gd32vf103v_eval.h" + +extern uint16_t inserted_data[4]; + +/*! + \brief this function handles ADC0 and ADC1 interrupt + \param[in] none + \param[out] none + \retval none +*/ +void ADC0_1_IRQHandler(void) +{ + /* clear the ADC flag */ + adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC); + /* read ADC inserted group data register */ + inserted_data[0] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_0); + inserted_data[1] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_1); + inserted_data[2] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_2); + inserted_data[3] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_3); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/gd32vf103_it.h new file mode 100644 index 0000000..1523429 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/gd32vf103_it.h @@ -0,0 +1,45 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ + +/* this function handles ADC0 and ADC1 interrupt */ +void ADC0_1_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/main.c new file mode 100644 index 0000000..eefb751 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/main.c @@ -0,0 +1,246 @@ +/*! + \file main.c + \brief ADC EXTI trigger demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include +#include "gd32vf103v_eval.h" + +uint16_t adc_value[4]; +uint16_t inserted_data[4]; + +void rcu_config(void); +void gpio_config(void); +void eclic_config(void); +void exti_config(void); +void adc_config(void); +void dma_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ + +int main(void) +{ + /* system clocks configuration */ + rcu_config(); + /* GPIO configuration */ + gpio_config(); + /* eclic configuration */ + eclic_config(); + /* configure COM port */ + gd_eval_com_init(EVAL_COM0); + /* DMA configuration */ + dma_config(); + /* ADC configuration */ + adc_config(); + /* configure the EXTI peripheral */ + exti_config(); + + while(1){ + delay_1ms(1000); + printf("ADC0 regular channel 0 data = %d \n\r",adc_value[0]); + printf("ADC0 regular channel 1 data = %d \n\r",adc_value[1]); + printf("ADC0 regular channel 2 data = %d \n\r",adc_value[2]); + printf("ADC0 regular channel 3 data = %d \n\r",adc_value[3]); + printf("ADC0 inserted channel 0 data = %d \n\r",inserted_data[0]); + printf("ADC0 inserted channel 1 data = %d \n\r",inserted_data[1]); + printf("ADC0 inserted channel 2 data = %d \n\r",inserted_data[2]); + printf("ADC0 inserted channel 3 data = %d \n\r",inserted_data[3]); + printf("***********************************\n\r"); + } +} + +/*! + \brief configure the different system clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOA clock */ + rcu_periph_clock_enable(RCU_GPIOA); + /* enable GPIOD clock */ + rcu_periph_clock_enable(RCU_GPIOD); + /* enable ADC1 clock */ + rcu_periph_clock_enable(RCU_ADC0); + /* enable DMA0 clock */ + rcu_periph_clock_enable(RCU_DMA0); + /* config ADC clock */ + rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* config the GPIO as analog mode, for ADC */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); +} + +/*! + \brief configure interrupt priority + \param[in] none + \param[out] none + \retval none +*/ +void eclic_config(void) +{ + eclic_global_interrupt_enable(); + eclic_irq_enable(ADC0_1_IRQn, 2, 0); +} + +/*! + \brief configure the EXTI peripheral + \param[in] none + \param[out] none + \retval none +*/ +void exti_config(void) +{ + /* enable the AF clock */ + rcu_periph_clock_enable(RCU_AF); + /* configure pin as input */ + gpio_init(GPIOD, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_15); + /* connect EXTI line to GPIO pin for inserted group */ + gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOD, GPIO_PIN_SOURCE_15); + /* configure EXTI line for inserted group */ + exti_init(EXTI_15, EXTI_EVENT, EXTI_TRIG_RISING); + + /* configure pin as input */ + gpio_init(GPIOD, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_11); + /* connect EXTI line to GPIO pin for inserted group */ + gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOD, GPIO_PIN_SOURCE_11); + /* configure EXTI line for inserted group */ + exti_init(EXTI_11, EXTI_EVENT, EXTI_TRIG_RISING); +} + +/*! + \brief configure the ADC peripheral + \param[in] none + \param[out] none + \retval none +*/ +void adc_config(void) +{ + /* reset ADC */ + adc_deinit(ADC0); + /* ADC mode config */ + adc_mode_config(ADC_MODE_FREE); + /* ADC scan function enable */ + adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE); + /* ADC continous function enable */ + adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, DISABLE); + /* ADC data alignment config */ + adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); + + /* ADC channel length config */ + adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 4); + /* ADC inserted channel config */ + adc_inserted_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5); + adc_inserted_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5); + adc_inserted_channel_config(ADC0, 2, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5); + adc_inserted_channel_config(ADC0, 3, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5); + /* ADC trigger config */ + adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_EXTI_15); + /* ADC external trigger enable */ + adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE); + /* clear the ADC flag */ + adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC); + adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC); + /* enable ADC interrupt */ + adc_interrupt_enable(ADC0, ADC_INT_EOIC); + + /* ADC channel length config */ + adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 4); + /* ADC regular channel config */ + adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_5, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_6, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_7, ADC_SAMPLETIME_55POINT5); + /* ADC trigger config */ + adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_EXTI_11); + adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); + /* ADC DMA function enable */ + adc_dma_mode_enable(ADC0); + + /* enable ADC interface */ + adc_enable(ADC0); + delay_1ms(1); + /* ADC calibration and reset calibration */ + adc_calibration_enable(ADC0); +} + +/*! + \brief configure the DMA peripheral + \param[in] none + \param[out] none + \retval none +*/ +void dma_config(void) +{ + /* ADC_DMA_channel configuration */ + dma_parameter_struct dma_data_parameter; + + /* ADC DMA_channel configuration */ + dma_deinit(DMA0, DMA_CH0); + + /* initialize DMA single data mode */ + dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0)); + dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_data_parameter.memory_addr = (uint32_t)(&adc_value); + dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; + dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT; + dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_data_parameter.number = 4; + dma_data_parameter.priority = DMA_PRIORITY_HIGH; + dma_init(DMA0, DMA_CH0, &dma_data_parameter); + + /* enable DMA circulation mode */ + dma_circulation_enable(DMA0, DMA_CH0); + + /* enable DMA channel */ + dma_channel_enable(DMA0, DMA_CH0); +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/readme.txt new file mode 100644 index 0000000..4246f5f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/readme.txt @@ -0,0 +1,48 @@ +/*! + \file readme.txt + \brief description of the ADC0 EXTI trigger regular and inserted channel + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-1.0 board, it shows how to convert ADC +regular and inserted group channels using EXTI external trigger. + + The inserted group length is 4, the scan mode is set, every rising edge event of +EXTI15(PD15) will trigger ADC to convert all the channels in the inserted group. +When all inserted group channels are converted, EOIC interrupt will be generated. +The inserted datas are print by USART. + + The regular group length is 4. Every rising edge event of EXTI11(PD11) converts 4 +channels and DMA can be used to transfer the converted data. + + We can watch array adc_value[]/inserted_data[] in debug mode or by COM. + JP5 and JP6 jump to USART. + \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/systick.c new file mode 100644 index 0000000..d891c3b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/systick.h new file mode 100644 index 0000000..9a74c22 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_EXTI_trigger_regular_inserted_channel/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/gd32vf103_it.c new file mode 100644 index 0000000..e8faa85 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/gd32vf103_it.c @@ -0,0 +1,55 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" +#include "systick.h" + +extern uint16_t inserted_data[4]; + +/*! + \brief this function handles ADC0 and ADC1 interrupt + \param[in] none + \param[out] none + \retval none +*/ +void ADC0_1_IRQHandler(void) +{ + /* clear the ADC flag */ + adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC); + /* read ADC inserted group data register */ + inserted_data[0] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_0); + inserted_data[1] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_1); + inserted_data[2] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_2); + inserted_data[3] = adc_inserted_data_read(ADC0, ADC_INSERTED_CHANNEL_3); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/gd32vf103_it.h new file mode 100644 index 0000000..1523429 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/gd32vf103_it.h @@ -0,0 +1,45 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ + +/* this function handles ADC0 and ADC1 interrupt */ +void ADC0_1_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/main.c new file mode 100644 index 0000000..1173421 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/main.c @@ -0,0 +1,202 @@ +/*! + \file main.c + \brief TIMER trigger injected channel of ADC + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include +#include "gd32vf103v_eval.h" + +uint16_t inserted_data[4]; + +void rcu_config(void); +void gpio_config(void); +void eclic_config(void); +void timer_config(void); +void adc_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ + +int main(void) +{ + /* system clocks configuration */ + rcu_config(); + /* GPIO configuration */ + gpio_config(); + /* eclic configuration */ + eclic_config(); + /* TIMER configuration */ + timer_config(); + /* ADC configuration */ + adc_config(); + /* configure COM port */ + gd_eval_com_init(EVAL_COM0); + + /* enable TIMER1 */ + timer_enable(TIMER1); + + while(1){ + delay_1ms(1000); + printf("\r\n ADC0 inserted channel 0 data = %d \r\n", inserted_data[0]); + printf("\r\n ADC0 inserted channel 1 data = %d \r\n", inserted_data[1]); + printf("\r\n ADC0 inserted channel 2 data = %d \r\n", inserted_data[2]); + printf("\r\n ADC0 inserted channel 3 data = %d \r\n", inserted_data[3]); + printf("\r\n ***********************************\r\n"); + } +} + +/*! + \brief configure the different system clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOA clock */ + rcu_periph_clock_enable(RCU_GPIOA); + /* enable ADC0 clock */ + rcu_periph_clock_enable(RCU_ADC0); + /* enable timer1 clock */ + rcu_periph_clock_enable(RCU_TIMER1); + /* config ADC clock */ + rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* config the GPIO as analog mode */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); +} + + +/*! + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none +*/ +void timer_config(void) +{ + timer_oc_parameter_struct timer_ocintpara; + timer_parameter_struct timer_initpara; + + /* deinit a timer */ + timer_deinit(TIMER1); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER1 configuration */ + timer_initpara.prescaler = 5399; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 9999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER1,&timer_initpara); + + /* CH0 configuration in PWM mode1 */ + timer_channel_output_struct_para_init(&timer_ocintpara); + timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocintpara.outputstate = TIMER_CCX_ENABLE; + timer_channel_output_config(TIMER1, TIMER_CH_0, &timer_ocintpara); + + timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_0, 3999); + timer_channel_output_mode_config(TIMER1, TIMER_CH_0, TIMER_OC_MODE_PWM1); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); +} + +/*! + \brief configure the ADC peripheral + \param[in] none + \param[out] none + \retval none +*/ +void adc_config(void) +{ + /* reset ADC */ + adc_deinit(ADC0); + /* ADC mode config */ + adc_mode_config(ADC_MODE_FREE); + /* ADC continous function enable */ + adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE); + /* ADC data alignment config */ + adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); + /* ADC channel length config */ + adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 4); + + /* ADC inserted channel config */ + adc_inserted_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5); + adc_inserted_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5); + adc_inserted_channel_config(ADC0, 2, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5); + adc_inserted_channel_config(ADC0, 3, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5); + + /* ADC trigger config */ + adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_T1_CH0); + + /* ADC external trigger enable */ + adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE); + /* clear the ADC flag */ + adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC); + adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOIC); + /* enable ADC interrupt */ + adc_interrupt_enable(ADC0, ADC_INT_EOIC); + + /* enable ADC interface */ + adc_enable(ADC0); + delay_1ms(1); + /* ADC calibration and reset calibration */ + adc_calibration_enable(ADC0); +} + +/** + \brief configure the nested vectored interrupt controller + \param[in] none + \param[out] none + \retval none + */ +void eclic_config(void) +{ + eclic_global_interrupt_enable(); + eclic_irq_enable(ADC0_1_IRQn, 2, 0); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/readme.txt new file mode 100644 index 0000000..fa0cd10 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/readme.txt @@ -0,0 +1,43 @@ +/*! + \file readme.txt + \brief description of the ADC TIMER trigger injected channel + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-1.0 board, it shows how to convert ADC inserted +group channels continuously using TIMER1 external trigger. + + The inserted group length is 4, the scan mode is set, every compare event will trigger ADC +to convert all the channels in the inserted group. + + We can watch adc_value in debug mode or by COM. + JP5 and JP6 jump to USART. + \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/systick.c new file mode 100644 index 0000000..d891c3b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/systick.h new file mode 100644 index 0000000..9a74c22 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_TIMER1_trigger_inserted_channel/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/main.c new file mode 100644 index 0000000..cb90663 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/main.c @@ -0,0 +1,194 @@ +/*! + \file main.c + \brief ADC discontinuous mode for regular channel + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include +#include "GD32vf103v_eval.h" + +uint16_t adc_value[8]; + +void rcu_config(void); +void gpio_config(void); +void dma_config(void); +void adc_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* system clocks configuration */ + rcu_config(); + /* GPIO configuration */ + gpio_config(); + /* configure COM port */ + gd_eval_com_init(EVAL_COM0); + /* DMA configuration */ + dma_config(); + /* ADC configuration */ + adc_config(); + + while(1){ + /* delay 1s */ + delay_1ms(1000); + /* ADC software trigger enable */ + adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); + + printf("\r\n ADC0 regular channel discontinuous mode 1st data: \r\n"); + printf("\r\n ADC0 regular channel 0 data = %d \r\n",adc_value[0]); + printf("\r\n ADC0 regular channel 1 data = %d \r\n",adc_value[1]); + printf("\r\n ADC0 regular channel 2 data = %d \r\n",adc_value[2]); + printf("\r\n ADC0 regular channel discontinuous mode 2st data: \r\n"); + printf("\r\n ADC0 regular channel 3 data = %d \r\n",adc_value[3]); + printf("\r\n ADC0 regular channel 4 data = %d \r\n",adc_value[4]); + printf("\r\n ADC0 regular channel 5 data = %d \r\n",adc_value[5]); + printf("\r\n ADC0 regular channel discontinuous mode 3st data: \r\n"); + printf("\r\n ADC0 regular channel 6 data = %d \r\n",adc_value[6]); + printf("\r\n ADC0 regular channel 7 data = %d \r\n",adc_value[7]); + printf("\r\n ***********************************\r\n"); + } +} + +/*! + \brief configure the different system clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOA clock */ + rcu_periph_clock_enable(RCU_GPIOA); + /* enable ADC0 clock */ + rcu_periph_clock_enable(RCU_ADC0); + /* enable DMA0 clock */ + rcu_periph_clock_enable(RCU_DMA0); + /* config ADC clock */ + rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* config the GPIO as analog mode */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3); + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4|GPIO_PIN_5|GPIO_PIN_6|GPIO_PIN_7); +} + +/*! + \brief configure the DMA peripheral + \param[in] none + \param[out] none + \retval none +*/ +void dma_config(void) +{ + /* ADC_DMA_channel configuration */ + dma_parameter_struct dma_data_parameter; + + /* ADC DMA_channel configuration */ + dma_deinit(DMA0, DMA_CH0); + + /* initialize DMA single data mode */ + dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0)); + dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_data_parameter.memory_addr = (uint32_t)(&adc_value); + dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; + dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT; + dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_data_parameter.number = 8; + dma_data_parameter.priority = DMA_PRIORITY_HIGH; + dma_init(DMA0, DMA_CH0, &dma_data_parameter); + + dma_circulation_enable(DMA0, DMA_CH0); + + /* enable DMA channel */ + dma_channel_enable(DMA0, DMA_CH0); +} + +/*! + \brief configure the ADC peripheral + \param[in] none + \param[out] none + \retval none +*/ +void adc_config(void) +{ + /* reset ADC */ + adc_deinit(ADC0); + /* ADC mode config */ + adc_mode_config(ADC_MODE_FREE); + + /* ADC data alignment config */ + adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); + /* ADC channel length config */ + adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 8); + + /* ADC regular channel config */ + adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_0, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC0, 1, ADC_CHANNEL_1, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC0, 2, ADC_CHANNEL_2, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC0, 3, ADC_CHANNEL_3, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC0, 4, ADC_CHANNEL_4, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC0, 5, ADC_CHANNEL_5, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC0, 6, ADC_CHANNEL_6, ADC_SAMPLETIME_55POINT5); + adc_regular_channel_config(ADC0, 7, ADC_CHANNEL_7, ADC_SAMPLETIME_55POINT5); + + /* ADC trigger config */ + adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); + adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); + + /* ADC discontinuous mode */ + adc_discontinuous_mode_config(ADC0, ADC_REGULAR_CHANNEL, 3); + + /* enable ADC interface */ + adc_enable(ADC0); + delay_1ms(1); + /* ADC calibration and reset calibration */ + adc_calibration_enable(ADC0); + + /* ADC DMA function enable */ + adc_dma_mode_enable(ADC0); +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/readme.txt new file mode 100644 index 0000000..51d1232 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/readme.txt @@ -0,0 +1,40 @@ +/*! + \file readme.txt + \brief description of the ADC discontinuous mode example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-1.0 board, it shows how to use the ADC discontinuous +mode. The ADC is configured in discontinuous mode, group length is 8, conversion length is 3, +using software trigger. Every trigger converts 3 channels. + + We can watch array adc_value[] in debug mode or by COM. + JP5 and JP6 jump to USART. \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/systick.c new file mode 100644 index 0000000..d891c3b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/systick.h new file mode 100644 index 0000000..9a74c22 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_discontinuous_mode/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/main.c new file mode 100644 index 0000000..33510ce --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/main.c @@ -0,0 +1,171 @@ +/*! + \file main.c + \brief ADC_regular_channel_with_DMA + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include +#include "gd32vf103v_eval.h" + +#define BOARD_ADC_CHANNEL ADC_CHANNEL_13 +#define ADC_GPIO_PORT GPIOC +#define ADC_GPIO_PIN GPIO_PIN_3 + +uint16_t adc_value; + +void rcu_config(void); +void gpio_config(void); +void dma_config(void); +void adc_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ + +int main(void) +{ + /* system clocks configuration */ + rcu_config(); + /* GPIO configuration */ + gpio_config(); + /* DMA configuration */ + dma_config(); + /* ADC configuration */ + adc_config(); + + while(1){ + } +} + +/*! + \brief configure the different system clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOA clock */ + rcu_periph_clock_enable(RCU_GPIOC); + /* enable ADC clock */ + rcu_periph_clock_enable(RCU_ADC0); + /* enable DMA0 clock */ + rcu_periph_clock_enable(RCU_DMA0); + /* config ADC clock */ + rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* config the GPIO as analog mode */ + gpio_init(ADC_GPIO_PORT, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, ADC_GPIO_PIN); +} + +/*! + \brief configure the DMA peripheral + \param[in] none + \param[out] none + \retval none +*/ +void dma_config(void) +{ + /* ADC_DMA_channel configuration */ + dma_parameter_struct dma_data_parameter; + + /* ADC DMA_channel configuration */ + dma_deinit(DMA0, DMA_CH0); + + /* initialize DMA single data mode */ + dma_data_parameter.periph_addr = (uint32_t)(&ADC_RDATA(ADC0)); + dma_data_parameter.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_data_parameter.memory_addr = (uint32_t)(&adc_value); + dma_data_parameter.memory_inc = DMA_MEMORY_INCREASE_DISABLE; + dma_data_parameter.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; + dma_data_parameter.memory_width = DMA_MEMORY_WIDTH_16BIT; + dma_data_parameter.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_data_parameter.number = 1; + dma_data_parameter.priority = DMA_PRIORITY_HIGH; + dma_init(DMA0, DMA_CH0, &dma_data_parameter); + dma_circulation_enable(DMA0, DMA_CH0); + + /* enable DMA channel */ + dma_channel_enable(DMA0, DMA_CH0); +} + +/*! + \brief configure the ADC peripheral + \param[in] none + \param[out] none + \retval none +*/ +void adc_config(void) +{ + /* reset ADC */ + adc_deinit(ADC0); + /* ADC mode config */ + adc_mode_config(ADC_MODE_FREE); + /* ADC contineous function enable */ + adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE); + /* ADC scan mode disable */ + adc_special_function_config(ADC0, ADC_SCAN_MODE, DISABLE); + /* ADC data alignment config */ + adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); + /* ADC channel length config */ + adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1); + + /* ADC regular channel config */ + adc_regular_channel_config(ADC0, 0, BOARD_ADC_CHANNEL, ADC_SAMPLETIME_55POINT5); + /* ADC trigger config */ + adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); + adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); + + /* enable ADC interface */ + adc_enable(ADC0); + delay_1ms(1); + /* ADC calibration and reset calibration */ + adc_calibration_enable(ADC0); + + /* ADC DMA function enable */ + adc_dma_mode_enable(ADC0); + /* ADC software trigger enable */ + adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/readme.txt new file mode 100644 index 0000000..351fc64 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/readme.txt @@ -0,0 +1,44 @@ +/*! + \file readme.txt + \brief description of the ADC regular channel with DMA + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-1.0 board, it shows how to use the ADC to convert +analog signal to digital data through DMA. The ADC is configured in continuous mode, PC3 +is chosen as analog input pin. + + As the ADC convertion begins by software, the converted data from ADC_RDATA register to +SRAM begins continuously. Users can change the VR1 on the GD32VF103V-EVAL board, measure +TP2 pad board, and check if its value matches the converted data through the watch window. + + The analog input pin should configured to AIN mode. + \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/systick.c new file mode 100644 index 0000000..bae5ced --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/systick.h new file mode 100644 index 0000000..9a74c22 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_regular_channel_with_DMA/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/main.c new file mode 100644 index 0000000..1a8dacc --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/main.c @@ -0,0 +1,137 @@ +/*! + \file main.c + \brief ADC channel of temperature and Vref + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include +#include "gd32vf103v_eval.h" + +float temperature; +float vref_value; + +uint16_t temperature_i; +uint16_t vref_value_i; + +void rcu_config(void); +void adc_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ + +int main(void) +{ + /* system clocks configuration */ + rcu_config(); + /* ADC configuration */ + adc_config(); + /* USART configuration */ + gd_eval_com_init(EVAL_COM0); + + while(1){ + /* ADC software trigger enable */ + adc_software_trigger_enable(ADC0, ADC_INSERTED_CHANNEL); + /* delay a time in milliseconds */ + delay_1ms(2000); + + /* value convert */ + temperature = (1.42 - ADC_IDATA0(ADC0)*3.3/4096) * 1000 / 4.3 + 25; + vref_value = (ADC_IDATA1(ADC0) * 3.3 / 4096); + + temperature_i = (uint16_t)(temperature*1000); + vref_value_i = (uint16_t)(vref_value*1000); + + /* value print */ + printf(" the temperature data is (%d/1000) degrees Celsius\r\n", temperature_i); + printf(" the reference voltage data is (%d/1000)V \r\n", vref_value_i); + printf(" \r\n"); + } + +} + +/*! + \brief configure the different system clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable ADC clock */ + rcu_periph_clock_enable(RCU_ADC0); + /* config ADC clock */ + rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8); +} + +/*! + \brief configure the ADC peripheral + \param[in] none + \param[out] none + \retval none +*/ +void adc_config(void) +{ + /* reset ADC */ + adc_deinit(ADC0); + /* ADC mode config */ + adc_mode_config(ADC_MODE_FREE); + /* ADC scan function enable */ + adc_special_function_config(ADC0, ADC_SCAN_MODE, ENABLE); + /* ADC data alignment config */ + adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); + /* ADC temperature and Vrefint enable */ + adc_tempsensor_vrefint_enable(); + + /* ADC channel length config */ + adc_channel_length_config(ADC0, ADC_INSERTED_CHANNEL, 2); + + /* ADC temperature sensor channel config */ + adc_inserted_channel_config(ADC0, 0, ADC_CHANNEL_16, ADC_SAMPLETIME_239POINT5); + /* ADC internal reference voltage channel config */ + adc_inserted_channel_config(ADC0, 1, ADC_CHANNEL_17, ADC_SAMPLETIME_239POINT5); + + /* ADC trigger config */ + adc_external_trigger_source_config(ADC0, ADC_INSERTED_CHANNEL, ADC0_1_EXTTRIG_INSERTED_NONE); + + adc_external_trigger_config(ADC0, ADC_INSERTED_CHANNEL, ENABLE); + + /* enable ADC interface */ + adc_enable(ADC0); + delay_1ms(1); + /* ADC calibration and reset calibration */ + adc_calibration_enable(ADC0); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/readme.txt new file mode 100644 index 0000000..d11062e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/readme.txt @@ -0,0 +1,45 @@ +/*! + \file readme.txt + \brief description of ADC channel of temperature and vref + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-1.0 board, it shows how to use the ADC to +convert analog signal to digital data. The ADC is configured in dependent mode, inner +channel16(temperature sensor channel) and channel17(Vref channel) are chosen as analog +input pin. + + As the ADC convertion begins by software, the converted data in the ADC_IDATAx register, + where the x is 0 to 1. + + We can watch temperature and vref_value in debug mode or by COM. + JP5 and JP6 jump to USART. + \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/systick.c new file mode 100644 index 0000000..d891c3b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/systick.h new file mode 100644 index 0000000..9a74c22 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC0_temperature_Vref/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/gd32vf103_it.c new file mode 100644 index 0000000..c9fd80f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/gd32vf103_it.c @@ -0,0 +1,54 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "systick.h" +#include "gd32vf103_it.h" +#include "gd32vf103v_eval.h" + +extern int data; + +/*! + \brief this function handles ADC0_1 exception + \param[in] none + \param[out] none + \retval none +*/ +void ADC0_1_IRQHandler(void) +{ + /* clear the ADC interrupt or status flag */ + adc_interrupt_flag_clear(ADC1, ADC_INT_FLAG_WDE); + /* turn on LED2 */ + gd_eval_led_on(LED2); + data = 1; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/gd32vf103_it.h new file mode 100644 index 0000000..d54f28c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/gd32vf103_it.h @@ -0,0 +1,45 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ + +/* this function handles ADC0_1 exception */ +void ADC0_1_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/main.c new file mode 100644 index 0000000..bfbcfba --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/main.c @@ -0,0 +1,165 @@ +/*! + \file main.c + \brief ADC analog watchdog + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include +#include "gd32vf103v_eval.h" + + +#define BOARD_ADC_CHANNEL ADC_CHANNEL_13 +#define ADC_GPIO_PORT GPIOC +#define ADC_GPIO_PIN GPIO_PIN_3 + +int data; +uint16_t adc_value; + +void rcu_config(void); +void gpio_config(void); +void eclic_config(void); +void adc_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ + +int main(void) +{ + /* system clocks configuration */ + rcu_config(); + /* GPIO configuration */ + gpio_config(); + /* eclic configuration */ + eclic_config(); + /* ADC configuration */ + adc_config(); + + while(1){ + adc_value = adc_regular_data_read(ADC1); + if(1 == data){ + /* turn off LED2 */ + data = 0; + delay_1ms(3000); + gd_eval_led_off(LED2); + } + } +} + +/*! + \brief configure the different system clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOC clock */ + rcu_periph_clock_enable(RCU_GPIOC); + /* enable ADC1 clock */ + rcu_periph_clock_enable(RCU_ADC1); + /* config ADC clock */ + rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* configure led GPIO */ + gd_eval_led_init(LED2); + /* config the GPIO as analog mode */ + gpio_init(ADC_GPIO_PORT, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, ADC_GPIO_PIN); +} + +/*! + \brief configure interrupt priority + \param[in] none + \param[out] none + \retval none +*/ +void eclic_config(void) +{ + eclic_global_interrupt_enable(); + eclic_irq_enable(ADC0_1_IRQn, 2, 0); +} + +/*! + \brief configure the ADC peripheral + \param[in] none + \param[out] none + \retval none +*/ +void adc_config(void) +{ + /* reset ADC */ + adc_deinit(ADC1); + /* ADC mode config */ + adc_mode_config(ADC_MODE_FREE); + /* ADC contineous function enable */ + adc_special_function_config(ADC1, ADC_CONTINUOUS_MODE, ENABLE); + /* ADC data alignment config */ + adc_data_alignment_config(ADC1, ADC_DATAALIGN_RIGHT); + /* ADC channel length config */ + adc_channel_length_config(ADC1, ADC_REGULAR_CHANNEL, 1); + + /* ADC regular channel config */ + adc_regular_channel_config(ADC1, 0, BOARD_ADC_CHANNEL, ADC_SAMPLETIME_55POINT5); + /* ADC trigger config */ + adc_external_trigger_source_config(ADC1, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); + adc_external_trigger_config(ADC1, ADC_REGULAR_CHANNEL, ENABLE); + + /* ADC analog watchdog threshold config */ + adc_watchdog_threshold_config(ADC1, 0x0400, 0x0A00); + /* ADC analog watchdog single channel config */ + adc_watchdog_single_channel_enable(ADC1, BOARD_ADC_CHANNEL); + /* ADC interrupt config */ + adc_interrupt_flag_clear(ADC1, ADC_INT_FLAG_WDE); + adc_interrupt_enable(ADC1, ADC_INT_WDE); + + /* enable ADC interface */ + adc_enable(ADC1); + delay_1ms(1); + /* ADC calibration and reset calibration */ + adc_calibration_enable(ADC1); + + /* ADC software trigger enable */ + adc_software_trigger_enable(ADC1, ADC_REGULAR_CHANNEL); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/readme.txt new file mode 100644 index 0000000..8b78749 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/readme.txt @@ -0,0 +1,45 @@ +/*! + \file readme.txt + \brief description of the ADC analog watchdog example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-1.0 board, it shows how to use the ADC analog +watchdog to guard continuously an ADC channel. The ADC is configured in continuous mode, +PC3 is chosen as analog input pin. + + Change the VR1 on the GD32VF103V-EVAL-1.0 board, measure TP2 pad on the GD32VF103V-EVAL board, +when the channe113 converted value is over the programmed analog watchdog high threshold (value +0x0A00) or below the analog watchdog low threshold(value 0x0400), an WDE interrupt will occur, +and LED2 will be on. When the channe113 converted value is in safe range(among 0x0400 and 0x0A00), +the LED2 will be off. + + The analog input pin should be configured to AIN mode. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/systick.c new file mode 100644 index 0000000..d891c3b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/systick.h new file mode 100644 index 0000000..9a74c22 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/ADC1_analog_watchdog/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/main.c new file mode 100644 index 0000000..b968611 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/main.c @@ -0,0 +1,143 @@ +/*! + \file main.c + \brief Oversample_shift + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include +#include "gd32vf103v_eval.h" + +#define BOARD_ADC_CHANNEL ADC_CHANNEL_13 +#define ADC_GPIO_PORT GPIOC +#define ADC_GPIO_PIN GPIO_PIN_3 + +uint16_t adc_value = 0; + +void rcu_config(void); +void gpio_config(void); +void adc_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ + +int main(void) +{ + /* system clocks configuration */ + rcu_config(); + /* GPIO configuration */ + gpio_config(); + /* ADC configuration */ + adc_config(); + /* configures COM port */ + gd_eval_com_init(EVAL_COM0); + + adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); + + while(1){ + + while(SET != adc_flag_get(ADC0, ADC_FLAG_EOC)); + adc_flag_clear(ADC0, ADC_FLAG_EOC); + + adc_value = ADC_RDATA(ADC0); + printf("16 times sample, 4 bits shift: 0x%x\r\n", adc_value); + delay_1ms(1000); + } +} + +/*! + \brief configure the different system clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOC clock */ + rcu_periph_clock_enable(RCU_GPIOC); + /* enable ADC clock */ + rcu_periph_clock_enable(RCU_ADC0); + /* config ADC clock */ + rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* config the GPIO as analog mode */ + gpio_init(ADC_GPIO_PORT, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, ADC_GPIO_PIN); +} + +/*! + \brief configure the ADC peripheral + \param[in] none + \param[out] none + \retval none +*/ +void adc_config(void) +{ + /* reset ADC */ + adc_deinit(ADC0); + /* ADC mode config */ + adc_mode_config(ADC_MODE_FREE); + /* ADC contineous function enable */ + adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE); + /* ADC data alignment config */ + adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); + /* ADC channel length config */ + adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1); + + /* ADC regular channel config */ + adc_regular_channel_config(ADC0, 0, BOARD_ADC_CHANNEL, ADC_SAMPLETIME_55POINT5); + /* ADC trigger config */ + adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); + adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); + + /* 16 times sample, 4 bits shift */ + adc_oversample_mode_config(ADC0, ADC_OVERSAMPLING_ALL_CONVERT, ADC_OVERSAMPLING_SHIFT_4B, ADC_OVERSAMPLING_RATIO_MUL16); + adc_oversample_mode_enable(ADC0); + + /* enable ADC interface */ + adc_enable(ADC0); + delay_1ms(1); + /* ADC calibration and reset calibration */ + adc_calibration_enable(ADC0); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/readme.txt new file mode 100644 index 0000000..aa7cd57 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/readme.txt @@ -0,0 +1,42 @@ +/*! + \file readme.txt + \brief description of the ADC oversample shift example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-1.0 board, it shows how to use +the function of oversample and shift. In this demo, 16 times ratio of +oversample and 4 bits shift are configured. PC3(channel13) is chosen as +analog input pin. The ADC conversion begins by software, the converted +data is printed by USART. + + The analog input pin should configured to analog mode. + JP5 and JP6 jump to USART. \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/systick.c new file mode 100644 index 0000000..7380933 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/systick.h new file mode 100644 index 0000000..588ca61 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Oversample_shift/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/main.c new file mode 100644 index 0000000..c2f52f9 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/main.c @@ -0,0 +1,140 @@ +/*! + \file main.c + \brief Resolution + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include +#include "gd32vf103v_eval.h" + +#define BOARD_ADC_CHANNEL ADC_CHANNEL_13 +#define ADC_GPIO_PORT GPIOC +#define ADC_GPIO_PIN GPIO_PIN_3 + +uint16_t adc_value; + +void rcu_config(void); +void gpio_config(void); +void adc_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* system clocks configuration */ + rcu_config(); + /* GPIO configuration */ + gpio_config(); + /* configures COM port */ + gd_eval_com_init(EVAL_COM0); + + /* ADC configuration */ + adc_config(); + adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); + + while(1){ + while(SET != adc_flag_get(ADC0, ADC_FLAG_EOC)); + adc_flag_clear(ADC0, ADC_FLAG_EOC); + + adc_value = ADC_RDATA(ADC0); + printf("6B: 0x%x\r\n", adc_value); + delay_1ms(500); + } +} + +/*! + \brief configure the different system clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOC clock */ + rcu_periph_clock_enable(RCU_GPIOC); + /* enable ADC clock */ + rcu_periph_clock_enable(RCU_ADC0); + /* config ADC clock */ + rcu_adc_clock_config(RCU_CKADC_CKAPB2_DIV8); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* config the GPIO as analog mode */ + gpio_init(ADC_GPIO_PORT, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, ADC_GPIO_PIN); +} + +/*! + \brief configure the ADC peripheral + \param[in] none + \param[out] none + \retval none +*/ +void adc_config(void) +{ + /* reset ADC */ + adc_deinit(ADC0); + /* ADC mode config */ + adc_mode_config(ADC_MODE_FREE); + /* ADC resolusion 6B */ + printf("\r\nresolusion 6B:\r\n"); + adc_resolution_config(ADC0, ADC_RESOLUTION_6B); + /* ADC contineous function enable */ + adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE); + /* ADC trigger config */ + adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); + /* ADC data alignment config */ + adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); + /* ADC channel length config */ + adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1); + + /* ADC regular channel config */ + adc_regular_channel_config(ADC0, 0, BOARD_ADC_CHANNEL, ADC_SAMPLETIME_55POINT5); + adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); + + /* enable ADC interface */ + adc_enable(ADC0); + delay_1ms(1); + /* ADC calibration and reset calibration */ + adc_calibration_enable(ADC0); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/readme.txt new file mode 100644 index 0000000..12a1445 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/readme.txt @@ -0,0 +1,41 @@ +/*! + \file readme.txt + \brief description of the ADC resolution demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-1.0 board, it shows how to use +the function of programmble resolusion. In this demo, 6B resolusion +is configured. PC3(channel13) is chosen as analog input pin. The ADC +conversion begins by software, the converted data is printed by USART. + + The analog input pin should configured to analog mode. + JP5 and JP6 jump to USART. \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/systick.c new file mode 100644 index 0000000..7380933 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/systick.h new file mode 100644 index 0000000..588ca61 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/ADC/Resolution/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Backup_Data/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Backup_Data/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Backup_Data/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Backup_Data/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Backup_Data/main.c new file mode 100644 index 0000000..b873a2d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Backup_Data/main.c @@ -0,0 +1,148 @@ +/*! + \file main.c + \brief backup data register + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#define BKP_DATA_REG_NUM 42 + +void led_config(void); +void write_backup_register(uint16_t data); +uint32_t check_backup_register(uint16_t data); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* led configuration and turn on all led */ + led_config(); + /* PMU lock enable */ + rcu_periph_clock_enable(RCU_PMU); + /* BKP clock enable */ + rcu_periph_clock_enable(RCU_BKPI); + /* enable write access to the registers in backup domain */ + pmu_backup_write_enable(); + /* clear the bit flag of tamper event */ + bkp_flag_clear(); + + /* check if the POR/PDR reset flag is set */ + if(RESET != rcu_flag_get(RCU_FLAG_PORRST)){ + /* clear the RCU all reset flags */ + rcu_all_reset_flag_clear(); + /* turn on LED3 */ + gd_eval_led_on(LED3); + + /* check if backup data registers has been written */ + if(0x00 == check_backup_register(0x1226)){ + /* Backup data registers values are correct */ + /* turn on LED1 */ + gd_eval_led_on(LED1); + }else{ + /* backup data registers values are not correct or they are not written*/ + /* write data to backup data registers */ + write_backup_register(0x1226); + /* turn on LED2 */ + gd_eval_led_on(LED2); + } + } + /* turn on LED4 */ + gd_eval_led_on(LED4);; + while(1){ + } +} + +/*! + \brief write data to backup DATAx registers + \param[in] data: the data to be written to backup data registers + \arg 0x0000-0xFFFF + \param[out] none + \retval none +*/ +void write_backup_register(uint16_t data) +{ + uint32_t temp = 0; + /* write data to backup registers */ + for (temp = 0; temp < BKP_DATA_REG_NUM; temp++){ + if(temp < 10){ + BKP_DATA0_9(temp) = data + (temp * 0x50); + }else{ + BKP_DATA10_41(temp) = data + (temp * 0x50); + } + } +} + +/*! + \brief check if the backup DATAx registers values are correct or not + \param[in] data: the data to be written to backup data registers + \arg 0x0000-0xFFFF + \param[out] none + \retval the number of data register +*/ +uint32_t check_backup_register(uint16_t data) +{ + uint32_t temp = 0; + /* check the data of backup registers */ + for(temp = 0; temp < BKP_DATA_REG_NUM; temp++){ + if(temp < 10){ + /* get data from data register 0-9 */ + if(data + (temp * 0x50) != BKP_DATA_GET(BKP_DATA0_9(temp))){ + return temp+1; + } + }else{ + /* get data from data register 10-41 */ + if(data + (temp * 0x50) != BKP_DATA_GET(BKP_DATA10_41(temp))){ + return temp+1; + } + } + } + return 0; +} + +/*! + \brief configure led + \param[in] none + \param[out] none + \retval none +*/ +void led_config(void) +{ + gd_eval_led_init(LED1); + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Backup_Data/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Backup_Data/readme.txt new file mode 100644 index 0000000..e11732b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Backup_Data/readme.txt @@ -0,0 +1,62 @@ +/*! + \file readme.txt + \brief description of the Backup_Data demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to store user data +in the Backup data registers. + As the Backup domain still powered by VBAT when VDD is switched off, its contents +are not lost if a battery is connected to VBAT pin. When JP0 is connected to Vmcu, +the board is powered up, LED2, LED3 and LED4 are on. After an external reset, LED2 +and LED3 are off, LED4 is on. Change JP0 connected to external battery, the board is +executed a power-down and power-up operation, LED1, LED3 and LED4 are on. + + The program behaves as follows: + 1. After startup the program checks if the board has been powered up. If yes, the + values in the BKP data registers are checked: + - if a battery is connected to the VBAT pin, the values in the BKP data registers + are retained + - if no battery is connected to the VBAT pin, the values in the BKP data registers + are lost + 2. After an external reset, the BKP data registers contents are not checked. + + Four LEDs are used to show the system state as follows: + 1. LED3 on / LED1 on: a POR/PDR reset occurred and the values in the BKP data + registers are correct + 2. LED3 on / LED2 on: a POR/PDR reset occurred and the values in the BKP data + registers are not correct or they have not yet been programmed (if it is the + first time the program is executed) + 3. LED3 off / LED1 off / LED3 off: no POR/PDR reset occurred + 4. LED4 on: program running + + BT1 should have a 3.3V battery, JP0 can change the VBAT source. + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/gd32vf103_it.c new file mode 100644 index 0000000..dfcf293 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/gd32vf103_it.c @@ -0,0 +1,69 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" +#include "gd32vf103v_eval.h" + +extern uint32_t is_backup_register_clear(void); + +/*! + \brief this function handles SysTick exception + \param[in] none + \param[out] none + \retval none +*/ +void TAMPER_IRQHandler(void) +{ + if(RESET != bkp_interrupt_flag_get()){ + /* a tamper detection event occurred */ + /* check if backup data registers are cleared */ + if(0 == is_backup_register_clear()){ + /* backup data registers are cleared */ + /* turn on LED3 */ + gd_eval_led_on(LED3); + }else{ + /* backup data registers are not cleared */ + /* turn on LED4 */ + gd_eval_led_on(LED4); + } + /* clear the interrupt bit flag of tamper interrupt */ + bkp_interrupt_flag_clear(); + /* disable the tamper pin */ + bkp_interrupt_disable(); + /* enable the tamper pin */ + bkp_interrupt_enable(); + /* tamper pin active level set */ + bkp_tamper_active_level_set(TAMPER_PIN_ACTIVE_LOW); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/gd32vf103_it.h new file mode 100644 index 0000000..de12689 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/gd32vf103_it.h @@ -0,0 +1,44 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* TAMPER handle function */ +void TAMPER_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/main.c new file mode 100644 index 0000000..17af682 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/main.c @@ -0,0 +1,177 @@ +/*! + \file main.c + \brief tamper demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#define BKP_DATA_REG_NUM 42 + +void led_config(void); +void write_backup_register(uint16_t data); +uint32_t check_backup_register(uint16_t data); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* led configuration and turn on all led */ + led_config(); + /* ECLIC configuration */ + eclic_global_interrupt_enable(); + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1); + eclic_irq_enable(TAMPER_IRQn, 1, 0); + /* PMU lock enable */ + rcu_periph_clock_enable(RCU_PMU); + /* BKP clock enable */ + rcu_periph_clock_enable(RCU_BKPI); + + /* enable write access to the registers in backup domain */ + pmu_backup_write_enable(); + /* tamper pin active level set */ + bkp_tamper_active_level_set(TAMPER_PIN_ACTIVE_LOW); + /* tamper detection disable */ + bkp_tamper_detection_disable(); + /* disable the tamper interrupt */ + bkp_interrupt_disable(); + /* clear the bit flag of tamper event */ + bkp_flag_clear(); + /* configure the tamper pin active on low level, and enable the tamper pin */ + bkp_interrupt_enable(); + /* tamper detection enable */ + bkp_tamper_detection_enable(); + /* write data to backup DATAx registers */ + write_backup_register(0x1226); + + /* check if the written data are correct */ + if(0x00 == check_backup_register(0x1226)){ + /* turn on LED1 */ + gd_eval_led_on(LED1); + }else{ + /* turn on LED2 */ + gd_eval_led_on(LED2); + } + while(1){ + } +} + +/*! + \brief write data to backup DATAx registers + \param[in] data: the data to be written to backup data registers + \arg 0x0000-0xFFFF + \param[out] none + \retval none +*/ +void write_backup_register(uint16_t data) +{ + uint32_t temp = 0; + /* write data to backup data registers */ + for (temp = 0; temp < BKP_DATA_REG_NUM; temp++){ + if(temp < 10){ + BKP_DATA0_9(temp) = data + (temp * 0x50); + }else{ + BKP_DATA10_41(temp) = data + (temp * 0x50); + } + } +} + +/*! + \brief check if the backup DATAx registers values are correct or not + \param[in] data: the data to be written to backup data registers + \arg 0x0000-0xFFFF + \param[out] none + \retval the number of data register +*/ +uint32_t check_backup_register(uint16_t data) +{ + uint32_t temp = 0; + /* check the data of backup data registers */ + for(temp = 0; temp < BKP_DATA_REG_NUM; temp++){ + if(temp < 10){ + /* get data from data register 0-9 */ + if(data + (temp * 0x50) != BKP_DATA_GET(BKP_DATA0_9(temp))){ + return temp+1; + } + }else{ + /* get data from data register 10-41 */ + if(data + (temp * 0x50) != BKP_DATA_GET(BKP_DATA10_41(temp))){ + return temp+1; + } + } + } + return 0; +} + +/*! + \brief configure led + \param[in] none + \param[out] none + \retval none +*/ +void led_config(void) +{ + gd_eval_led_init(LED1); + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); +} + +/*! + \brief check if the backup data registers are clear or not + \param[in] none + \param[out] none + \retval the number of data register +*/ +uint32_t is_backup_register_clear(void) +{ + uint32_t temp = 0; + + for(temp = 0; temp < BKP_DATA_REG_NUM; temp++){ + if(temp < 10){ + /* check if the data of data register 0-9 is 0x0000 */ + if(0x0000 != BKP_DATA_GET(BKP_DATA0_9(temp))){ + return temp+1; + } + }else{ + /* check if the data of data register 10-41 is 0x0000 */ + if(0x0000 != BKP_DATA_GET(BKP_DATA10_41(temp))){ + return temp+1; + } + } + } + return 0; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/readme.txt new file mode 100644 index 0000000..df69718 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/BKP/Tamper/readme.txt @@ -0,0 +1,46 @@ +/*! + \file readme.txt + \brief description of tamper demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to write/read data +to/from backup data registers and demonstrates the tamper detection function. In +this demo, the TAMPER pin is configured active on low level. + After system start-up, it writes the data to all backup data registers, then check +whether the data were correctly written. If yes, LED1 is on, otherwise LED2 is on. +When the tamper key(TAMPER pin) is pressed, the backup data registers are reset and +the tamper interrupt is generated. In the corresponding ISR, it checks whether the +backup data registers are cleared or not. If yes, LED3 is on, otherwise LED4 is on. + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/gd32vf103_it.c new file mode 100644 index 0000000..e0e6a78 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/gd32vf103_it.c @@ -0,0 +1,96 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" + +extern ErrStatus test_flag_interrupt; + +/*! + \brief this function handles CAN0 RX1 exception + \param[in] none + \param[out] none + \retval none +*/ +void CAN0_RX1_IRQHandler(void) +{ + can_receive_message_struct receive_message; + /* initialize receive message */ + receive_message.rx_sfid = 0x00; + receive_message.rx_efid = 0x00; + receive_message.rx_ff = 0; + receive_message.rx_dlen = 0; + receive_message.rx_fi = 0; + receive_message.rx_data[0] = 0x00; + receive_message.rx_data[1] = 0x00; + + /* check the receive message */ + can_message_receive(CAN0, CAN_FIFO1, &receive_message); + + if((0x1234 == receive_message.rx_efid) && (CAN_FF_EXTENDED == receive_message.rx_ff) + && (2 == receive_message.rx_dlen) && (0xCADE == (receive_message.rx_data[1]<<8|receive_message.rx_data[0]))){ + test_flag_interrupt = SUCCESS; + }else{ + test_flag_interrupt = ERROR; + } +} + +/*! + \brief this function handles CAN1 RX0 exception + \param[in] none + \param[out] none + \retval none +*/ +void CAN1_RX1_IRQHandler(void) +{ + can_receive_message_struct receive_message; + /* initialize receive message */ + receive_message.rx_sfid = 0x00; + receive_message.rx_efid = 0x00; + receive_message.rx_ff = 0; + receive_message.rx_dlen = 0; + receive_message.rx_fi = 0; + receive_message.rx_data[0] = 0x00; + receive_message.rx_data[1] = 0x00; + + /* check the receive message */ + can_message_receive(CAN1, CAN_FIFO1, &receive_message); + + if((0x1234 == receive_message.rx_efid) && (CAN_FF_EXTENDED == receive_message.rx_ff) + && (2 == receive_message.rx_dlen) && (0xCADE == (receive_message.rx_data[1]<<8|receive_message.rx_data[0]))){ + test_flag_interrupt = SUCCESS; + }else{ + test_flag_interrupt = ERROR; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/gd32vf103_it.h new file mode 100644 index 0000000..b8aab3a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/gd32vf103_it.h @@ -0,0 +1,47 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* CAN0 RX0 handle function */ +void CAN0_RX0_IRQHandler(void); +/* CAN1 RX0 handle function */ +void CAN1_RX0_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/main.c new file mode 100644 index 0000000..98786f8 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/main.c @@ -0,0 +1,289 @@ +/*! + \file main.c + \brief communication_Loopback in normal mode + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* select CAN */ +#define CAN0_USED +//#define CAN1_USED + +#ifdef CAN0_USED + #define CANX CAN0 +#else + #define CANX CAN1 +#endif + +volatile ErrStatus test_flag; +volatile ErrStatus test_flag_interrupt; + +void clic_config(void); +void led_config(void); +ErrStatus can_loopback(void); +ErrStatus can_loopback_interrupt(void); +void can_loopback_init(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); + /* enable CAN clock */ + rcu_periph_clock_enable(RCU_CAN0); + rcu_periph_clock_enable(RCU_CAN1); + + /* configure CLIC */ + clic_config(); + + /* configure leds */ + led_config(); + /* set all the leds off */ + gd_eval_led_off(LED1); + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + gd_eval_led_off(LED4); + /* loopback of polling */ + test_flag = can_loopback(); + + if(SUCCESS == test_flag){ + /* loopback test is success */ + gd_eval_led_on(LED1); + gd_eval_led_on(LED2); + }else{ + /* loopback test is failed */ + gd_eval_led_off(LED1); + gd_eval_led_off(LED2); + } + /* loopback of interrupt */ + test_flag_interrupt = can_loopback_interrupt(); + + if(SUCCESS == test_flag_interrupt){ + /* interrupt loopback test is success */ + gd_eval_led_on(LED3); + gd_eval_led_on(LED4); + }else{ + /* interrupt loopback test is failed */ + gd_eval_led_off(LED3); + gd_eval_led_off(LED4); + } + while (1); +} + +/*! + \brief function for CAN loopback communication + \param[in] none + \param[out] none + \retval ErrStatus +*/ +ErrStatus can_loopback(void) +{ + can_trasnmit_message_struct transmit_message; + can_receive_message_struct receive_message; + uint32_t timeout = 0xFFFF; + uint8_t transmit_mailbox = 0; + /* initialize CAN */ + can_loopback_init(); + + /* initialize transmit message */ + can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &transmit_message); + transmit_message.tx_sfid = 0x11; + transmit_message.tx_ft = CAN_FT_DATA; + transmit_message.tx_ff = CAN_FF_STANDARD; + transmit_message.tx_dlen = 2; + transmit_message.tx_data[0] = 0xAB; + transmit_message.tx_data[1] = 0xCD; + + /* initialize receive message */ + can_struct_para_init(CAN_RX_MESSAGE_STRUCT, &receive_message); + + /* transmit message */ + transmit_mailbox = can_message_transmit(CANX, &transmit_message); + /* waiting for transmit completed */ + while((CAN_TRANSMIT_OK != can_transmit_states(CANX, transmit_mailbox)) && (0 != timeout)){ + timeout--; + } + timeout = 0xFFFF; + /* waiting for receive completed */ + while((can_receive_message_length_get(CANX, CAN_FIFO1) < 1) && (0 != timeout)){ + timeout--; + } + + /* initialize receive message*/ + receive_message.rx_sfid = 0x00; + receive_message.rx_ff = 0; + receive_message.rx_dlen = 0; + receive_message.rx_data[0] = 0x00; + receive_message.rx_data[1] = 0x00; + can_message_receive(CANX, CAN_FIFO1, &receive_message); + + /* check the receive message */ + if((0x11 == receive_message.rx_sfid) && (CAN_FF_STANDARD == receive_message.rx_ff) + && (2 == receive_message.rx_dlen) && (0xCDAB == (receive_message.rx_data[1]<<8|receive_message.rx_data[0]))){ + return SUCCESS; + }else{ + return ERROR; + } +} + +/*! + \brief function for CAN loopback interrupt communication + \param[in] none + \param[out] none + \retval ErrStatus +*/ +ErrStatus can_loopback_interrupt(void) +{ + can_trasnmit_message_struct transmit_message; + uint32_t timeout = 0x0000FFFF; + + /* initialize CAN and filter */ + can_loopback_init(); + + /* enable CAN receive FIFO1 not empty interrupt */ + can_interrupt_enable(CANX, CAN_INT_RFNE1); + + /* initialize transmit message */ + transmit_message.tx_sfid = 0; + transmit_message.tx_efid = 0x1234; + transmit_message.tx_ff = CAN_FF_EXTENDED; + transmit_message.tx_ft = CAN_FT_DATA; + transmit_message.tx_dlen = 2; + transmit_message.tx_data[0] = 0xDE; + transmit_message.tx_data[1] = 0xCA; + /* transmit a message */ + can_message_transmit(CANX, &transmit_message); + + /* waiting for receive completed */ + while((SUCCESS != test_flag_interrupt) && (0 != timeout)){ + timeout--; + } + if(0 == timeout){ + test_flag_interrupt = ERROR; + } + + /* disable CAN receive FIFO1 not empty interrupt */ + can_interrupt_disable(CANX, CAN_INTEN_RFNEIE1); + + return test_flag_interrupt; +} + +/*! + \brief initialize CAN and filter + \param[in] can_parameter + \arg can_parameter_struct + \param[in] can_filter + \arg can_filter_parameter_struct + \param[out] none + \retval none +*/ +void can_loopback_init(void) +{ + can_parameter_struct can_parameter; + can_filter_parameter_struct can_filter; + + can_struct_para_init(CAN_INIT_STRUCT, &can_parameter); + can_struct_para_init(CAN_FILTER_STRUCT, &can_filter); + + /* initialize CAN register */ + can_deinit(CANX); + + /* initialize CAN */ + can_parameter.time_triggered = DISABLE; + can_parameter.auto_bus_off_recovery = DISABLE; + can_parameter.auto_wake_up = DISABLE; + can_parameter.no_auto_retrans = DISABLE; + can_parameter.rec_fifo_overwrite = DISABLE; + can_parameter.trans_fifo_order = DISABLE; + can_parameter.working_mode = CAN_LOOPBACK_MODE; + /* configure baudrate to 125kbps */ + can_parameter.resync_jump_width = CAN_BT_SJW_1TQ; + can_parameter.time_segment_1 = CAN_BT_BS1_5TQ; + can_parameter.time_segment_2 = CAN_BT_BS2_3TQ; + can_parameter.prescaler = 48; + can_init(CANX, &can_parameter); + + /* initialize filter */ +#ifdef CAN0_USED + /* CAN0 filter number */ + can_filter.filter_number = 0; +#else + /* CAN1 filter number */ + can_filter.filter_number = 15; +#endif + /* initialize filter */ + can_filter.filter_mode = CAN_FILTERMODE_MASK; + can_filter.filter_bits = CAN_FILTERBITS_32BIT; + can_filter.filter_list_high = 0x0000; + can_filter.filter_list_low = 0x0000; + can_filter.filter_mask_high = 0x0000; + can_filter.filter_mask_low = 0x0000; + can_filter.filter_fifo_number = CAN_FIFO1; + can_filter.filter_enable=ENABLE; + can_filter_init(&can_filter); +} + +/*! + \brief configure the nested vectored interrupt controller + \param[in] none + \param[out] none + \retval none +*/ +void clic_config(void) +{ + eclic_global_interrupt_enable(); + /* configure CAN0 CLIC */ + eclic_irq_enable(CAN0_RX1_IRQn,1,0); + /* configure CAN1 CLIC */ + eclic_irq_enable(CAN1_RX1_IRQn,1,0); +} + +/*! + \brief configure the leds + \param[in] none + \param[out] none + \retval none +*/ +void led_config(void) +{ + gd_eval_led_init(LED1); + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/readme.txt new file mode 100644 index 0000000..4fc2f5c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_Loopback/readme.txt @@ -0,0 +1,48 @@ +/*! + \file readme.txt + \brief description of the communication_Loopback demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL board, it shows how to set a communication +with the CAN in loopback mode. + + The example first performs a transmission and a reception of a standard data frame +by polling at 125 Kbps.If the received frame is successful, the LED1 and LED2 are on. +Otherwise,the LED1 and LED2 are off. Then, an extended data frame is transmitted at +125 Kbps. Reception is done in the interrupt handler when the message becomes pending +in the FIFO1. If the received frame is successful, the LED3 and LED4 are on. Otherwise, +the LED4 and LED5 are off. + + User can select CAN0 or CAN1 cell using the private defines in main.c. + + JP13,JP4 and JP16 must be fitted. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/gd32vf103_it.c new file mode 100644 index 0000000..17ae7b6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/gd32vf103_it.c @@ -0,0 +1,76 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" + +extern can_receive_message_struct receive_message; +extern FlagStatus can0_receive_flag; +extern FlagStatus can1_receive_flag; +extern FlagStatus can0_error_flag; +extern FlagStatus can1_error_flag; + +/*! + \brief this function handles CAN0 RX0 exception + \param[in] none + \param[out] none + \retval none +*/ +void CAN0_RX0_IRQHandler(void) +{ + /* check the receive message */ + can_message_receive(CAN0, CAN_FIFO0, &receive_message); + + if((0x300>>1 == receive_message.rx_sfid)&&(CAN_FF_STANDARD == receive_message.rx_ff)&&(2 == receive_message.rx_dlen)){ + can0_receive_flag = SET; + }else{ + can0_error_flag = SET; + } +} +/*! + \brief this function handles CAN1 RX0 exception + \param[in] none + \param[out] none + \retval none +*/ +void CAN1_RX0_IRQHandler(void) +{ + /* check the receive message */ + can_message_receive(CAN1, CAN_FIFO0, &receive_message); + + if((0x300>>1 == receive_message.rx_sfid)&&(CAN_FF_STANDARD == receive_message.rx_ff)&&(2 == receive_message.rx_dlen)){ + can1_receive_flag = SET; + }else{ + can1_error_flag = SET; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/gd32vf103_it.h new file mode 100644 index 0000000..b8aab3a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/gd32vf103_it.h @@ -0,0 +1,47 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* CAN0 RX0 handle function */ +void CAN0_RX0_IRQHandler(void); +/* CAN1 RX0 handle function */ +void CAN1_RX0_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/main.c new file mode 100644 index 0000000..294a5f2 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/main.c @@ -0,0 +1,301 @@ +/*! + \file main.c + \brief communication_among_CANS in normal mode + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* select CAN baudrate */ +/* 1MBps */ +#define CAN_BAUDRATE 1000 +/* 500kBps */ +/* #define CAN_BAUDRATE 500 */ +/* 250kBps */ +/* #define CAN_BAUDRATE 250 */ +/* 125kBps */ +/* #define CAN_BAUDRATE 125 */ +/* 100kBps */ +/* #define CAN_BAUDRATE 100 */ +/* 50kBps */ +/* #define CAN_BAUDRATE 50 */ +/* 20kBps */ +/* #define CAN_BAUDRATE 20 */ + +FlagStatus can0_receive_flag; +FlagStatus can1_receive_flag; +FlagStatus can0_error_flag; +FlagStatus can1_error_flag; +can_parameter_struct can_init_parameter; +can_filter_parameter_struct can_filter_parameter; +can_trasnmit_message_struct transmit_message; +can_receive_message_struct receive_message; + +void clic_config(void); +void led_config(void); +void can_gpio_config(void); +void can_config(can_parameter_struct can_parameter, can_filter_parameter_struct can_filter); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + can0_receive_flag = RESET; + can1_receive_flag = RESET; + can0_error_flag = RESET; + can1_error_flag = RESET; + + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); + + /* configure GPIO */ + can_gpio_config(); + + /* configure CLIC */ + clic_config(); + + /* configure USART */ + gd_eval_com_init(EVAL_COM0); + + /* configure Wakeup key or Tamper key */ + gd_eval_key_init(KEY_A, KEY_MODE_GPIO); + gd_eval_key_init(KEY_C, KEY_MODE_GPIO); + + printf("\r\nGD32VF103V dual CAN test, please press A key or C key to start communication!\r\n"); + /* configure leds */ + led_config(); + gd_eval_led_off(LED1); + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + gd_eval_led_off(LED4); + + /* initialize CAN and filter */ + can_config(can_init_parameter, can_filter_parameter); + /* enable can receive FIFO0 not empty interrupt */ + can_interrupt_enable(CAN0, CAN_INT_RFNE0); + can_interrupt_enable(CAN1, CAN_INT_RFNE0); + + /* initialize transmit message */ + transmit_message.tx_sfid = 0x300>>1; + transmit_message.tx_efid = 0x00; + transmit_message.tx_ft = CAN_FT_DATA; + transmit_message.tx_ff = CAN_FF_STANDARD; + transmit_message.tx_dlen = 2; + + while(1){ + /* test whether the A key is pressed */ + if(0 == gd_eval_key_state_get(KEY_A)){ + transmit_message.tx_data[0] = 0x55; + transmit_message.tx_data[1] = 0xAA; + printf("\r\n can0 transmit data:%x,%x \r\n", transmit_message.tx_data[0], transmit_message.tx_data[1]); + /* transmit message */ + can_message_transmit(CAN0, &transmit_message); + /* waiting for the A key up */ + while(0 == gd_eval_key_state_get(KEY_A)); + } + /* test whether the C key is pressed */ + if(0 == gd_eval_key_state_get(KEY_C)){ + transmit_message.tx_data[0] = 0xAA; + transmit_message.tx_data[1] = 0x55; + printf("\r\n can1 transmit data:%x,%x \r\n", transmit_message.tx_data[0], transmit_message.tx_data[1]); + /* transmit message */ + can_message_transmit(CAN1, &transmit_message); + /* waiting for the C key up */ + while(0 == gd_eval_key_state_get(KEY_C)); + } + /* CAN0 receive data correctly, the received data is printed */ + if(SET == can0_receive_flag){ + can0_receive_flag = RESET; + printf("\r\n can0 receive data:%x,%x \r\n", receive_message.rx_data[0], receive_message.rx_data[1]); + gd_eval_led_toggle(LED1); + } + /* CAN1 receive data correctly, the received data is printed */ + if(SET == can1_receive_flag){ + can1_receive_flag = RESET; + gd_eval_led_toggle(LED3); + printf("\r\n can1 receive data:%x,%x \r\n", receive_message.rx_data[0], receive_message.rx_data[1]); + } + /* CAN0 error */ + if(SET == can0_error_flag){ + can0_error_flag = RESET; + printf("\r\n can0 communication error \r\n"); + } + /* CAN1 error */ + if(SET == can1_error_flag){ + can1_error_flag = RESET; + printf("\r\n can1 communication error \r\n"); + } + } +} + +/*! + \brief initialize CAN and filter + \param[in] can_parameter + \arg can_parameter_struct + \param[in] can_filter + \arg can_filter_parameter_struct + \param[out] none + \retval none +*/ +void can_config(can_parameter_struct can_parameter, can_filter_parameter_struct can_filter) +{ + can_struct_para_init(CAN_INIT_STRUCT, &can_parameter); + can_struct_para_init(CAN_INIT_STRUCT, &can_filter); + /* initialize CAN register */ + can_deinit(CAN0); + can_deinit(CAN1); + + /* initialize CAN parameters */ + can_parameter.time_triggered = DISABLE; + can_parameter.auto_bus_off_recovery = DISABLE; + can_parameter.auto_wake_up = DISABLE; + can_parameter.no_auto_retrans = DISABLE; + can_parameter.rec_fifo_overwrite = DISABLE; + can_parameter.trans_fifo_order = DISABLE; + can_parameter.working_mode = CAN_NORMAL_MODE; + can_parameter.resync_jump_width = CAN_BT_SJW_1TQ; + can_parameter.time_segment_1 = CAN_BT_BS1_5TQ; + can_parameter.time_segment_2 = CAN_BT_BS2_3TQ; + + /* 1MBps */ +#if CAN_BAUDRATE == 1000 + can_parameter.prescaler = 6; + /* 500KBps */ +#elif CAN_BAUDRATE == 500 + can_parameter.prescaler = 12; + /* 250KBps */ +#elif CAN_BAUDRATE == 250 + can_parameter.prescaler = 24; + /* 125KBps */ +#elif CAN_BAUDRATE == 125 + can_parameter.prescaler = 48; + /* 100KBps */ +#elif CAN_BAUDRATE == 100 + can_parameter.prescaler = 60; + /* 50KBps */ +#elif CAN_BAUDRATE == 50 + can_parameter.prescaler = 120; + /* 20KBps */ +#elif CAN_BAUDRATE == 20 + can_parameter.prescaler = 300; +#else + #error "please select list can baudrate in private defines in main.c " +#endif + /* initialize CAN */ + can_init(CAN0, &can_parameter); + can_init(CAN1, &can_parameter); + + /* initialize filter */ + can_filter.filter_number=0; + can_filter.filter_mode = CAN_FILTERMODE_MASK; + can_filter.filter_bits = CAN_FILTERBITS_32BIT; + can_filter.filter_list_high = 0x3000; + can_filter.filter_list_low = 0x0000; + can_filter.filter_mask_high = 0x3000; + can_filter.filter_mask_low = 0x0000; + can_filter.filter_fifo_number = CAN_FIFO0; + can_filter.filter_enable = ENABLE; + + can_filter_init(&can_filter); + + /* CAN1 filter number */ + can_filter.filter_number = 15; + can_filter_init(&can_filter); +} + +/*! + \brief configure the nested vectored interrupt controller + \param[in] none + \param[out] none + \retval none +*/ +void clic_config(void) +{ + eclic_global_interrupt_enable(); + /* configure CAN0 CLIC */ + eclic_irq_enable(CAN0_RX0_IRQn,1,0); + + /* configure CAN1 CLIC */ + eclic_irq_enable(CAN1_RX0_IRQn,2,0); +} + +/*! + \brief configure the leds + \param[in] none + \param[out] none + \retval none +*/ +void led_config(void) +{ + gd_eval_led_init(LED1); + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); +} + +/*! + \brief configure GPIO + \param[in] none + \param[out] none + \retval none +*/ +void can_gpio_config(void) +{ + /* enable CAN clock */ + rcu_periph_clock_enable(RCU_CAN0); + rcu_periph_clock_enable(RCU_CAN1); + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_GPIOD); + rcu_periph_clock_enable(RCU_AF); + + /* configure CAN0 GPIO */ + gpio_init(GPIOD,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_0); + gpio_init(GPIOD,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1); + gpio_pin_remap_config(GPIO_CAN0_FULL_REMAP,ENABLE); + + /* configure CAN1 GPIO */ + gpio_init(GPIOB,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_5); + gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_6); + gpio_pin_remap_config(GPIO_CAN1_REMAP,ENABLE); +} + +/* retarget the C library printf function to the usart */ +int fputc(int ch, FILE *f) +{ + usart_data_transmit(EVAL_COM0, (uint8_t)ch); + while (RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE)); + return ch; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/readme.txt new file mode 100644 index 0000000..101e0ec --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_CANs/readme.txt @@ -0,0 +1,54 @@ +/*! + \file readme.txt + \brief description of the communication_among_CANS demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL board, it shows how to configure the +CAN0 and CAN1 peripherals to send and receive CAN frames in normal mode. Pressing +KEY_A key or KEY_C key: + + When KEY_A key is pressed, CAN0 sends a message to CAN1 and print it.when CAN1 +receives correctly this message,the receive data will be printedand LED3 toggles +one time. + + When KEY_C key is pressed, CAN1 sends a message to CAN0 and print it. When CAN0 +receives correctly this message,the receive data will be printed and LED1 toggles +one time. + + User can select one from the preconfigured CAN baud rates from the private +defines in main.c. These baudrates is correct only when the system clock frequency +is 108M. + + JP4,JP13 and JP16 must be fitted. + Connect JP14 CAN_L to JP15 CAN_L + Connect JP14 CAN_H to JP15 CAN_H diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/gd32vf103_it.c new file mode 100644 index 0000000..12813ef --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/gd32vf103_it.c @@ -0,0 +1,69 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" + +extern FlagStatus receive_flag; +extern can_receive_message_struct receive_message; + +/*! + \brief this function handles CAN0 RX0 exception + \param[in] none + \param[out] none + \retval none +*/ +void CAN0_RX1_IRQHandler(void) +{ + /* check the receive message */ + can_message_receive(CAN0, CAN_FIFO1, &receive_message); + if((0x321 == receive_message.rx_sfid)&&(CAN_FF_STANDARD == receive_message.rx_ff) && (1 == receive_message.rx_dlen)){ + receive_flag = SET; + } +} + +/*! + \brief this function handles CAN1 RX0 exception + \param[in] none + \param[out] none + \retval none +*/ +void CAN1_RX1_IRQHandler(void) +{ + /* check the receive message */ + can_message_receive(CAN1, CAN_FIFO1, &receive_message); + if((0x321 == receive_message.rx_sfid)&&(CAN_FF_STANDARD == receive_message.rx_ff) && (1 == receive_message.rx_dlen)){ + receive_flag = SET; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/gd32vf103_it.h new file mode 100644 index 0000000..b8aab3a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/gd32vf103_it.h @@ -0,0 +1,47 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* CAN0 RX0 handle function */ +void CAN0_RX0_IRQHandler(void); +/* CAN1 RX0 handle function */ +void CAN1_RX0_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/main.c new file mode 100644 index 0000000..62db549 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/main.c @@ -0,0 +1,263 @@ +/*! + \file main.c + \brief communication_among_Devices in normal mode + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* select can */ +#define CAN0_USED +//#define CAN1_USED + +#ifdef CAN0_USED + #define CANX CAN0 +#else + #define CANX CAN1 +#endif + +FlagStatus receive_flag; +uint8_t transmit_number = 0x0; +can_receive_message_struct receive_message; +can_trasnmit_message_struct transmit_message; + +void clic_config(void); +void led_config(void); +void gpio_config(void); +void can_networking_init(void); +void delay(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + receive_flag = RESET; + + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); + /* configure Tamper key */ + gd_eval_key_init(KEY_CET, KEY_MODE_GPIO); + /* configure GPIO */ + gpio_config(); + /* configure USART */ + gd_eval_com_init(EVAL_COM0); + /* configure CLIC */ + clic_config(); + /* configure leds */ + led_config(); + /* set all leds off */ + gd_eval_led_off(LED1); + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + gd_eval_led_off(LED4); + /* initialize CAN */ + can_networking_init(); + + /* enable CAN receive FIFO1 not empty interrupt */ + can_interrupt_enable(CANX, CAN_INT_RFNE1); + + /* initialize transmit message */ + can_struct_para_init(CAN_TX_MESSAGE_STRUCT, &transmit_message); + transmit_message.tx_sfid = 0x321; + transmit_message.tx_efid = 0x01; + transmit_message.tx_ft = CAN_FT_DATA; + transmit_message.tx_ff = CAN_FF_STANDARD; + transmit_message.tx_dlen = 1; + printf("\r\nplease press the CET key to transmit data!\r\n"); + + /* initialize receive message */ + can_struct_para_init(CAN_RX_MESSAGE_STRUCT, &receive_message); + + while(1){ + /* waiting for the CET key pressed */ + while(0 == gd_eval_key_state_get(KEY_CET)){ + /* if transmit_number is 0x10, set it to 0x00 */ + if(transmit_number == 0x10){ + transmit_number = 0x00; + }else{ + transmit_message.tx_data[0] = transmit_number++; + printf("\r\ntransmit data: %x\r\n", transmit_message.tx_data[0]); + /* transmit message */ + can_message_transmit(CANX, &transmit_message); + delay(); + /* waiting for CET key up */ + while(0 == gd_eval_key_state_get(KEY_CET)); + } + } + if(SET == receive_flag){ + gd_eval_led_toggle(LED2); + receive_flag = RESET; + printf("\r\nrecive data: %x\r\n", receive_message.rx_data[0]); + } + } +} + +/*! + \brief initialize CAN and filter + \param[in] can_parameter + \arg can_parameter_struct + \param[in] can_filter + \arg can_filter_parameter_struct + \param[out] none + \retval none +*/ +void can_networking_init(void) +{ + can_parameter_struct can_parameter; + can_filter_parameter_struct can_filter; + + can_struct_para_init(CAN_INIT_STRUCT, &can_parameter); + can_struct_para_init(CAN_FILTER_STRUCT, &can_filter); + + /* initialize CAN register */ + can_deinit(CANX); + + /* initialize CAN */ + can_parameter.time_triggered = DISABLE; + can_parameter.auto_bus_off_recovery = DISABLE; + can_parameter.auto_wake_up = DISABLE; + can_parameter.no_auto_retrans = DISABLE; + can_parameter.rec_fifo_overwrite = DISABLE; + can_parameter.trans_fifo_order = DISABLE; + can_parameter.working_mode = CAN_NORMAL_MODE; + can_parameter.resync_jump_width = CAN_BT_SJW_1TQ; + can_parameter.time_segment_1 = CAN_BT_BS1_5TQ; + can_parameter.time_segment_2 = CAN_BT_BS2_3TQ; + /* baudrate 1Mbps */ + can_parameter.prescaler = 6; + can_init(CANX, &can_parameter); + + /* initialize filter */ +#ifdef CAN0_USED + /* CAN0 filter number */ + can_filter.filter_number = 0; +#else + /* CAN1 filter number */ + can_filter.filter_number = 15; +#endif + /* initialize filter */ + can_filter.filter_mode = CAN_FILTERMODE_MASK; + can_filter.filter_bits = CAN_FILTERBITS_32BIT; + can_filter.filter_list_high = 0x0000; + can_filter.filter_list_low = 0x0000; + can_filter.filter_mask_high = 0x0000; + can_filter.filter_mask_low = 0x0000; + can_filter.filter_fifo_number = CAN_FIFO1; + can_filter.filter_enable = ENABLE; + can_filter_init(&can_filter); +} + +/*! + \brief configure the nested vectored interrupt controller + \param[in] none + \param[out] none + \retval none +*/ +void clic_config(void) +{ + eclic_global_interrupt_enable(); +#ifdef CAN0_USED + /* configure CAN0 CLIC */ + eclic_irq_enable(CAN0_RX1_IRQn,1,0); +#else + /* configure CAN1 CLIC */ + eclic_irq_enable(CAN1_RX1_IRQn,1,0); +#endif + +} + +/*! + \brief delay + \param[in] none + \param[out] none + \retval none +*/ +void delay(void) +{ + uint16_t nTime = 0x0000; + + for(nTime = 0; nTime < 0xFFFF; nTime++){ + } +} + +/*! + \brief configure the leds + \param[in] none + \param[out] none + \retval none +*/ +void led_config(void) +{ + gd_eval_led_init(LED1); + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); +} + +/*! + \brief configure GPIO + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* enable CAN clock */ + rcu_periph_clock_enable(RCU_CAN0); + rcu_periph_clock_enable(RCU_CAN1); + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_GPIOD); + rcu_periph_clock_enable(RCU_AF); + + /* configure CAN0 GPIO */ + gpio_init(GPIOD,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_0); + gpio_init(GPIOD,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_1); + gpio_pin_remap_config(GPIO_CAN0_FULL_REMAP,ENABLE); + + /* configure CAN1 GPIO */ + gpio_init(GPIOB,GPIO_MODE_IPU,GPIO_OSPEED_50MHZ,GPIO_PIN_5); + gpio_init(GPIOB,GPIO_MODE_AF_PP,GPIO_OSPEED_50MHZ,GPIO_PIN_6); + gpio_pin_remap_config(GPIO_CAN1_REMAP,ENABLE); +} + +/* retarget the C library printf function to the usart */ +int fputc(int ch, FILE *f) +{ + usart_data_transmit(EVAL_COM0, (uint8_t) ch); + while (RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE)); + return ch; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/readme.txt new file mode 100644 index 0000000..81bc23a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CAN/communication_among_Devices/readme.txt @@ -0,0 +1,49 @@ +/*! + \file readme.txt + \brief description of the communication_among_Devices demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL board, it shows how to configure the CAN +peripheral to send and receive CAN frames in normal mode.The frames are sent and print +transmit data by pressing GET Key. When the frames are received, the receive data +will be printed and the LED2 will toggle. + + This example is tested with at least two GD32VF103V-EVAL boards. The same program example +is loaded in all boards and connect CAN_L and CAN_H pin of CAN0 or CAN1 to bus for sending +and receiving frames. + + User can select CAN0 or CAN1 cell using the private defines in main.c. + + JP4,JP13 and JP16 must be fitted. + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CRC/CRC_calculate/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CRC/CRC_calculate/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CRC/CRC_calculate/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CRC/CRC_calculate/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CRC/CRC_calculate/main.c new file mode 100644 index 0000000..6600787 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CRC/CRC_calculate/main.c @@ -0,0 +1,71 @@ +/*! + \file main.c + \brief CRC calculate demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" +#include + +uint32_t val = 0, valcrc = 0; + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + val = (uint32_t)0xabcd1234; + + /* initialize the LED2 and LED3, turn off them */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + rcu_periph_clock_enable(RCU_CRC); + + /* reset the CRC data register and calculate the CRC of the value */ + crc_data_register_reset(); + valcrc = crc_single_data_calculate(val); + + if(0xf7018a40 == valcrc){ + gd_eval_led_on(LED2); + gd_eval_led_on(LED3); + } + + while (1){ + } +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CRC/CRC_calculate/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CRC/CRC_calculate/readme.txt new file mode 100644 index 0000000..d95e364 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/CRC/CRC_calculate/readme.txt @@ -0,0 +1,41 @@ +/*! + \file readme.txt + \brief description of CRC example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use CRC to +calculate the CRC value. + + In this demo, 1 CRC value is calculated for a 32-bit data. If the result is success, +turn on the LED2 and LED3. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/gd32vf103_it.c new file mode 100644 index 0000000..82db1f4 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/gd32vf103_it.c @@ -0,0 +1,54 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" + +/*! + \brief this function handles ADC interrupt + \param[in] none + \param[out] none + \retval none +*/ +void ADC0_1_IRQHandler(void) +{ + uint16_t adc_value; + if(adc_interrupt_flag_get(ADC0, ADC_INT_FLAG_EOC)){ + adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC); + adc_value = adc_regular_data_read(ADC0); + + dac_data_set(DAC0, DAC_ALIGN_12B_R, adc_value); + + dac_software_trigger_enable(DAC0); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/gd32vf103_it.h new file mode 100644 index 0000000..a6510fd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/gd32vf103_it.h @@ -0,0 +1,45 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ + +/* this function handles ADC0 and ADC1 interrupt */ +void ADC0_1_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/main.c new file mode 100644 index 0000000..23bde31 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/main.c @@ -0,0 +1,155 @@ +/*! + \file main.c + \brief DAC0 ADC convert demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +void rcu_config(void); +void gpio_config(void); +void eclic_config(void); +void adc_config(void); +void dac_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + rcu_config(); + gpio_config(); + eclic_config(); + adc_config(); + dac_config(); + + while(1){ + } +} + +/*! + \brief configure the RCU of peripherals + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable the clock of peripherals */ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOC); + rcu_periph_clock_enable(RCU_ADC0); + rcu_periph_clock_enable(RCU_DAC); +} + +/*! + \brief configure the related GPIO + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* config the GPIO as analog mode */ + gpio_init(GPIOC, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_3); + /* once enabled the DAC, the corresponding GPIO pin is connected to the DAC converter automatically */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4); +} + +/*! + \brief configure interrupt priority + \param[in] none + \param[out] none + \retval none +*/ +void eclic_config(void) +{ + eclic_global_interrupt_enable(); + eclic_irq_enable(ADC0_1_IRQn, 2, 0); +} + +/*! + \brief configure the ADC + \param[in] none + \param[out] none + \retval none +*/ +void adc_config(void) +{ + /* ADC continous function enable */ + adc_special_function_config(ADC0, ADC_CONTINUOUS_MODE, ENABLE); + /* ADC data alignment config */ + adc_data_alignment_config(ADC0, ADC_DATAALIGN_RIGHT); + /* ADC channel length config */ + adc_channel_length_config(ADC0, ADC_REGULAR_CHANNEL, 1); + /* ADC regular channel config */ + adc_regular_channel_config(ADC0, 0, ADC_CHANNEL_13, ADC_SAMPLETIME_55POINT5); + /* ADC external trigger enable */ + adc_external_trigger_config(ADC0, ADC_REGULAR_CHANNEL, ENABLE); + /* ADC trigger config */ + adc_external_trigger_source_config(ADC0, ADC_REGULAR_CHANNEL, ADC0_1_EXTTRIG_REGULAR_NONE); + + /* enable ADC interface */ + adc_enable(ADC0); + + /* ADC calibration and reset calibration */ + adc_calibration_enable(ADC0); + + /* ADC interrupt enable */ + adc_interrupt_flag_clear(ADC0, ADC_INT_FLAG_EOC); + adc_interrupt_enable(ADC0, ADC_INT_EOC); + + /* enable ADC software trigger */ + adc_software_trigger_enable(ADC0, ADC_REGULAR_CHANNEL); +} + +/*! + \brief configure the DAC + \param[in] none + \param[out] none + \retval none +*/ +void dac_config(void) +{ + dac_deinit(); + /* configure the DAC0 */ + dac_trigger_source_config(DAC0, DAC_TRIGGER_SOFTWARE); + dac_trigger_enable(DAC0); + dac_wave_mode_config(DAC0, DAC_WAVE_DISABLE); + dac_output_buffer_enable(DAC0); + + /* enable DAC0 for DAC0 */ + dac_enable(DAC0); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/readme.txt new file mode 100644 index 0000000..cec8b5b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_ADC_convert/readme.txt @@ -0,0 +1,37 @@ +/*! + \file readme.txt + \brief description of DAC0_ADC_convert example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use DAC0 to generate +a signal from ADC. In the ADC interrupt, ADC data transfer from ADC_RDATA to DAC0_R8DH. +The DAC0 output pin is configured PA4. The signal can be observed through the oscilloscope. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_DMA_convert/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_DMA_convert/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_DMA_convert/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_DMA_convert/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_DMA_convert/main.c new file mode 100644 index 0000000..5ab19fc --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_DMA_convert/main.c @@ -0,0 +1,158 @@ +/*! + \file main.c + \brief DAC0 DMA convert demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +#define CONVERT_NUM (10U) +#define DAC0_R8DH_ADDRESS (0x40007410) +const uint8_t convertarr[CONVERT_NUM] = {0x00, 0x33, 0x66, 0x99, 0xCC, 0xFF, 0xCC, 0x99, 0x66, 0x33}; + +void rcu_config(void); +void gpio_config(void); +void dma_config(void); +void dac_config(void); +void timer5_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + rcu_config(); + gpio_config(); + dma_config(); + dac_config(); + timer5_config(); + while (1){ + } +} + +/*! + \brief configure the RCU of peripherals + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable the clock of peripherals */ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_DMA1); + rcu_periph_clock_enable(RCU_DAC); + rcu_periph_clock_enable(RCU_TIMER5); +} + +/*! + \brief configure the related GPIO + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* once enabled the DAC, the corresponding GPIO pin is connected to the DAC converter automatically */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4); +} + +/*! + \brief configure the DMA + \param[in] none + \param[out] none + \retval none +*/ +void dma_config(void) +{ + dma_parameter_struct dma_struct; + /* clear all the interrupt flags */ + dma_flag_clear(DMA1, DMA_CH2, DMA_INTF_GIF); + dma_flag_clear(DMA1, DMA_CH2, DMA_INTF_FTFIF); + dma_flag_clear(DMA1, DMA_CH2, DMA_INTF_HTFIF); + dma_flag_clear(DMA1, DMA_CH2, DMA_INTF_ERRIF); + + /* configure the DMA1 channel 2 */ + dma_struct.periph_addr = DAC0_R8DH_ADDRESS; + dma_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_struct.memory_addr = (uint32_t)convertarr; + dma_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_struct.number = CONVERT_NUM; + dma_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init(DMA1, DMA_CH2, &dma_struct); + + dma_circulation_enable(DMA1, DMA_CH2); + dma_channel_enable(DMA1, DMA_CH2); +} + +/*! + \brief configure the DAC + \param[in] none + \param[out] none + \retval none +*/ +void dac_config(void) +{ + dac_deinit(); + /* configure the DAC0 */ + dac_trigger_source_config(DAC0, DAC_TRIGGER_T5_TRGO); + dac_trigger_enable(DAC0); + dac_wave_mode_config(DAC0, DAC_WAVE_DISABLE); + dac_output_buffer_disable(DAC0); + + /* enable DAC0 and DMA for DAC0 */ + dac_enable(DAC0); + dac_dma_enable(DAC0); +} + +/*! + \brief configure the TIMER5 + \param[in] none + \param[out] none + \retval none +*/ +void timer5_config(void) +{ + /* configure the TIMER5 */ + timer_prescaler_config(TIMER5, 0xF, TIMER_PSC_RELOAD_UPDATE); + timer_autoreload_value_config(TIMER5, 0xFF); + timer_master_output_trigger_source_select(TIMER5, TIMER_TRI_OUT_SRC_UPDATE); + + timer_enable(TIMER5); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_DMA_convert/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_DMA_convert/readme.txt new file mode 100644 index 0000000..a93f015 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_DMA_convert/readme.txt @@ -0,0 +1,38 @@ +/*! + \file readme.txt + \brief description of DAC0_DMA_convert example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use DAC0 to generate +a staircase-shaped signal. TIMER5 is chosen to trigger DAC0 and DMA is configured to transfer +data from memory to DAC0_R8DH. The DAC0 output pin is configured PA4. The signal can be +observed through the oscilloscope. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_EXTI_trigger/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_EXTI_trigger/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_EXTI_trigger/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_EXTI_trigger/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_EXTI_trigger/main.c new file mode 100644 index 0000000..9309be7 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_EXTI_trigger/main.c @@ -0,0 +1,126 @@ +/*! + \file main.c + \brief DAC0 in EXTI trigger mode demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +void rcu_config(void); +void gpio_config(void); +void dac_config(void); +void exti_line9_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + rcu_config(); + gpio_config(); + dac_config(); + exti_line9_config(); + + while (1){ + } +} + +/*! + \brief configure the EXTI interrupt line 9. PE9 is used for an example. + \param[in] none + \param[out] none + \retval none +*/ +void exti_line9_config(void) +{ + /* enable the key clock */ + rcu_periph_clock_enable(RCU_GPIOE); + rcu_periph_clock_enable(RCU_AF); + + /* configure button pin as input */ + gpio_init(GPIOE, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_9); + + /* connect key EXTI line to key GPIO pin */ + gpio_exti_source_select(GPIO_EVENT_PORT_GPIOE, GPIO_EVENT_PIN_9); + + /* configure key EXTI line */ + exti_init(EXTI_9, EXTI_EVENT, EXTI_TRIG_RISING); + exti_interrupt_flag_clear(EXTI_9); +} + +/*! + \brief configure the RCU of peripherals + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable the clock of peripherals */ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_DAC); +} + +/*! + \brief configure the related GPIO + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* once enabled the DAC, the corresponding GPIO pin is connected to the DAC converter automatically */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4); +} + +/*! + \brief configure the DAC + \param[in] none + \param[out] none + \retval none +*/ +void dac_config(void) +{ + dac_deinit(); + /* configure the DAC0 */ + dac_trigger_source_config(DAC0, DAC_TRIGGER_EXTI_9); + dac_trigger_enable(DAC0); + dac_wave_mode_config(DAC0, DAC_WAVE_MODE_LFSR); + dac_lfsr_noise_config(DAC0, DAC_LFSR_BITS11_0); + dac_output_buffer_disable(DAC0); + + /* enable DAC0 and set data */ + dac_enable(DAC0); + dac_data_set(DAC0, DAC_ALIGN_12B_R, 0); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_EXTI_trigger/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_EXTI_trigger/readme.txt new file mode 100644 index 0000000..eb43b14 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_EXTI_trigger/readme.txt @@ -0,0 +1,38 @@ +/*! + \file readme.txt + \brief description of DAC0_EXTI_trigger example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use EXTI line 9 +to trigger DAC0. The DAC0 output pin is configured PA4. Connect one key (PA0 for +example) and GPIO PE9 with Dupont line. Press the key (Wakeup for example) for many +times, the variations of the wave can be observed through the oscilloscope. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_LFSR_noise_mode/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_LFSR_noise_mode/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_LFSR_noise_mode/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_LFSR_noise_mode/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_LFSR_noise_mode/main.c new file mode 100644 index 0000000..97c9328 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_LFSR_noise_mode/main.c @@ -0,0 +1,119 @@ +/*! + \file main.c + \brief DAC0 in LFSR noise mode demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +void rcu_config(void); +void gpio_config(void); +void dac_config(void); +void timer5_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + rcu_config(); + gpio_config(); + dac_config(); + timer5_config(); + while (1){ + } +} + +/*! + \brief configure the RCU of peripherals + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable the clock of peripherals */ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_DAC); + rcu_periph_clock_enable(RCU_TIMER5); +} + +/*! + \brief configure the related GPIO + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* once enabled the DAC, the corresponding GPIO pin is connected to the DAC converter automatically */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4); +} + +/*! + \brief configure the DAC + \param[in] none + \param[out] none + \retval none +*/ +void dac_config(void) +{ + dac_deinit(); + /* configure the DAC0 */ + dac_trigger_source_config(DAC0, DAC_TRIGGER_T5_TRGO); + dac_trigger_enable(DAC0); + dac_wave_mode_config(DAC0, DAC_WAVE_MODE_LFSR); + dac_lfsr_noise_config(DAC0, DAC_LFSR_BITS10_0); + dac_output_buffer_disable(DAC0); + + /* enable DAC0 and set data */ + dac_enable(DAC0); + dac_data_set(DAC0, DAC_ALIGN_12B_R, 0x7F0); +} + +/*! + \brief configure the TIMER5 + \param[in] none + \param[out] none + \retval none +*/ +void timer5_config(void) +{ + /* configure the TIMER5 */ + timer_prescaler_config(TIMER5, 0xF, TIMER_PSC_RELOAD_UPDATE); + timer_autoreload_value_config(TIMER5, 0x1FF); + timer_master_output_trigger_source_select(TIMER5, TIMER_TRI_OUT_SRC_UPDATE); + + timer_enable(TIMER5); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_LFSR_noise_mode/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_LFSR_noise_mode/readme.txt new file mode 100644 index 0000000..c6385a2 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC0_LFSR_noise_mode/readme.txt @@ -0,0 +1,37 @@ +/*! + \file readme.txt + \brief description of DAC0_LFSR_noise_mode example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use DAC0 to generate +LFSR noise wave. TIMER5 is chosen to trigger DAC0. The DAC0 output pin is configured PA4. +The LFSR noise wave can be observed through the oscilloscope. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC1_triangle_noise_mode/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC1_triangle_noise_mode/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC1_triangle_noise_mode/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC1_triangle_noise_mode/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC1_triangle_noise_mode/main.c new file mode 100644 index 0000000..4758da0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC1_triangle_noise_mode/main.c @@ -0,0 +1,119 @@ +/*! + \file main.c + \brief DAC1 in triangle noise mode demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +void rcu_config(void); +void gpio_config(void); +void dac_config(void); +void timer6_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + rcu_config(); + gpio_config(); + dac_config(); + timer6_config(); + while (1){ + } +} + +/*! + \brief configure the RCU of peripherals + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable the clock of peripherals */ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_DAC); + rcu_periph_clock_enable(RCU_TIMER6); +} + +/*! + \brief configure the related GPIO + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* once enabled the DAC, the corresponding GPIO pin is connected to the DAC converter automatically */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_5); +} + +/*! + \brief configure the DAC + \param[in] none + \param[out] none + \retval none +*/ +void dac_config(void) +{ + dac_deinit(); + /* configure the DAC1 */ + dac_trigger_source_config(DAC1, DAC_TRIGGER_T6_TRGO); + dac_trigger_enable(DAC1); + dac_wave_mode_config(DAC1, DAC_WAVE_MODE_TRIANGLE); + dac_triangle_noise_config(DAC1, DAC_TRIANGLE_AMPLITUDE_2047); + dac_output_buffer_disable(DAC1); + + /* enable DAC1 and set data */ + dac_enable(DAC1); + dac_data_set(DAC1, DAC_ALIGN_12B_R, 0x7F0); +} + +/*! + \brief configure the TIMER6 + \param[in] none + \param[out] none + \retval none +*/ +void timer6_config(void) +{ + /* configure the TIMER6 */ + timer_prescaler_config(TIMER6, 0xF, TIMER_PSC_RELOAD_UPDATE); + timer_autoreload_value_config(TIMER6, 0x1FF); + timer_master_output_trigger_source_select(TIMER6, TIMER_TRI_OUT_SRC_UPDATE); + + timer_enable(TIMER6); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC1_triangle_noise_mode/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC1_triangle_noise_mode/readme.txt new file mode 100644 index 0000000..1b23753 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DAC1_triangle_noise_mode/readme.txt @@ -0,0 +1,37 @@ +/*! + \file readme.txt + \brief description of DAC1_triangle_noise_mode example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use DAC1 to generate +triangle noise wave. TIMER6 is chosen to trigger DAC1. The DAC1 output pin is configured +PA5. The triangle noise wave can be observed through the oscilloscope. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_independent_trigger_LFSR_noise/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_independent_trigger_LFSR_noise/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_independent_trigger_LFSR_noise/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_independent_trigger_LFSR_noise/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_independent_trigger_LFSR_noise/main.c new file mode 100644 index 0000000..269386d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_independent_trigger_LFSR_noise/main.c @@ -0,0 +1,145 @@ +/*! + \file main.c + \brief DAC concurrent mode independent trigger with different LFSR demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +void rcu_config(void); +void gpio_config(void); +void dac_config(void); +void timer5_config(void); +void timer6_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + rcu_config(); + gpio_config(); + dac_config(); + timer5_config(); + timer6_config(); + while (1){ + } +} + +/*! + \brief configure the RCU of peripherals + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable the clock of peripherals */ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_DAC); + rcu_periph_clock_enable(RCU_TIMER5); + rcu_periph_clock_enable(RCU_TIMER6); +} + +/*! + \brief configure the related GPIO + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* once enabled the DAC, the corresponding GPIO pin is connected to the DAC converter automatically */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5); +} + +/*! + \brief configure the DAC + \param[in] none + \param[out] none + \retval none +*/ +void dac_config(void) +{ + dac_deinit(); + /* configure the DAC0 */ + dac_trigger_source_config(DAC0, DAC_TRIGGER_T5_TRGO); + dac_trigger_enable(DAC0); + dac_wave_mode_config(DAC0, DAC_WAVE_MODE_LFSR); + dac_lfsr_noise_config(DAC0, DAC_LFSR_BITS9_0); + dac_output_buffer_disable(DAC0); + + /* configure the DAC1 */ + dac_trigger_source_config(DAC1, DAC_TRIGGER_T6_TRGO); + dac_trigger_enable(DAC1); + dac_wave_mode_config(DAC1, DAC_WAVE_MODE_LFSR); + dac_lfsr_noise_config(DAC1, DAC_LFSR_BITS10_0); + dac_output_buffer_disable(DAC1); + + /* enable DAC concurrent mode and set data */ + dac_concurrent_enable(); + dac_concurrent_data_set(DAC_ALIGN_12B_R, 0x7F0, 0x7F0); +} + +/*! + \brief configure the TIMER5 + \param[in] none + \param[out] none + \retval none +*/ +void timer5_config(void) +{ + /* configure the TIMER5 */ + timer_prescaler_config(TIMER5, 0xF, TIMER_PSC_RELOAD_UPDATE); + timer_autoreload_value_config(TIMER5, 0x1FF); + timer_master_output_trigger_source_select(TIMER5, TIMER_TRI_OUT_SRC_UPDATE); + + timer_enable(TIMER5); +} + +/*! + \brief configure the TIMER6 + \param[in] none + \param[out] none + \retval none +*/ +void timer6_config(void) +{ + /* configure the TIMER6 */ + timer_prescaler_config(TIMER6, 0xF, TIMER_PSC_RELOAD_UPDATE); + timer_autoreload_value_config(TIMER6, 0x1FF); + timer_master_output_trigger_source_select(TIMER6, TIMER_TRI_OUT_SRC_UPDATE); + + timer_enable(TIMER6); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_independent_trigger_LFSR_noise/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_independent_trigger_LFSR_noise/readme.txt new file mode 100644 index 0000000..ef3b89a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_independent_trigger_LFSR_noise/readme.txt @@ -0,0 +1,39 @@ +/*! + \file readme.txt + \brief description of DACC_independent_trigger_LFSR_noise example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use DAC concurrent mode +independent trigger to generate LFSR noise wave with different configurations. TIMER5 is +chosen to trigger DAC0. TIMER6 is chosen to trigger DAC1. The DAC0 output pin is configured +PA4 and DAC1 output pin is configured PA5. The LFSR noise wave can be observed through the +oscilloscope. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_output_voltage/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_output_voltage/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_output_voltage/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_output_voltage/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_output_voltage/main.c new file mode 100644 index 0000000..efb55be --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_output_voltage/main.c @@ -0,0 +1,106 @@ +/*! + \file main.c + \brief DAC concurrent mode output voltage demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +#define DAC_OUT_VAL0 0x7FF0 +#define DAC_OUT_VAL1 0x1FF0 + +void rcu_config(void); +void gpio_config(void); +void dac_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + rcu_config(); + gpio_config(); + dac_config(); + while (1){ + } +} + +/*! + \brief configure the RCU of peripherals + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable the clock of peripherals */ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_DAC); +} + +/*! + \brief configure the related GPIO + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* once enabled the DAC, the corresponding GPIO pin is connected to the DAC converter automatically */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5); +} + +/*! + \brief configure the DAC + \param[in] none + \param[out] none + \retval none +*/ +void dac_config(void) +{ + dac_deinit(); + /* configure the DAC0 */ + dac_trigger_disable(DAC0); + dac_wave_mode_config(DAC0, DAC_WAVE_DISABLE); + dac_output_buffer_enable(DAC0); + + /* configure the DAC1 */ + dac_trigger_disable(DAC1); + dac_wave_mode_config(DAC1, DAC_WAVE_DISABLE); + dac_output_buffer_enable(DAC1); + + /* enable DAC concurrent mode and set data */ + dac_concurrent_enable(); + dac_concurrent_data_set(DAC_ALIGN_12B_L, DAC_OUT_VAL0, DAC_OUT_VAL1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_output_voltage/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_output_voltage/readme.txt new file mode 100644 index 0000000..17b92d3 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_output_voltage/readme.txt @@ -0,0 +1,38 @@ +/*! + \file readme.txt + \brief description of DACC_output_voltage example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use DAC concurrent mode +output voltage. No trigger source is chosen to trigger DAC. The DAC0 output pin is configured +PA4 and DAC1 output pin is configured PA5. There are two different voltage in PA4 and PA5. The +voltage of PA4 is VREF/2 and the voltage of PA5 is VREF/8. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_simultaneous_trigger_triangle_noise/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_simultaneous_trigger_triangle_noise/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_simultaneous_trigger_triangle_noise/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_simultaneous_trigger_triangle_noise/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_simultaneous_trigger_triangle_noise/main.c new file mode 100644 index 0000000..093e359 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_simultaneous_trigger_triangle_noise/main.c @@ -0,0 +1,126 @@ +/*! + \file main.c + \brief DAC concurrent mode simultaneous trigger with same triangle wave demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +void rcu_config(void); +void gpio_config(void); +void dac_config(void); +void timer5_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + rcu_config(); + gpio_config(); + dac_config(); + timer5_config(); + while (1){ + } +} + +/*! + \brief configure the RCU of peripherals + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable the clock of peripherals */ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_DAC); + rcu_periph_clock_enable(RCU_TIMER5); +} + +/*! + \brief configure the related GPIO + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* once enabled the DAC, the corresponding GPIO pin is connected to the DAC converter automatically */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5); +} + +/*! + \brief configure the DAC + \param[in] none + \param[out] none + \retval none +*/ +void dac_config(void) +{ + dac_deinit(); + /* configure the DAC0 */ + dac_trigger_source_config(DAC0, DAC_TRIGGER_T5_TRGO); + dac_trigger_enable(DAC0); + dac_wave_mode_config(DAC0, DAC_WAVE_MODE_TRIANGLE); + dac_triangle_noise_config(DAC0, DAC_TRIANGLE_AMPLITUDE_1023); + dac_output_buffer_disable(DAC0); + + /* configure the DAC1 */ + dac_trigger_source_config(DAC1, DAC_TRIGGER_T5_TRGO); + dac_trigger_enable(DAC1); + dac_wave_mode_config(DAC1, DAC_WAVE_MODE_TRIANGLE); + dac_triangle_noise_config(DAC1, DAC_TRIANGLE_AMPLITUDE_1023); + dac_output_buffer_disable(DAC1); + + /* enable DAC concurrent mode and set data */ + dac_concurrent_enable(); + dac_concurrent_data_set(DAC_ALIGN_12B_R, 0x7F0, 0x1F0); +} + +/*! + \brief configure the TIMER5 + \param[in] none + \param[out] none + \retval none +*/ +void timer5_config(void) +{ + /* configure the TIMER5 */ + timer_prescaler_config(TIMER5, 0xF, TIMER_PSC_RELOAD_UPDATE); + timer_autoreload_value_config(TIMER5, 0x1FF); + timer_master_output_trigger_source_select(TIMER5, TIMER_TRI_OUT_SRC_UPDATE); + + timer_enable(TIMER5); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_simultaneous_trigger_triangle_noise/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_simultaneous_trigger_triangle_noise/readme.txt new file mode 100644 index 0000000..2f94488 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_simultaneous_trigger_triangle_noise/readme.txt @@ -0,0 +1,38 @@ +/*! + \file readme.txt + \brief description of DACC_simultaneous_trigger_triangle_noise example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use DAC concurrent mode +simultaneous trigger to generate triangle noise wave with same amplitude. TIMER5 is chosen +to trigger DAC0 and DAC1. The DAC0 output pin is configured PA4 and DAC1 output pin is configured +PA5. The triangle noise wave can be observed through the oscilloscope. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_software_trigger_LFSR_noise/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_software_trigger_LFSR_noise/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_software_trigger_LFSR_noise/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_software_trigger_LFSR_noise/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_software_trigger_LFSR_noise/main.c new file mode 100644 index 0000000..6bdbef1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_software_trigger_LFSR_noise/main.c @@ -0,0 +1,108 @@ +/*! + \file main.c + \brief DAC concurrent mode software trigger LFSR noise wave demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +void rcu_config(void); +void gpio_config(void); +void dac_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + rcu_config(); + gpio_config(); + dac_config(); + while (1){ + dac_concurrent_software_trigger_enable(); + } +} + +/*! + \brief configure the RCU of peripherals + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable the clock of peripherals */ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_DAC); +} + +/*! + \brief configure the related GPIO + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* once enabled the DAC, the corresponding GPIO pin is connected to the DAC converter automatically */ + gpio_init(GPIOA, GPIO_MODE_AIN, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5); +} + +/*! + \brief configure the DAC + \param[in] none + \param[out] none + \retval none +*/ +void dac_config(void) +{ + dac_deinit(); + /* configure the DAC0 */ + dac_trigger_source_config(DAC0, DAC_TRIGGER_SOFTWARE); + dac_trigger_enable(DAC0); + dac_wave_mode_config(DAC0, DAC_WAVE_MODE_LFSR); + dac_lfsr_noise_config(DAC0, DAC_LFSR_BITS10_0); + dac_output_buffer_disable(DAC0); + + /* configure the DAC1 */ + dac_trigger_source_config(DAC1, DAC_TRIGGER_SOFTWARE); + dac_trigger_enable(DAC1); + dac_wave_mode_config(DAC1, DAC_WAVE_MODE_LFSR); + dac_lfsr_noise_config(DAC1, DAC_LFSR_BITS9_0); + dac_output_buffer_disable(DAC1); + + /* enable DAC concurrent mode and set data */ + dac_concurrent_enable(); + dac_concurrent_data_set(DAC_ALIGN_12B_R, 0x600, 0x500); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_software_trigger_LFSR_noise/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_software_trigger_LFSR_noise/readme.txt new file mode 100644 index 0000000..19c1978 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DAC/DACC_software_trigger_LFSR_noise/readme.txt @@ -0,0 +1,38 @@ +/*! + \file readme.txt + \brief description of DACC_software_trigger_LFSR_noise example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use DAC concurrent +mode software trigger to generate LFSR noise wave with different configurations. The +DAC0 output pin is configured PA4 and DAC1 output pin is configured PA5. The LFSR +noise wave can be observed through the oscilloscope. \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/main.c new file mode 100644 index 0000000..cf74600 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/main.c @@ -0,0 +1,137 @@ +/*! + \file main.c + \brief debug TIMER0 when the MCU is in debug mode + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include "systick.h" +#include + +void gpio_configuration(void); +void timer_configuration(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ + +int main(void) +{ + dbg_periph_disable(DBG_TIMER1_HOLD); + gpio_configuration(); + gd_eval_led_init(LED2); + timer_configuration(); + + /* keep TIMER1 counter when the mcu is in debug mode */ + dbg_periph_enable(DBG_TIMER1_HOLD); + + while(1){ + /* you can set breakpoint here, then look over the register in TIMER1 */ + delay_1ms(500); + /* you can set breakpoint here, then look over the register in TIMER1 */ + /* toggle LED2 output status every second */ + gd_eval_led_toggle(LED2); + } +} + +/*! + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none +*/ +void gpio_configuration(void) +{ + rcu_periph_clock_enable(RCU_AF); + rcu_periph_clock_enable(RCU_GPIOB); + gpio_pin_remap_config(GPIO_TIMER1_FULL_REMAP, ENABLE); + /* configure PB3/PB10/PB11(TIMER1 CH1/CH2/CH3) as alternate function */ + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3 | GPIO_PIN_10 | GPIO_PIN_11); +} + +/*! + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none +*/ +void timer_configuration(void) +{ + + /* TIMER1 configuration: generate 3 PWM signals with 3 different duty cycles: + TIMER1CLK = SystemCoreClock / 108 = 1MHz + TIMER1 channel 1 duty cycle = 4000/ 16000 = 25% + TIMER1 channel 2 duty cycle = 8000/ 16000 = 50% + TIMER1 channel 3 duty cycle = 12000/ 16000 = 75% */ + + timer_parameter_struct timer_initpara; + timer_oc_parameter_struct timer_ocintpara; + + rcu_periph_clock_enable(RCU_TIMER1); + + /* TIMER1 configuration */ + timer_deinit(TIMER1); + /* TIMER1 configuration */ + timer_initpara.prescaler = 107; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 15999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER1, &timer_initpara); + + /* CH1, CH2 and CH3 configuration in PWM mode */ + timer_ocintpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocintpara.outputstate = TIMER_CCX_ENABLE; + timer_channel_output_config(TIMER1, TIMER_CH_1, &timer_ocintpara); + timer_channel_output_config(TIMER1, TIMER_CH_2, &timer_ocintpara); + timer_channel_output_config(TIMER1, TIMER_CH_3, &timer_ocintpara); + + timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 4000); + timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE); + + timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_2, 8000); + timer_channel_output_mode_config(TIMER1, TIMER_CH_2, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE); + + timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_3, 12000); + timer_channel_output_mode_config(TIMER1, TIMER_CH_3, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_3, TIMER_OC_SHADOW_DISABLE); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER1); + timer_enable(TIMER1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/readme.txt new file mode 100644 index 0000000..1b0200c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/readme.txt @@ -0,0 +1,51 @@ +/*! + \file readme.txt + \brief description of the DBG demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows that, when the TIMER1_HOLD +bit in DBG control register(DBG_CTL) is set and the core halted, the TIMER1 counter stop +counting and the PWM outputs of all channels are stopped as well. It's benefit for debuging. + + The TIMER1 counter clock used is 1MHz. +The Three Duty cycles are computed as the following description: +The channel 1 duty cycle is set to 25%. +The channel 2 duty cycle is set to 50%. +The channel 3 duty cycle is set to 75%. + + Connect the TIMER1 pins to an oscilloscope and monitor the different waveforms: +- TIMER1_CH1 pin (PB3) +- TIMER1_CH2 pin (PB10) +- TIMER1_CH3 pin (PB11) + + In debug mode, when the core is stopped, the PWM outputs of all the channels of +TIMER1 will be stopped. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/systick.c new file mode 100644 index 0000000..d891c3b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/systick.h new file mode 100644 index 0000000..9a74c22 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DBG/Timer1_stop/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/gd32vf103_it.c new file mode 100644 index 0000000..ef096c8 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/gd32vf103_it.c @@ -0,0 +1,51 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" + +extern __IO uint32_t g_dmacomplete_flag; + +/*! + \brief this function handles DMA0_Channel0_IRQHandler interrupt + \param[in] none + \param[out] none + \retval none +*/ +void DMA0_Channel0_IRQHandler(void) +{ + if(dma_interrupt_flag_get(DMA0, DMA_CH0, DMA_INT_FLAG_FTF)){ + g_dmacomplete_flag = 1; + dma_interrupt_flag_clear(DMA0, DMA_CH0, DMA_INT_FLAG_G); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/gd32vf103_it.h new file mode 100644 index 0000000..c569dcf --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/gd32vf103_it.h @@ -0,0 +1,44 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* DMA0_Channel0 handle function */ +void DMA0_Channel0_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/main.c new file mode 100644 index 0000000..fbfe1fa --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/main.c @@ -0,0 +1,241 @@ +/*! + \file main.c + \brief flash to ram demo + + \version 2019-06-05, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" +#include +#include "riscv_encoding.h" + +#define TRANSFER_NUM 0x400 /* configuration value in bytes */ +#define FMC_PAGE_SIZE ((uint16_t)0x800) +#define BANK0_WRITE_START_ADDR ((uint32_t)0x08004000) + +void rcu_config(void); +void config_clic_irqs (void); +void led_config(void); + +__IO uint32_t g_dmacomplete_flag = 0; +uint8_t g_destbuf[TRANSFER_NUM]; +const uint32_t transdata = 0x3210ABCD; +fmc_state_enum fmcstatus = FMC_READY; + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + uint32_t i, count; + uint32_t *ptrd; + uint32_t address = 0x00; + ErrStatus access_flag = SUCCESS; + dma_parameter_struct dma_init_struct; + uint32_t wperror = 0; + + /* system clocks configuration */ + rcu_config(); + /* CLIC configuration */ + config_clic_irqs(); + /* LED configuration */ + led_config() ; + /* unlock the flash bank1 program erase controller */ + fmc_unlock(); + + /* define the number of page to be erased */ + count = TRANSFER_NUM / FMC_PAGE_SIZE; + /* clear all pending flags */ + fmc_flag_clear(FMC_FLAG_PGERR); + fmc_flag_clear(FMC_FLAG_WPERR); + fmc_flag_clear(FMC_FLAG_END); + + /* erase the flash pages */ + for(i = 0; i <= count; i++){ + fmcstatus = fmc_page_erase(BANK0_WRITE_START_ADDR + (FMC_PAGE_SIZE * i)); + wperror += (fmcstatus == FMC_WPERR); + fmc_flag_clear(FMC_FLAG_PGERR); + fmc_flag_clear(FMC_FLAG_WPERR); + fmc_flag_clear(FMC_FLAG_END); + } + + if(wperror != 0){ + while(1); + } + + /* unlock the flash bank1 program erase controller */ + fmc_lock(); + + ptrd = (uint32_t*)BANK0_WRITE_START_ADDR; + count = TRANSFER_NUM / sizeof(*ptrd); + + for(i = 0; i < count; i++){ + if(0xFFFFFFFF != *ptrd){ + access_flag = ERROR; + break; + } + ptrd++; + } + + if(ERROR == access_flag){ + while(1); + } + + /* unlock the flash bank1 program erase controller */ + fmc_unlock(); + /* clear all pending flags */ + fmc_flag_clear(FMC_FLAG_PGERR); + fmc_flag_clear(FMC_FLAG_WPERR); + fmc_flag_clear(FMC_FLAG_END); + + /* program flash bank1 */ + address = BANK0_WRITE_START_ADDR; + wperror = 0; + count = BANK0_WRITE_START_ADDR + TRANSFER_NUM; + + while(address < count){ + fmcstatus = fmc_word_program(address, transdata); + address = address + 4; + wperror += (FMC_WPERR == fmcstatus); + fmc_flag_clear(FMC_FLAG_PGERR); + fmc_flag_clear(FMC_FLAG_WPERR); + fmc_flag_clear(FMC_FLAG_END); + } + + if(wperror != 0){ + while(1); + } + + fmc_lock(); + + memset(g_destbuf ,0 ,TRANSFER_NUM); + + /* DMA0 channel0 initialize */ + dma_deinit(DMA0, DMA_CH0); + dma_struct_para_init(&dma_init_struct); + + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.memory_addr = (uint32_t)g_destbuf; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.number = TRANSFER_NUM; + dma_init_struct.periph_addr = (uint32_t)BANK0_WRITE_START_ADDR; + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_ENABLE; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA0, DMA_CH0, &dma_init_struct); + /* DMA0 channel0 mode configuration */ + dma_circulation_disable(DMA0, DMA_CH0); + dma_memory_to_memory_enable(DMA0, DMA_CH0); + /* DMA0 channel0 interrupt configuration */ + dma_interrupt_enable(DMA0, DMA_CH0, DMA_INT_FTF); + /* enable DMA0 transfer */ + dma_channel_enable(DMA0, DMA_CH0); + + /* wait DMA interrupt */ + while(0 == g_dmacomplete_flag); + + /* compare destdata with transdata */ + ptrd = (uint32_t *)g_destbuf; + count = TRANSFER_NUM / sizeof(*ptrd); + + for(i = 0; i < count; i++){ + if(transdata != *ptrd){ + access_flag = ERROR; + break; + } + ptrd++; + } + + /* transfer success */ + if(access_flag != ERROR){ + gd_eval_led_on(LED1); + gd_eval_led_on(LED2); + gd_eval_led_on(LED3); + gd_eval_led_on(LED4); + }else{ + gd_eval_led_on(LED1); + gd_eval_led_on(LED3); + } + + while(1){ + } +} + +/*! + \brief configure LED + \param[in] none + \param[out] none + \retval none +*/ +void led_config(void) +{ + gd_eval_led_init(LED1); + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); + + /* LED off */ + gd_eval_led_off(LED1); + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + gd_eval_led_off(LED4); +} + +/*! + \brief configure the different system clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable DMA clock */ + rcu_periph_clock_enable(RCU_DMA0); +} + +/*! + \brief configure the CLIC + \param[in] none + \param[out] none + \retval none +*/ +void config_clic_irqs (void) +{ + eclic_global_interrupt_enable(); + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1); + eclic_irq_enable(DMA0_Channel0_IRQn, 1, 1); + +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/readme.txt new file mode 100644 index 0000000..164057c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Flash_to_ram/readme.txt @@ -0,0 +1,48 @@ +/*! + \file readme.txt + \brief description of the DMA flash to ram example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it provides a description of how to +use DMA0 channel0 to transfer data buffer from FLASH memory to embedded SRAM memory. + + Before programming the flash addresses, an erase operation is performed firstly. +After the erase operation, a comparison between FLASH memory and 0xFFFFFFFF(Reset value) +is done to check that the FLASH memory has been correctly erased. + + Once the erase operation is finished correctly, the programming operation will be +performed by using the fmc_word_program function. The written data is transfered to +embedded SRAM memory by DMA0 Channel0. The transfer is started by enabling the DMA0 Channel0. +At the end of the transfer, a Transfer Complete interrupt is generated since it +is enabled. A comparison between the FLASH memory and embedded SRAM memory is done to +check that all data have been correctly transferred.If the result of comparison is passed, +LED1 to LED4 light up. Otherwise LED1 and LED3 light up. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_ram/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_ram/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_ram/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_ram/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_ram/main.c new file mode 100644 index 0000000..6a845e7 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_ram/main.c @@ -0,0 +1,200 @@ +/*! + \file main.c + \brief ram to ram demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" +#include + +#define DATANUM 16 + +__IO ErrStatus transferflag1 = ERROR; +__IO ErrStatus transferflag2 = ERROR; +__IO ErrStatus transferflag3 = ERROR; +__IO ErrStatus transferflag4 = ERROR; +uint8_t source_address[DATANUM]= {0x01,0x02,0x03,0x04,0x05,0x06,0x07,0x08, + 0x09,0x0A,0x0B,0x0C,0x0D,0x0E,0x0F,0x10}; +uint8_t destination_address1[DATANUM]; +uint8_t destination_address2[DATANUM]; +uint8_t destination_address3[DATANUM]; +uint8_t destination_address4[DATANUM]; + +void destbuf_init(void); +void led_config(void); +ErrStatus uc_data_compare(uint8_t* src, uint8_t* dst, uint16_t length); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + int i = 0; + dma_parameter_struct dma_init_struct; + + /* enable DMA clock */ + rcu_periph_clock_enable(RCU_DMA0); + /* initialize LED */ + led_config(); + /* all LED off */ + gd_eval_led_off(LED1); + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + gd_eval_led_off(LED4); + + destbuf_init(); + /* initialize DMA channel1 */ + dma_deinit(DMA0, DMA_CH1); + dma_struct_para_init(&dma_init_struct); + + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.memory_addr = (uint32_t)destination_address1; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.number = DATANUM; + dma_init_struct.periph_addr = (uint32_t)source_address; + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_ENABLE; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA0, DMA_CH1, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH1); + dma_memory_to_memory_enable(DMA0, DMA_CH1); + + /* initialize DMA channel2 */ + dma_deinit(DMA0, DMA_CH2); + dma_init_struct.memory_addr = (uint32_t)destination_address2; + dma_init(DMA0, DMA_CH2, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH2); + dma_memory_to_memory_enable(DMA0, DMA_CH2); + + /* initialize DMA channel3 */ + dma_deinit(DMA0, DMA_CH3); + dma_init_struct.memory_addr = (uint32_t)destination_address3; + dma_init(DMA0, DMA_CH3, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH3); + dma_memory_to_memory_enable(DMA0, DMA_CH3); + + /* initialize DMA channel4 */ + dma_deinit(DMA0, DMA_CH4); + dma_init_struct.memory_addr = (uint32_t)destination_address4; + dma_init(DMA0, DMA_CH4, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH4); + dma_memory_to_memory_enable(DMA0, DMA_CH4); + + /* enable DMA channel1~channel4 */ + dma_channel_enable(DMA0, DMA_CH1); + dma_channel_enable(DMA0, DMA_CH2); + dma_channel_enable(DMA0, DMA_CH3); + dma_channel_enable(DMA0, DMA_CH4); + + /* wait for DMA transfer complete */ + for(i = 0; i < 200; i++){ + } + /* compare the data of source_address with data of destination_address */ + transferflag1 = uc_data_compare(source_address, destination_address1, DATANUM); + transferflag2 = uc_data_compare(source_address, destination_address2, DATANUM); + transferflag3 = uc_data_compare(source_address, destination_address3, DATANUM); + transferflag4 = uc_data_compare(source_address, destination_address4, DATANUM); + + /* if DMA channel1 transfer success,light LED1 */ + if(SUCCESS == transferflag1){ + gd_eval_led_on(LED1); + } + /* if DMA channel2 transfer success,light LED2 */ + if(SUCCESS == transferflag2){ + gd_eval_led_on(LED2); + } + /* if DMA channel3 transfer success,light LED3 */ + if(SUCCESS == transferflag3){ + gd_eval_led_on(LED3); + } + /* if DMA channel4 transfer success,light LED4 */ + if(SUCCESS == transferflag4){ + gd_eval_led_on(LED4); + } + + while (1); +} + +/*! + \brief initialize destination buffer + \param[in] none + \param[out] none + \retval none +*/ +void destbuf_init(void) +{ + memset(destination_address1, 0, DATANUM); + memset(destination_address2, 0, DATANUM); + memset(destination_address3, 0, DATANUM); + memset(destination_address4, 0, DATANUM); +} + +/*! + \brief LEDs configure + \param[in] none + \param[out] none + \retval none +*/ +void led_config(void) +{ + gd_eval_led_init(LED1); + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); +} + +/*! + \brief data compare function + \param[in] src : source data + \param[in] dst : destination data + \param[in] length : the compare data length + \param[out] none + \retval ErrStatus : ERROR or SUCCESS +*/ +ErrStatus uc_data_compare(uint8_t* src, uint8_t* dst, uint16_t length) +{ + while (length--){ + if (*src++ != *dst++){ + return ERROR; + } + } + return SUCCESS; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_ram/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_ram/readme.txt new file mode 100644 index 0000000..fa33b9e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_ram/readme.txt @@ -0,0 +1,43 @@ +/*! + \file readme.txt + \brief description of DMA ram to ram + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it provides a description +of how to use DMA channel(1 to 4) to transfer data from RAM to RAM.DMA Channel(1 to 4) is +configured to transfer the contents of data buffer stored in "source_address" to the +reception buffer declared in RAM(destination_address1~destination_address4). + + The start of transfer is triggered by software. At the end of the transfer, a comparison +between the source and destination buffers is done to check that all data have been correctly +transferred.If transfer correctly the corresponding LED light.If transfer not correctly,the +corresponding LED is off. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/gd32vf103_it.c new file mode 100644 index 0000000..c70f1b0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/gd32vf103_it.c @@ -0,0 +1,51 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" + +extern volatile FlagStatus g_transfer_complete; + +/*! + \brief this function handles DMA_Channel3_IRQHandler interrupt + \param[in] none + \param[out] none + \retval none +*/ +void DMA0_Channel3_IRQHandler(void) +{ + if(dma_interrupt_flag_get(DMA0, DMA_CH3, DMA_INT_FLAG_FTF)){ + dma_interrupt_flag_clear(DMA0, DMA_CH3, DMA_INT_FLAG_G); + g_transfer_complete = SET; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/gd32vf103_it.h new file mode 100644 index 0000000..8f0e3e8 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/gd32vf103_it.h @@ -0,0 +1,44 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* DMA0_Channel3 handle function */ +void DMA0_Channel3_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/main.c new file mode 100644 index 0000000..9424b42 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/main.c @@ -0,0 +1,130 @@ +/*! + \file main.c + \brief ram to usart demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" +#include +#include "riscv_encoding.h" + +#define USART0_DATA_ADDRESS ((uint32_t)0x40013804) +#define ARRAYNUM(arr_name) (uint32_t)(sizeof(arr_name) / sizeof(*(arr_name))) + +uint8_t welcome[]="hi,this is a example: RAM_TO_USART by DMA !\n"; +volatile FlagStatus g_transfer_complete = RESET; + +void led_config(void); +void config_clic_irqs(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + dma_parameter_struct dma_init_struct; + /* enable DMA clock */ + rcu_periph_clock_enable(RCU_DMA0); + /* USART configure */ + gd_eval_com_init(EVAL_COM0); + /* CLIC configuration */ + config_clic_irqs(); + /* initialize LED */ + led_config(); + /* turn LED1 off */ + gd_eval_led_off(LED1); + + /* initialize DMA channel3 */ + dma_deinit(DMA0, DMA_CH3); + dma_struct_para_init(&dma_init_struct); + + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.memory_addr = (uint32_t)welcome; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.number = ARRAYNUM(welcome); + dma_init_struct.periph_addr = USART0_DATA_ADDRESS; + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA0, DMA_CH3, &dma_init_struct); + + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH3); + dma_memory_to_memory_disable(DMA0, DMA_CH3); + + /* USART DMA enable for transmission */ + usart_dma_transmit_config(USART0, USART_DENT_ENABLE); + + /* enable DMA transfer complete interrupt */ + dma_interrupt_enable(DMA0, DMA_CH3, DMA_INT_FTF); + + /* enable DMA channel3 */ + dma_channel_enable(DMA0, DMA_CH3); + + /* waiting for the transfer to complete*/ + while(RESET == g_transfer_complete){ + } + + /* light LED1 */ + gd_eval_led_on(LED1); + + while(1); +} + +/*! + \brief LED1 configuration + \param[in] none + \param[out] none + \retval none +*/ +void led_config(void) +{ + gd_eval_led_init(LED1); +} + +/*! + \brief configure the CLIC + \param[in] none + \param[out] none + \retval none +*/ +void config_clic_irqs(void) +{ + eclic_global_interrupt_enable(); + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1); + eclic_irq_enable(DMA0_Channel3_IRQn, 1, 1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/readme.txt new file mode 100644 index 0000000..2b538c6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/DMA/Ram_to_usart/readme.txt @@ -0,0 +1,41 @@ +/*! + \file readme.txt + \brief description of DMA ram to usart + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it provides a description +of how to use DMA channel3 to transfer data from RAM memory to USART0 transmit data +register.The start of transfer is triggered by software. At the end of the transfer, a +transfer complete interrupt is generated since it is enabled. If the DMA transfer +operation is finished correctly, data stored array welcome[] will be transfered +to a serial port tool by USART0 and LED1 light up. + JP5 and JP6 must be jumpped to USART0. \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/exmc_lcd.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/exmc_lcd.c new file mode 100644 index 0000000..8a5b902 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/exmc_lcd.c @@ -0,0 +1,94 @@ +/*! + \file exmc_lcd.c + \brief EXMC LCD driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "exmc_lcd.h" + +/*! + \brief lcd peripheral initialize + \param[in] none + \param[out] none + \retval none +*/ +void exmc_lcd_init(void) +{ + exmc_norsram_parameter_struct lcd_init_struct; + exmc_norsram_timing_parameter_struct lcd_timing_init_struct; + + /* EXMC clock enable */ + rcu_periph_clock_enable(RCU_EXMC); + rcu_periph_clock_enable(RCU_AF); + /* GPIO clock enable */ + rcu_periph_clock_enable(RCU_GPIOD); + rcu_periph_clock_enable(RCU_GPIOE); + + /* configure EXMC_D[0~15]*/ + /* PD14(EXMC_D0), PD15(EXMC_D1),PD0(EXMC_D2), PD1(EXMC_D3), PD8(EXMC_D13), PD9(EXMC_D14), PD10(EXMC_D15) */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_8 | GPIO_PIN_9 | + GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15); + + /* PE7(EXMC_D4), PE8(EXMC_D5), PE9(EXMC_D6), PE10(EXMC_D7), PE11(EXMC_D8), PE12(EXMC_D9), + PE13(EXMC_D10), PE14(EXMC_D11), PE15(EXMC_D12) */ + gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, 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); + + /* configure PE2(EXMC_A23) */ + gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); + + /* configure NOE and NWE */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5); + + /* configure EXMC NE0 */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7); + + lcd_timing_init_struct.bus_latency = 2; + lcd_timing_init_struct.asyn_data_setuptime = 10; + lcd_timing_init_struct.asyn_address_holdtime = 2; + lcd_timing_init_struct.asyn_address_setuptime = 5; + + lcd_init_struct.norsram_region = EXMC_BANK0_NORSRAM_REGION0; + lcd_init_struct.asyn_wait = DISABLE; + lcd_init_struct.nwait_signal = DISABLE; + lcd_init_struct.memory_write = ENABLE; + lcd_init_struct.nwait_polarity = EXMC_NWAIT_POLARITY_LOW; + lcd_init_struct.databus_width = EXMC_NOR_DATABUS_WIDTH_16B; + lcd_init_struct.memory_type = EXMC_MEMORY_TYPE_SRAM; + lcd_init_struct.address_data_mux = ENABLE; + lcd_init_struct.read_write_timing = &lcd_timing_init_struct; + + exmc_norsram_init(&lcd_init_struct); + + exmc_norsram_enable(EXMC_BANK0_NORSRAM_REGION0); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/exmc_lcd.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/exmc_lcd.h new file mode 100644 index 0000000..89e1340 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/exmc_lcd.h @@ -0,0 +1,41 @@ +/*! + \file exmc_lcd.h + \brief the header file of EXMC LCD driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef EXMC_LCD_H +#define EXMC_LCD_H + +/* lcd peripheral initialize */ +void exmc_lcd_init(void); + +#endif /* EXMC_LCD_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/ili9320.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/ili9320.c new file mode 100644 index 0000000..50ff18d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/ili9320.c @@ -0,0 +1,544 @@ +/*! + \file ili9320.c + \brief LCD driver functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + \version 2019-09-18, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "ili9320.h" +#include "ili9320_font.h" + +uint16_t device_code; + +/*! + \brief write data to the selected LCD register + \param[in] register_id: the selected register id + \param[in] value: the register value to be written + \param[out] none + \retval none +*/ + +void lcd_register_write(uint16_t register_id,uint16_t value) +{ + *(__IO uint16_t *) (BANK0_LCD_C)= register_id; + *(__IO uint16_t *) (BANK0_LCD_D)= value; +} + +/*! + \brief read the value of LCD register + \param[in] register_id: the register id + \param[out] none + \retval the register value +*/ +uint16_t lcd_register_read(uint8_t register_id) +{ + uint16_t data; + *(__IO uint16_t *) (BANK0_LCD_C)= register_id; + data = *(__IO uint16_t *) (BANK0_LCD_D); + return data; +} + +/*! + \brief write command to LCD register + \param[in] value: the register value to be written + \param[out] none + \retval none +*/ +void lcd_command_write(uint16_t value) +{ + /* write 16-bit index, then write reg */ + *(__IO uint16_t *) (BANK0_LCD_C) = value; +} + +/*! + \brief prepare to write to the LCD GRAM register(R22h) + \param[in] none + \param[out] none + \retval none +*/ +void lcd_gram_write_prepare(void) +{ + *(__IO uint16_t *) (BANK0_LCD_C) = 0x0022; +} + +/*! + \brief write RGB code to the LCD GRAM register + \param[in] rgb_code: the pixel color in RGB mode (5-6-5) + \param[out] none + \retval none +*/ +void lcd_gram_write(uint16_t rgb_code) +{ + /* write 16-bit GRAM register */ + *(__IO uint16_t *) (BANK0_LCD_D) = rgb_code; +} + +/*! + \brief read data from GRAM + \param[in] none + \param[out] none + \retval GRAM value +*/ +uint16_t lcd_gram_read(void) +{ + uint16_t data; + + /* write GRAM register (R22h) */ + *(__IO uint16_t *) (BANK0_LCD_C) = 0x0022; + /* dummy read (invalid data) */ + data = *(__IO uint16_t *) (BANK0_LCD_D); + + data = *(__IO uint16_t *) (BANK0_LCD_D); + return data; +} + +/*! + \brief initialize the LCD + \param[in] none + \param[out] none + \retval none +*/ +void lcd_init(void) +{ + __IO uint16_t i; + + /* read the LCD controller device code */ + device_code = lcd_register_read(0x0000); + + if(0x8989 == device_code){ // SSD1289 + lcd_register_write(0x0000,0x0001); + lcd_register_write(0x0003,0xA8A4); + lcd_register_write(0x000C,0x0000); + lcd_register_write(0x000D,0x080C); + lcd_register_write(0x000E,0x2B00); + lcd_register_write(0x001E,0x00B0); + lcd_register_write(0x0001,0x2B3F); + lcd_register_write(0x0002,0x0600); + lcd_register_write(0x0010,0x0000); + lcd_register_write(0x0011,0x6070); + lcd_register_write(0x0005,0x0000); + lcd_register_write(0x0006,0x0000); + lcd_register_write(0x0016,0xEF1C); + lcd_register_write(0x0017,0x0003); + lcd_register_write(0x0007,0x0233); + lcd_register_write(0x000B,0x0000); + lcd_register_write(0x000F,0x0000); + lcd_register_write(0x0041,0x0000); + lcd_register_write(0x0042,0x0000); + lcd_register_write(0x0048,0x0000); + lcd_register_write(0x0049,0x013F); + lcd_register_write(0x004A,0x0000); + lcd_register_write(0x004B,0x0000); + lcd_register_write(0x0044,0xEF00); + lcd_register_write(0x0045,0x0000); + lcd_register_write(0x0046,0x013F); + lcd_register_write(0x0030,0x0707); + lcd_register_write(0x0031,0x0204); + lcd_register_write(0x0032,0x0204); + lcd_register_write(0x0033,0x0502); + lcd_register_write(0x0034,0x0507); + lcd_register_write(0x0035,0x0204); + lcd_register_write(0x0036,0x0204); + lcd_register_write(0x0037,0x0502); + lcd_register_write(0x003A,0x0302); + lcd_register_write(0x003B,0x0302); + lcd_register_write(0x0023,0x0000); + lcd_register_write(0x0024,0x0000); + lcd_register_write(0x0025,0x8000); + lcd_register_write(0x004e,0); + lcd_register_write(0x004f,0); + }else if((0x9320 == device_code) || (0x9300 == device_code)){ //ILI9320 + lcd_register_write(0x01,0x0100); //driver output control + lcd_register_write(0x02,0x0700); //lcd driver waveform control + lcd_register_write(0x03,0x1020); //entry mode set + + lcd_register_write(0x04,0x0000); //resizing control + lcd_register_write(0x08,0x0202); //display control 2 + lcd_register_write(0x09,0x0000); //display control 3 + lcd_register_write(0x0a,0x0000); //frame cycle control + lcd_register_write(0x0c,(1<<0)); //extern display interface control 1 + lcd_register_write(0x0d,0x0000); //frame maker position + lcd_register_write(0x0f,0x0000); //extern display interface control 2 + + for(i=50000;i>0;i--); + lcd_register_write(0x07,0x0101); //display control + for(i=50000;i>0;i--); + + lcd_register_write(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4)); //power control 1 + lcd_register_write(0x11,0x0007); //power control 2 + lcd_register_write(0x12,(1<<8)|(1<<4)|(0<<0)); //power control 3 + lcd_register_write(0x13,0x0b00); //power control 4 + lcd_register_write(0x29,0x0000); //power control 7 + lcd_register_write(0x2b,(1<<14)|(1<<4)); + lcd_register_write(0x50,0); //set x start + lcd_register_write(0x51,239); //set x end + lcd_register_write(0x52,0); //set y start + lcd_register_write(0x53,319); //set y end + + lcd_register_write(0x60,0x2700); //driver output control + lcd_register_write(0x61,0x0001); //driver output control + lcd_register_write(0x6a,0x0000); //vertical srcoll control + + lcd_register_write(0x80,0x0000); //display position? partial display 1 + lcd_register_write(0x81,0x0000); //ram address start? partial display 1 + lcd_register_write(0x82,0x0000); //ram address end-partial display 1 + lcd_register_write(0x83,0x0000); //display position? partial display 2 + lcd_register_write(0x84,0x0000); //ram address start? partial display 2 + lcd_register_write(0x85,0x0000); //ram address end? partial display 2 + + lcd_register_write(0x90,(0<<7)|(16<<0)); //frame cycle control + lcd_register_write(0x92,0x0000); //panel interface control 2 + lcd_register_write(0x93,0x0001); //panel interface control 3 + lcd_register_write(0x95,0x0110); //frame cycle control + lcd_register_write(0x97,(0<<8)); + lcd_register_write(0x98,0x0000); //frame cycle control + for(i=50000;i>0;i--); + lcd_register_write(0x07,0x0173); + for(i=50000;i>0;i--); + + }else{ + return; + } + + for(i=50000;i>0;i--); +} + +/*! + \brief set the cursor of LCD + \param[in] x: the row-coordinate + \param[in] y: the column-coordinate + \param[out] none + \retval none +*/ +void lcd_cursor_set(uint16_t x,uint16_t y) +{ + lcd_register_write(0x004e,x); + lcd_register_write(0x004f,y); +} + +/*! + \brief clear the LCD screen to the specified color + \param[in] color: specified screen color + \param[out] none + \retval none +*/ +void lcd_clear(uint16_t color) +{ + uint32_t index=0; + if(0x8989 == device_code){ // SSD1289 + lcd_cursor_set(0,0); + /* prepare to write GRAM */ + lcd_gram_write_prepare(); + for(index=0; index LCD_PIXEL_HEIGHT)||(y > LCD_PIXEL_WIDTH)){ + return; + } + if(0x8989 == device_code){ // SSD1289 + lcd_cursor_set(x,y); + lcd_gram_write_prepare(); + lcd_gram_write(point); + }else if((0x9320 == device_code) || (0x9300 == device_code)){ //ILI9320 + lcd_register_write(0x20, x); + lcd_register_write(0x21, y); + lcd_register_write(0x22, point); + } + +} + +/*! + \brief get point GRAM according to the specified position + \param[in] x: the row-coordinate + \param[in] y: the column-coordinate + \param[out] none + \retval GRAM value of point +*/ +uint16_t lcd_point_get(uint16_t x,uint16_t y) +{ + uint16_t data; + + if ((x > LCD_PIXEL_HEIGHT)||(y > LCD_PIXEL_WIDTH)){ + return 0; + } + + lcd_cursor_set(x,y); + data = lcd_gram_read(); + + return data; +} + +/*! + \brief set window area + \param[in] start_x: the start position of row-coordinate + \param[in] start_y: the start position of column-coordinate + \param[in] end_x: the end position of row-coordinate + \param[in] end_y: the end position of column-coordinate + \param[out] none + \retval none +*/ +void lcd_windows_set(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y) +{ + lcd_cursor_set(start_x, start_y); + + lcd_register_write(0x0050, start_x); + lcd_register_write(0x0052, start_y); + lcd_register_write(0x0051, end_x); + lcd_register_write(0x0053, end_y); +} + +/*! + \brief draw a horizontal line on LCD screen + \param[in] x: the row-coordinate + \param[in] start_y: the start column-coordinate + \param[in] end_y: the end column-coordinate + \param[in] color: specified color of the point + \param[in] width: line width + \param[out] none + \retval none +*/ + +void lcd_hline_draw(uint16_t x,uint16_t start_y,uint16_t end_y,uint16_t color,uint16_t width) +{ + uint16_t i, y; + + for (i = 0; i < width; i++) { + uint16_t sx = x + i; + + for (y = start_y; y < end_y; y++) { + lcd_point_set(sx, y, color); + } + } +} + +/*! + \brief draw a vertical line on LCD screen + \param[in] start_x: the start column-coordinate + \param[in] end_x: the end column-coordinate + \param[in] y: the row-coordinate + \param[in] color: specified color of the point + \param[in] width: line width + \param[out] none + \retval none +*/ + +void lcd_vline_draw(uint16_t start_x,uint16_t end_x,uint16_t y,uint16_t color,uint16_t width) +{ + uint16_t i, x; + + for (i = 0; i < width; i++) { + uint16_t sy = y + i; + + for (x = start_x; x < end_x; x++) { + lcd_point_set(x, sy, color); + } + } +} + +/*! + \brief draw a rectangle according to the specified position and color + \param[in] start_x: the start position of row-coordinate + \param[in] start_y: the start position of column-coordinate + \param[in] end_x: the end position of row-coordinate + \param[in] end_y: the end position of column-coordinate + \param[in] point: specified color of the point + \param[out] none + \retval none +*/ +void lcd_rectangle_draw(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t point) +{ + uint16_t x,y; + x=start_x; + y=start_y; + /* draw four lines */ + for(x=start_x;xstart_x;x--){ + lcd_point_set(x,y,point); + } + for(y=end_y;y>start_y;y--){ + lcd_point_set(x,y,point); + } +} + +/*! + \brief fill the specified color to a rectangle + \param[in] start_x: the start position of row-coordinate + \param[in] start_y: the start position of column-coordinate + \param[in] end_x: the end position of row-coordinate + \param[in] end_y: the end position of column-coordinate + \param[in] color: specified color + \param[out] none + \retval none +*/ +void lcd_rectangle_fill(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t color) +{ + uint16_t x, y; + x = start_x; + y = start_y; + + for (x = start_x; x < end_x; x++) { + for (y = start_y; y < end_y; y++) { + lcd_point_set(x, y, color); + } + } +} + +/*! + \brief draw a picture on LCD screen according to the specified position + \param[in] start_x: the start position of row-coordinate + \param[in] start_y: the start position of column-coordinate + \param[in] end_x: the end position of row-coordinate + \param[in] end_y: the end position of column-coordinate + \param[in] pic: the picture pointer + \param[out] none + \retval none +*/ +void lcd_picture_draw(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t *pic) +{ + uint32_t i, total; + uint16_t *picturepointer = pic; + uint16_t x,y; + + x = start_x; + y = start_y; + + total = (end_x - start_x + 1) * (end_y - start_y + 1); + + for(i = 0; i < total; i ++){ + /* set point according to the specified position and color */ + lcd_point_set(x,y,*picturepointer++); + x++; + if(x > end_x){ + y++; + x = start_x; + } + } +} + +/*! + \brief display a char on LCD screen according to the specified position + \param[in] x: the start position of row-coordinate + \param[in] y: the start position of column-coordinate + \param[in] c: the char + \param[in] char_color: the color of char + \param[in] c_format: the structure of char format + font: CHAR_FONT_8_16 or CHAR_FONT_16_24 + direction: CHAR_DIRECTION_HORIZONTAL or CHAR_DIRECTION_VERTICAL + char_color: the color of char + bk_color: the color of background + \param[out] none + \retval none +*/ +void lcd_char_display(uint16_t x,uint16_t y,uint8_t c,char_format_struct c_format) +{ + uint16_t i = 0, j = 0; + uint8_t temp_char = 0; + uint16_t temp_char_16 = 0; + + if(CHAR_FONT_8_16 == c_format.font){ /* 8x16 ASCII */ + for (i = 0; i < 16; i++) { + temp_char = ascii_8x16[((c - 0x20) * 16) + i]; + if(CHAR_DIRECTION_HORIZONTAL == c_format.direction){ + for (j = 0; j < 8; j++) { + if (((temp_char >> (7 - j)) & 0x01) == 0x01) { + /* set point of char */ + lcd_point_set(x - i, y + j, c_format.char_color); + } else { + /* set point of background */ + lcd_point_set(x - i, y + j, c_format.bk_color); + } + } + }else{ + for (j = 0; j < 8; j++) { + if (((temp_char >> (7 - j)) & 0x01) == 0x01) { + /* set point of char */ + lcd_point_set(x + j, y + i, c_format.char_color); + } else { + /* set point of background */ + lcd_point_set(x + j, y + i, c_format.bk_color); + } + } + } + } + }else if(CHAR_FONT_16_24 == c_format.font){ /* 16x24 ASCII */ + for (i = 0; i < 24; i++) { + temp_char_16 = ASCII_Table_16x24[((c - 0x20) * 24) + i]; + if(CHAR_DIRECTION_HORIZONTAL == c_format.direction){ + for (j = 0; j < 16; j++) { + if (((temp_char_16 >> j) & 0x01) == 0x01) { + /* set point of char */ + lcd_point_set(x - i, y + j, c_format.char_color); + } else { + /* set point of background */ + lcd_point_set(x - i, y + j, c_format.bk_color); + } + } + }else{ + for (j = 0; j < 16; j++) { + if (((temp_char_16 >> j) & 0x01) == 0x01) { + /* set point of char */ + lcd_point_set(x + j, y + i, c_format.char_color); + } else { + /* set point of background */ + lcd_point_set(x + j, y + i, c_format.bk_color); + } + } + } + } + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/ili9320.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/ili9320.h new file mode 100644 index 0000000..03908fd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/ili9320.h @@ -0,0 +1,233 @@ +/*! + \file ili9320.h + \brief LCD driver header file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + \version 2019-09-18, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef ILI9320_H +#define ILI9320_H + +#include "gd32vf103.h" + +#define BANK0_LCD_C ((uint32_t)0x60000000) /*!< LCD register address */ +#define BANK0_LCD_D ((uint32_t)0x61000000) /*!< LCD data address */ + +/* 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 R11 0x0B +#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 R35 0x23 +#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 R58 0x3A +#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 + +#define LINE0 0 +#define LINE1 24 +#define LINE2 48 +#define LINE3 72 +#define LINE4 96 +#define LINE5 120 +#define LINE6 144 +#define LINE7 168 +#define LINE8 192 +#define LINE9 216 + +/* char format struct definitions */ +typedef struct +{ + uint16_t font; /*!< the type of font */ + uint16_t direction; /*!< the direction of char */ + uint16_t char_color; /*!< the color of char */ + uint16_t bk_color; /*!< the color of backgroud */ +}char_format_struct; + +#define CHAR_FONT_8_16 ((uint16_t)0x0000U) /*!< the font of char is 8X16 */ +#define CHAR_FONT_16_24 ((uint16_t)0x0001U) /*!< the font of char is 16X24 */ + +#define CHAR_DIRECTION_HORIZONTAL ((uint16_t)0x0000U) /*!< character display direction is horizontal */ +#define CHAR_DIRECTION_VERTICAL ((uint16_t)0x0001U) /*!< character display direction is vertical */ + +#define LCD_PIXEL_WIDTH ((uint16_t)320) +#define LCD_PIXEL_HEIGHT ((uint16_t)240) + +/* initialize the LCD */ +void lcd_init(void); +/* write data to the selected LCD register */ +void lcd_register_write(uint16_t register_id,uint16_t value); +/* read the value of LCD register */ +uint16_t lcd_register_read(uint8_t register_id); +/* write command to LCD register */ +void lcd_command_write (uint16_t value); +/* prepare to write to the LCD GRAM */ +void lcd_gram_write_prepare(void); +/* write RGB code to the LCD GRAM register */ +void lcd_gram_write(uint16_t rgb_code); +/* read data from GRAM */ +uint16_t lcd_gram_read(void); +/* set the cursor of LCD */ +void lcd_cursor_set(uint16_t x,uint16_t y); +/* clear the LCD screen to the specified color */ +void lcd_clear(uint16_t Color); +/* set the point according to the specified position and color */ +void lcd_point_set(uint16_t x,uint16_t y,uint16_t point); +/* get the point according to the specified position */ +uint16_t lcd_point_get(uint16_t x,uint16_t y); +/* set window area */ +void lcd_windows_set(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y); +/* draw a horizontal line on LCD screen */ +void lcd_hline_draw(uint16_t x,uint16_t start_y,uint16_t end_y,uint16_t color,uint16_t width); +/* draw a rectangle according to the specified position and color */ +void lcd_rectangle_draw(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t point); +/* fill the specified color to a rectangle */ +void lcd_rectangle_fill(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t color); +/* draw a picture on LCD screen according to the specified position */ +void lcd_picture_draw(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t *pic); +/* display a char on LCD screen according to the specified position */ +void lcd_char_display(uint16_t x,uint16_t y,uint8_t c,char_format_struct c_format); + +#endif /* ILI9320_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/ili9320_font.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/ili9320_font.h new file mode 100644 index 0000000..5f929c6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/ili9320_font.h @@ -0,0 +1,711 @@ +/*! + \file ili9320_font.h + \brief LCD font header file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +/* 8x16 ASCII */ +unsigned char const ascii_8x16[1536] = { +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00, +0x18,0x18,0x7C,0xC6,0xC2,0xC0,0x7C,0x06,0x86,0xC6,0x7C,0x18,0x18,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xC2,0xC6,0x0C,0x18,0x30,0x60,0xC6,0x86,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0x6C,0x38,0x76,0xDC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x0C,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0C,0x00,0x00,0x00,0x00, +0x00,0x00,0x30,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6,0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0x0C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xDC,0xC0,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xDE,0xC6,0xC6,0x66,0x3A,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0xE6,0x66,0x6C,0x6C,0x78,0x78,0x6C,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xDE,0x7C,0x0C,0x0E,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x0C,0x06,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x7E,0x7E,0x5A,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x10,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0x6C,0x6C,0x38,0x38,0x6C,0x6C,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC6,0x86,0x0C,0x18,0x30,0x60,0xC2,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x06,0x02,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00,0x00, +0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, +0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0xE0,0x60,0x60,0x78,0x6C,0x66,0x66,0x66,0x66,0xDC,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC0,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x1C,0x0C,0x0C,0x3C,0x6C,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0xCC,0x78,0x00, +0x00,0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, +0x00,0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xEC,0xFE,0xD6,0xD6,0xD6,0xD6,0xD6,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0x0C,0x1E,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x76,0x62,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0x60,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x10,0x30,0x30,0xFC,0x30,0x30,0x30,0x30,0x36,0x1C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0xF8,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0xCC,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00, +0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xC6,0xFE,0x00,0x00,0x00,0x00,0x00 +}; + +/* ASCII Table: each character is 16 column (16dots large) + and 24 raw (24 dots high) */ +const uint16_t ASCII_Table_16x24[] = +{ +/** + * @brief Space ' ' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '!' + */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '"' + */ + 0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '#' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60, + 0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318, + 0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000, +/** + * @brief '$' + */ + 0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C, + 0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C, + 0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, +/** + * @brief '%' + */ + 0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611, + 0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460, + 0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000, +/** + * @brief '&' + */ + 0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0, + 0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06, + 0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ''' + */ + 0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '(' + */ + 0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000, +/** + * @brief ')' + */ + 0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300, + 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000, +/** + * @brief '*' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '+' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ',' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, +/** + * @brief '-' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '.' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '/' + */ + 0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300, + 0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0, + 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '0' + */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C, + 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '1' + */ + 0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '2' + */ + 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800, + 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, + 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '3' + */ + 0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600, + 0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18, + 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '4' + */ + 0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60, + 0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00, + 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '5' + */ + 0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC, + 0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18, + 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '6' + */ + 0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC, + 0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '7' + */ + 0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380, + 0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030, + 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '8' + */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638, + 0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38, + 0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '9' + */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C, + 0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C, + 0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ':' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ';' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000, +/** + * @brief '<' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0, + 0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '=' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '>' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0, + 0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '?' + */ + 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00, + 0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '@' + */ + 0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411, + 0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004, + 0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'A' + */ + 0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60, + 0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C, + 0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'B' + */ + 0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C, + 0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C, + 0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'C' + */ + 0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C, + 0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'D' + */ + 0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006, + 0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06, + 0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'E' + */ + 0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'F' + */ + 0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'G' + */ + 0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003, + 0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C, + 0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'H' + */ + 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'I' + */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'J' + */ + 0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738, + 0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'K' + */ + 0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6, + 0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806, + 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'L' + */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'M' + */ + 0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836, + 0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6, + 0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'N' + */ + 0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC, + 0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C, + 0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'O' + */ + 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003, + 0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C, + 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'P' + */ + 0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'Q' + */ + 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003, + 0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C, + 0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'R' + */ + 0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806, + 0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006, + 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'S' + */ + 0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C, + 0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C, + 0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'T' + */ + 0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'U' + */ + 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818, + 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'V' + */ + 0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C, + 0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360, + 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'W' + */ + 0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366, + 0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C, + 0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'X' + */ + 0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0, + 0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C, + 0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'Y' + */ + 0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660, + 0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'Z' + */ + 0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600, + 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006, + 0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '[' + */ + 0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000, +/** + * @brief '\' + */ + 0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0, + 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300, + 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ']' + */ + 0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000, +/** + * @brief '^' + */ + 0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630, + 0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '_' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ''' + */ + 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'a' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8, + 0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C, + 0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'b' + */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8, + 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, + 0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'c' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0, + 0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30, + 0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'd' + */ + 0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0, + 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, + 0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'e' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, + 0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30, + 0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'f' + */ + 0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'g' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8, + 0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18, + 0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000, +/** + * @brief 'h' + */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8, + 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, + 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'i' + */ + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'j' + */ + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000, +/** + * @brief 'k' + */ + 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C, + 0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C, + 0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'l' + */ + 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'm' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF, + 0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, + 0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'n' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8, + 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, + 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'o' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, + 0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30, + 0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'p' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8, + 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, + 0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000, +/** + * @brief 'q' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0, + 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, + 0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000, +/** + * @brief 'r' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0, + 0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 's' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0, + 0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 't' + */ + 0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'u' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818, + 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38, + 0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'v' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18, + 0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360, + 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'w' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1, + 0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C, + 0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'x' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38, + 0x0C30, 0x0660, 0x0360, 0x0360, 0x0360, 0x0360, 0x0660, 0x0C30, + 0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'y' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830, + 0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380, + 0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000, +/** + * @brief 'z' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC, + 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, + 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '{' + */ + 0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000, +/** + * @brief '|' + */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, +/** + * @brief '}' + */ + 0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000, +/** + * @brief '~' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + }; diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/main.c new file mode 100644 index 0000000..120bcdd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/main.c @@ -0,0 +1,82 @@ +/*! + \file main.c + \brief LCD test demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + \version 2019-09-18, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "exmc_lcd.h" +#include "ili9320.h" +#include "picture.h" + +uint8_t gd_website_string[]={"www.gigadevice.com"}; +char_format_struct char_format; + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + uint16_t i; + + /* configure the EXMC access mode */ + exmc_lcd_init(); + + /* initialize the LCD */ + lcd_init(); + + /* clear the LCD screen */ + lcd_clear(WHITE); + + /* draw the picture of Gigadevice logo */ + lcd_picture_draw(60,100,60+120-1,100+95-1,(uint16_t *)(picture + BMP_HEADSIZE)); + + /* draw a rectangle */ + lcd_rectangle_draw(10,10,230,310,BLUE); + + /* configure char format */ + char_format.char_color = BLUE; + char_format.bk_color = WHITE; + char_format.direction = CHAR_DIRECTION_VERTICAL; + char_format.font = CHAR_FONT_8_16; + + /* draw character on LCD screen */ + for(i = 0; i < sizeof(gd_website_string)-1; i++){ + lcd_char_display((50+8*i), 180+20, *(gd_website_string+i),char_format); + } + + while(1){ + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/picture.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/picture.c new file mode 100644 index 0000000..4b454a7 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/picture.c @@ -0,0 +1,1466 @@ +/*! + \file picture.c + \brief picture file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + \version 2019-09-18, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "picture.h" + +/* the picture of Gigadevice logo */ +/* 120*95 */ +const uint8_t picture[22808] = { 0X00,0X10,0X78,0X00,0X5F,0X00,0X01,0X1B, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBF,0XE7,0X7E,0XCF,0XFE,0XAE,0X3D,0X8E,0XFC,0X6D, +0XBC,0X4D,0X7B,0X3D,0X3B,0X35,0X3B,0X2D,0X7B,0X3D,0X7C,0X45,0XBC,0X5D,0X3C,0X76, +0X7D,0X96,0XFE,0XBE,0X7E,0XDF,0XBF,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7, +0X7E,0XE7,0XBD,0XAE,0XFC,0X6D,0X3B,0X35,0X7A,0X0C,0X79,0X04,0X7A,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0X7A,0X04, +0X7A,0X04,0XBA,0X04,0XFB,0X24,0XBC,0X4D,0X7D,0X86,0X3E,0XCF,0XBF,0XEF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBF,0XEF,0XFD,0XC6,0X7B,0X7D, +0X39,0X34,0X57,0X0B,0X16,0X03,0X16,0X03,0X56,0X03,0X56,0X03,0X97,0X03,0XD8,0X03, +0X39,0X04,0XBA,0X04,0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0X7A,0X04,0X7A,0X04,0X7A,0X04,0XFA,0X1C,0XBC,0X55,0XBD,0XA6, +0X7F,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3D,0XCF,0X3A,0X65,0X56,0X13,0XD6,0X02, +0XD6,0X02,0X16,0X03,0X16,0X03,0X16,0X03,0X16,0X03,0X16,0X03,0X16,0X03,0X56,0X03, +0X56,0X03,0X57,0X03,0XD9,0X03,0XBA,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0X7A,0X04,0XBA,0X04, +0X3B,0X35,0XBD,0X9E,0XBF,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X7E,0XDF,0X7B,0X85,0X97,0X1B,0XD5,0X02,0X16,0X03,0X16,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X16,0X03,0X56,0X03,0X97,0X03,0X79,0X04,0XFB,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0X7A,0X0C,0XBB,0X4D,0XFD,0XAE,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X7C,0XB6,0X38,0X34,0X95,0X02,0XD6,0X02,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X56,0X03,0X39,0X04,0XFB,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0X7A,0X04,0XBB,0X0C,0X3C,0X76,0XBF,0XE7,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBF,0XEF, +0XBB,0X7D,0X56,0X13,0X96,0X02,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X16,0X03,0X39,0X04,0XFB,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0X7A,0X04,0XBC,0X4D,0X7E,0XDF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XE7,0XF9,0X5C, +0XD5,0X02,0XD6,0X02,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X57,0X03,0X7A,0X04, +0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0X7C,0X4D,0XBF,0XE7, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XDF,0XB9,0X44,0XD6,0X02, +0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X97,0X03, +0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0XFC,0X75, +0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XE7,0X79,0X4C,0XD6,0X02,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03, +0XD9,0X03,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBB,0X0C, +0XFE,0XB6,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XEF,0XB9,0X4C,0XD6,0X02,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03, +0X57,0X03,0XBA,0X04,0XFB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04, +0X7B,0X4D,0XBF,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3A,0X6D,0XD6,0X02,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X16,0X03,0X3A,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XFA,0X14,0X3E,0XBF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFB,0X95,0X56,0X0B,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X16,0X03,0XD8,0X03,0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0X7C,0X86,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFD,0XBE,0X97,0X1B,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X97,0X03,0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0XBC,0X5D,0XBF,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF7,0X79,0X54,0XD6,0X02,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X16,0X03,0X57,0X03,0XBA,0X04,0XFB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0X3B,0X35,0XBF,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFB,0X95,0X16,0X0B,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X16,0X03,0X56,0X03,0X7A,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0XFA,0X2C,0X7F,0XD7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XE7, +0XD7,0X33,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X16,0X03,0X56,0X03,0X7A,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0XFA,0X2C,0X7F,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,0X8D, +0X16,0X0B,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X57,0X03,0X7A,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0X3B,0X3D,0XBF,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XE7,0X78,0X3C, +0XD6,0X02,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X16,0X03,0XD7,0X03,0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0XFC,0X5D,0XBF,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3B,0X9E,0X56,0X13, +0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X16,0X03,0X38,0X04,0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0X7D,0X8E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBF,0XF7,0XB9,0X5C,0XD5,0X02, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X16,0X03,0X79,0X04,0XFB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04, +0XBA,0X1C,0X3E,0XCF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3D,0XCF,0XD8,0X2B,0XD6,0X02, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X97,0X03,0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04, +0XFC,0X65,0XBF,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7C,0XA6,0X16,0X13,0X16,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03, +0X39,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0XFB,0X24, +0X3E,0XCF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7A,0X75,0XD6,0X02,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X97,0X03, +0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0XBA,0X0C,0XBE,0XA6, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XEF,0XB9,0X54,0XD5,0X02,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X39,0X04, +0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0X7A,0X04,0X3D,0X7E,0XFF,0XF7, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3D,0XD7,0XD8,0X2B,0XD6,0X02,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X97,0X03,0XBA,0X04, +0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0XBB,0X14,0X3D,0X86,0XFF,0XF7,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XBE,0X57,0X1B,0X16,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0XD8,0X03,0XBB,0X04, +0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0X7A,0X04,0XBA,0X04,0X3B,0X3D,0XFE,0XAE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7C,0XAE,0X16,0X0B,0X16,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X39,0X04,0XBB,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0XBA,0X04,0X7A,0X04,0XBA,0X04, +0XBA,0X0C,0X3B,0X2D,0X3D,0X7E,0XBE,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XFF,0XEF,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3B,0X9E,0X16,0X03,0X16,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0XD9,0X03,0X7A,0X04, +0X7A,0X04,0X7A,0X04,0X7A,0X04,0X7A,0X04,0XBA,0X0C,0XFB,0X24,0X7B,0X45,0XFC,0X65, +0XBD,0X96,0X7E,0XD7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XBF,0XE7,0XBE,0XA6,0X3C,0X6E,0XFC,0X5D,0XFC,0X6D,0XBE,0X9E,0XBE,0XE7, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,0X95,0XD6,0X02,0X16,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X16,0X03,0X16,0X03,0X39,0X0C,0XFB,0X24, +0X3B,0X35,0XBB,0X4D,0XFC,0X65,0X7D,0X86,0XBD,0XA6,0X3E,0XC7,0XBE,0XDF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X7E,0XDF,0XBC,0X5D,0X7A,0X04,0X7A,0X04,0X3A,0X04,0X7A,0X04,0XBA,0X04,0XBC,0X55, +0X7F,0XD7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,0X8D,0XD6,0X02,0X16,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X16,0X03,0X56,0X03,0X56,0X03,0X97,0X03,0XD8,0X0B,0XFC,0X75,0X7E,0XCF, +0X7F,0XD7,0XBF,0XE7,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBF,0XEF, +0X7C,0X55,0X7A,0X04,0X7A,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04, +0X7C,0X55,0XBF,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,0X8D,0XD6,0X02,0X16,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03, +0X16,0X03,0X57,0X03,0XD8,0X03,0X7A,0X04,0X7B,0X04,0XBA,0X14,0XFE,0XA6,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0X96, +0XBA,0X0C,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04, +0X7A,0X0C,0X7D,0X96,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,0X95,0XD6,0X02,0X16,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X16,0X03,0X97,0X03, +0X39,0X04,0XBA,0X04,0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X0C,0X7D,0X8E,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBC,0X5D, +0X7A,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0XBC,0X5D,0XBF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3B,0XA6,0X16,0X03,0X16,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X16,0X03,0X57,0X03,0X39,0X04,0XBA,0X04, +0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0XFC,0X65,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBF,0XEF,0X7B,0X45, +0X7A,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0XBB,0X45,0XBF,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBC,0XB6,0X56,0X13,0X16,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X16,0X03,0X57,0X03,0X39,0X04,0XBA,0X04,0XBB,0X04,0XBB,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X3B,0X2D,0XBF,0XE7, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XD7,0X3B,0X35, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0XBC,0X55,0XBF,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XC6,0X97,0X23,0XD6,0X02,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X16,0X03,0X56,0X03,0X38,0X04,0XBA,0X04,0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X14,0XBD,0XA6, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XBE,0XBB,0X1C, +0X7A,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0XBC,0X6D,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XDF,0X38,0X44,0XD6,0X02,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03, +0X97,0X03,0XBA,0X04,0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7C,0X45, +0XBF,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0X9E,0XBA,0X0C, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X39,0X04,0XFB,0X8D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0X3A,0X6D,0XD5,0X02,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0XD7,0X03, +0XBA,0X04,0XFB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X0C, +0X7D,0X8E,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XFC,0X6D,0X7A,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBB,0X04,0X7A,0X04, +0X38,0X14,0X7C,0XAE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,0X95,0X16,0X0B,0X16,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0XD8,0X03,0XBB,0X04, +0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XFB,0X24,0X3E,0XC7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XD7,0X3B,0X35,0X7A,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBB,0X04,0XBB,0X04,0XD8,0X03, +0X38,0X3C,0X3E,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XBE,0X57,0X23,0XD6,0X02, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0XD8,0X03,0XBB,0X04,0XBB,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0X7A,0X04,0X7C,0X3D,0X7E,0XD7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0X9E,0XBA,0X0C,0X7A,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBB,0X04,0XBB,0X04,0X39,0X04,0X16,0X03, +0XF9,0X64,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XE7,0X78,0X4C,0XD5,0X02, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0XD8,0X03,0XBB,0X04,0XBB,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0X7A,0X04,0XBB,0X45,0X7E,0XD7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XFC,0X5D,0X7A,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XFB,0X04,0XBB,0X04,0X7A,0X04,0X56,0X03,0X16,0X0B, +0XFB,0X95,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBB,0X85,0X16,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X16,0X03,0X98,0X03,0XBB,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0X7A,0X04,0X3B,0X35,0XFD,0XA6,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3E,0XC7,0XFB,0X1C,0X7A,0X04,0XBA,0X04, +0XBA,0X04,0XBB,0X04,0XBB,0X04,0XBA,0X04,0X38,0X04,0X57,0X03,0XD5,0X02,0XD7,0X2B, +0X3D,0XD7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XC6,0XD7,0X23, +0XD6,0X02,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X16,0X03,0X97,0X03,0XBA,0X04,0XFB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0XBA,0X14,0XFC,0X65,0X3E,0XBF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XFD,0X6D,0XBA,0X04,0XBB,0X04,0XBB,0X04, +0XBB,0X04,0XBA,0X04,0X3A,0X04,0X97,0X03,0X16,0X03,0X16,0X03,0XD6,0X02,0X3A,0X65, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3A,0X65, +0XD6,0X02,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X16,0X03,0X56,0X03,0X7A,0X04,0XFB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0XBA,0X04,0XFB,0X1C,0XBC,0X55, +0X7D,0X8E,0X3E,0XBF,0XBF,0XF7,0XFE,0XB6,0XBB,0X0C,0X7B,0X04,0XBB,0X04,0X7A,0X04, +0XD8,0X03,0X97,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X57,0X1B,0XFD,0XC6, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBD,0XBE, +0X97,0X1B,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X16,0X03,0XD8,0X03,0XFB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0X7A,0X04,0XBA,0X04, +0X7A,0X0C,0XFB,0X1C,0X3B,0X35,0X79,0X24,0X97,0X03,0X97,0X03,0X57,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0XD6,0X02,0XFA,0X64,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFA,0X64,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X97,0X03,0XBA,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBB,0X04,0XD8,0X03,0X16,0X03,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X56,0X1B,0XFD,0XC6,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X3E,0XD7,0XD7,0X2B,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03, +0X38,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBB,0X04,0X7A,0X04,0X56,0X03,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0XD6,0X02,0X3A,0X75,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFB,0X95,0X16,0X0B,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X97,0X03, +0XBA,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBB,0X04, +0XBA,0X04,0X97,0X03,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X38,0X34,0X7E,0XE7,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF7,0XB9,0X54,0XD6,0X02,0X56,0X03,0X56,0X03,0X16,0X03,0XD8,0X03, +0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBB,0X04,0XBA,0X04, +0X97,0X03,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X16,0X03,0X56,0X0B,0X7C,0XB6,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X3E,0XDF,0XD7,0X33,0X16,0X03,0X56,0X03,0X57,0X03,0X7A,0X04, +0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBB,0X04,0XBA,0X04,0X98,0X03, +0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0XD6,0X02,0XBB,0X8D,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBC,0XBE,0X97,0X1B,0XD5,0X02,0X97,0X03,0XBB,0X04, +0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBB,0X04,0XBA,0X04,0X98,0X03,0X16,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0XD6,0X02,0X3A,0X65,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7C,0XAE,0X56,0X13,0X98,0X03,0XBB,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBB,0X04,0XFB,0X04,0X7A,0X04,0X57,0X03,0X16,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03, +0XD6,0X02,0XB9,0X4C,0XBE,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3C,0XA6,0X79,0X1C,0X7A,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBB,0X04,0XFB,0X04,0XBB,0X04,0X39,0X04,0X56,0X03,0X16,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X96,0X02, +0XB9,0X4C,0X7E,0XDF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFD,0XAE,0XFB,0X24, +0X7A,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBB,0X04,0XBB,0X04, +0XBB,0X04,0X7A,0X04,0X97,0X03,0X16,0X03,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0XD6,0X02,0XF9,0X5C, +0X7E,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3E,0XBF, +0X3B,0X35,0X7A,0X04,0XBA,0X04,0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04, +0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBB,0X04,0XBB,0X04,0XBB,0X04,0XBB,0X04,0X7A,0X04, +0XD8,0X03,0X57,0X03,0X16,0X03,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0XD6,0X02,0X16,0X0B,0X7B,0X7D,0XBF,0XEF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X7F,0XDF,0XFC,0X65,0X7A,0X04,0X7A,0X04,0XBB,0X04,0XBB,0X04,0XBB,0X04,0XBB,0X04, +0XBB,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBA,0X04,0XBB,0X04,0XBB,0X04, +0XBB,0X04,0XBB,0X04,0XBB,0X04,0XBB,0X04,0XBB,0X04,0X79,0X04,0XD8,0X03,0X56,0X03, +0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X16,0X03,0XD6,0X02,0XD7,0X23,0X3C,0XA6,0XFF,0XF7,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XF7,0X7D,0X9E,0X7A,0X24,0XD8,0X03,0X39,0X04,0XBB,0X04,0XBB,0X04, +0XBB,0X04,0XBB,0X04,0XFB,0X04,0XBB,0X04,0XBB,0X04,0XBB,0X04,0XBB,0X04,0XBB,0X04, +0XBB,0X04,0XBA,0X04,0X7A,0X04,0XD8,0X03,0X97,0X03,0X56,0X03,0X16,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X16,0X03,0XD6,0X02,0X16,0X0B,0XF9,0X5C,0X3E,0XD7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3D,0XD7,0XBA,0X7D,0XD7,0X1B,0X56,0X03,0X97,0X03, +0X39,0X04,0X39,0X04,0X39,0X04,0X39,0X04,0X39,0X04,0X39,0X04,0XD9,0X03,0XD8,0X03, +0X97,0X03,0X97,0X03,0X56,0X03,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0XD6,0X02, +0X16,0X03,0X79,0X4C,0X7C,0XAE,0XBF,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3E,0XDF,0X7A,0X75,0X97,0X1B, +0XD5,0X02,0XD6,0X02,0X16,0X03,0X16,0X03,0X16,0X03,0X16,0X03,0X16,0X03,0X16,0X03, +0X16,0X03,0X16,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03,0X56,0X03, +0X56,0X03,0X56,0X03,0X56,0X03,0X16,0X03,0X16,0X03,0XD6,0X02,0X56,0X0B,0X79,0X44, +0X7D,0XAE,0X7F,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XDF, +0XFC,0X95,0XB9,0X54,0X97,0X1B,0X16,0X0B,0X16,0X03,0X16,0X03,0X16,0X03,0X16,0X03, +0X16,0X03,0X16,0X03,0X16,0X03,0X16,0X03,0X16,0X03,0X16,0X03,0X16,0X03,0X16,0X03, +0X16,0X03,0X16,0X03,0X16,0X03,0X56,0X13,0XD7,0X2B,0X7A,0X6D,0XFD,0XC6,0XBF,0XEF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X7E,0XDF,0XFC,0X9D,0X3A,0X65,0X78,0X44,0XD7,0X2B,0X97,0X1B, +0X57,0X13,0X56,0X0B,0X56,0X0B,0X56,0X0B,0X56,0X0B,0X56,0X13,0X57,0X13,0XD7,0X2B, +0X38,0X3C,0XB9,0X4C,0X7B,0X7D,0XBD,0XBE,0XBF,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBF,0XF7,0X3E,0XDF,0XFD,0XC6, +0XBD,0XBE,0X7C,0XAE,0X3C,0XA6,0X3C,0XA6,0X7C,0XA6,0X7C,0XB6,0XBD,0XBE,0X3E,0XCF, +0X7E,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XF7,0XBA,0XDE,0XBA,0XDE,0XBA,0XDE, +0XBA,0XDE,0XBA,0XDE,0XBA,0XDE,0XBA,0XDE,0XBA,0XDE,0XBE,0XF7,0XFF,0XFF,0X37,0XC6, +0X30,0X8C,0X30,0X8C,0X34,0XA5,0X7D,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X7D,0XEF,0XBA,0XD6,0XBA,0XDE,0XBA,0XDE,0XBA,0XDE,0XBA,0XDE,0XBA,0XDE,0XBA,0XDE, +0XFB,0XE6,0XBE,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X38,0XCE,0X71,0X94,0X30,0X8C,0XB2,0X9C,0X7D,0XEF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X3C,0XE7,0X70,0X8C,0X86,0X41,0X04,0X31,0X04,0X29,0X04,0X29, +0X04,0X29,0X04,0X29,0X04,0X29,0X03,0X29,0X45,0X31,0XF7,0XBD,0XFF,0XFF,0XCF,0X83, +0X00,0X08,0X00,0X08,0XC7,0X41,0XFB,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X33,0XA5,0X82,0X20,0X45,0X31,0X44,0X31,0X04,0X29,0X04,0X29,0X04,0X29,0X04,0X29, +0X04,0X29,0XC7,0X49,0XF3,0X9C,0XBE,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB2,0X94,0X41,0X18,0X00,0X08,0X45,0X31,0XFB,0XDE, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X79,0XD6,0XC7,0X41,0X00,0X08,0X81,0X18,0X81,0X18,0X40,0X10,0X01,0X18, +0X41,0X18,0X41,0X18,0X41,0X18,0X00,0X08,0X82,0X18,0XB6,0XB5,0XFF,0XFF,0XCF,0X83, +0X00,0X08,0X00,0X00,0XC7,0X41,0XFB,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF3,0XA4,0X40,0X10,0XC2,0X20,0XC2,0X20,0X41,0X18,0X01,0X18,0X01,0X18,0X40,0X10, +0X41,0X18,0X41,0X18,0X40,0X18,0XCB,0X62,0XFB,0XE6,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X71,0X94,0X40,0X10,0X00,0X08,0X04,0X29,0XFB,0XDE, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X3C,0XE7,0X07,0X42,0X00,0X08,0XC2,0X20,0X82,0X18,0X45,0X31,0X08,0X4A,0X08,0X4A, +0X08,0X4A,0X08,0X4A,0X08,0X4A,0X07,0X4A,0X48,0X52,0X38,0XC6,0XFF,0XFF,0XF3,0X9C, +0XC6,0X39,0X86,0X39,0X0C,0X6B,0X3C,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0XC3,0X20,0X03,0X29,0XC7,0X41,0X08,0X4A,0X08,0X4A,0X07,0X4A, +0X04,0X29,0X82,0X18,0XC2,0X20,0X00,0X10,0XCB,0X62,0XFF,0XF7,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X34,0XAD,0X07,0X4A,0XC6,0X39,0X8A,0X5A,0X3C,0XE7, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XB2,0X9C,0X00,0X10,0X82,0X20,0X81,0X18,0XCB,0X62,0XBA,0XDE,0XBE,0XF7,0X7D,0XEF, +0X7D,0XEF,0X7D,0XEF,0X7D,0XEF,0X7D,0XEF,0X7D,0XEF,0XBE,0XF7,0XFF,0XFF,0XFF,0XFF, +0XFF,0XF7,0XBE,0XF7,0XBE,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0X82,0X18,0X85,0X39,0X79,0XCE,0XBE,0XFF,0X7D,0XEF,0X7E,0XEF, +0X78,0XCE,0X49,0X52,0X42,0X18,0X82,0X20,0X82,0X18,0X75,0XAD,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBF,0XF7,0XBE,0XF7,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X8A,0X5A,0X40,0X10,0X82,0X20,0XC7,0X41,0XFB,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBA,0XD6, +0XF7,0XBD,0XFB,0XDE,0XBE,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3C,0XE7, +0XF6,0XBD,0XF3,0X9C,0XF3,0X9C,0XF3,0X9C,0XF3,0X9C,0XB3,0X9C,0XF2,0X9C,0XB1,0X94, +0X79,0XCE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFE,0XFF,0X79,0XCE,0X34,0XAD,0XB3,0X9C, +0XF3,0X9C,0XF3,0X9C,0XF3,0X9C,0XF3,0X9C,0XB2,0X94,0XF3,0XA4,0X7D,0XEF,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0X82,0X18,0X86,0X39,0XFB,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X38,0XCE,0X04,0X31,0X81,0X18,0X40,0X18,0X8E,0X7B,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XBA,0XD6,0X34,0XAD,0XF3,0X9C,0XF3,0X9C,0XF3,0X9C,0X75,0XAD, +0XBA,0XD6,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X79,0XCE,0XB1,0X94,0X71,0X94,0X75,0XAD, +0X7D,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XF7,0X34,0XB5,0X71,0X94, +0XB1,0X94,0X38,0XC6,0XFF,0XFF,0XFB,0XDE,0XF7,0XC5,0XFA,0XDE,0XBE,0XF7,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7E,0XEF,0XF7,0XC5,0XF3,0XA4,0XB2,0X9C,0XF3,0X9C, +0XF3,0X9C,0XB1,0X94,0XB6,0XB5,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3C,0XEF,0XB6,0XB5, +0XF3,0X9C,0XF3,0X9C,0XF3,0X9C,0XF3,0X9C,0XB6,0XB5,0X7D,0XEF,0XFF,0XFF,0XFF,0XFF, +0X86,0X39,0X81,0X18,0X41,0X18,0X8E,0X7B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XF7,0XCF,0X83, +0X00,0X10,0X85,0X39,0XCF,0X7B,0X7D,0XEF,0XFF,0XFF,0XFF,0XFF,0X37,0XC6,0X49,0X4A, +0X82,0X20,0X00,0X08,0X00,0X10,0X00,0X10,0X00,0X10,0X40,0X10,0X40,0X10,0X00,0X00, +0XCF,0X83,0XBE,0XF7,0XFF,0XFF,0X7D,0XEF,0X2F,0X84,0X44,0X31,0X41,0X18,0X00,0X08, +0X00,0X08,0X00,0X08,0X00,0X10,0X41,0X18,0X00,0X00,0XC3,0X20,0X79,0XCE,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0X82,0X18,0X45,0X39,0XBA,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XCA,0X62,0X41,0X18,0X41,0X18,0XCB,0X62,0XFF,0XFF,0XFF,0XFF, +0XBE,0XF7,0XB2,0X94,0X45,0X31,0X41,0X18,0X00,0X10,0X00,0X08,0X00,0X10,0X81,0X18, +0X86,0X39,0XF3,0XA4,0XFF,0XFF,0XFF,0XFF,0X34,0XA5,0X00,0X08,0X00,0X00,0X82,0X20, +0X79,0XCE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X79,0XCE,0XC3,0X20,0X00,0X00, +0X40,0X08,0XB2,0X9C,0XFF,0XFF,0X71,0X94,0X82,0X20,0X85,0X31,0X4D,0X73,0X7D,0XEF, +0XFF,0XFF,0XFF,0XFF,0XFB,0XDE,0XCB,0X62,0X82,0X20,0X40,0X10,0X00,0X08,0X00,0X10, +0X00,0X08,0X00,0X00,0X8E,0X7B,0XBE,0XF7,0XFF,0XFF,0XB9,0XD6,0X49,0X5A,0X82,0X18, +0X40,0X10,0X00,0X08,0X00,0X08,0X41,0X10,0X82,0X18,0X8A,0X5A,0XBA,0XD6,0XFF,0XFF, +0X45,0X39,0X41,0X20,0X81,0X18,0X30,0X8C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XF7,0XCF,0X8B, +0X00,0X08,0X00,0X00,0XC7,0X39,0XFB,0XDE,0XFF,0XFF,0XBA,0XDE,0X86,0X39,0X00,0X08, +0X00,0X10,0X00,0X08,0X00,0X10,0X00,0X10,0X00,0X10,0X81,0X18,0XC2,0X20,0X00,0X10, +0XCF,0X8B,0XBE,0XF7,0XFF,0XFF,0XCF,0X7B,0X00,0X08,0X40,0X10,0X00,0X08,0X00,0X10, +0X00,0X18,0X00,0X10,0X41,0X18,0XC3,0X20,0X40,0X10,0X44,0X31,0X79,0XCE,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0X82,0X18,0X45,0X39,0XBA,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X0C,0X6B,0X41,0X18,0X41,0X18,0XCB,0X62,0XFF,0XFF,0XFF,0XFF, +0XF2,0X9C,0X41,0X10,0X00,0X08,0X00,0X10,0X00,0X10,0X00,0X18,0X00,0X10,0X00,0X08, +0X00,0X08,0X82,0X20,0X75,0XAD,0XFF,0XFF,0XBA,0XD6,0X85,0X39,0X00,0X08,0X40,0X10, +0XF3,0XA4,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X34,0XA5,0X01,0X10,0X00,0X10, +0X86,0X39,0X79,0XCE,0XFF,0XFF,0XB2,0X94,0X41,0X10,0X00,0X00,0X04,0X29,0XBA,0XDE, +0XFF,0XFF,0XFB,0XE6,0X49,0X52,0X00,0X00,0X00,0X10,0X00,0X10,0X00,0X18,0X00,0X18, +0X00,0X08,0X00,0X08,0XB6,0XB5,0XFF,0XFF,0XFB,0XDE,0X07,0X4A,0X00,0X08,0X01,0X10, +0X00,0X08,0X00,0X18,0X00,0X10,0X00,0X08,0X41,0X10,0X00,0X08,0X07,0X4A,0XFB,0XDE, +0X86,0X39,0X81,0X20,0X81,0X18,0X30,0X84,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XF7,0X2F,0X8C, +0X40,0X10,0X00,0X10,0X08,0X4A,0XFC,0XE6,0XFF,0XFF,0X0C,0X6B,0X00,0X08,0X82,0X20, +0X04,0X31,0X2F,0X8C,0X34,0XA5,0X34,0XA5,0XB2,0X94,0X86,0X39,0X81,0X10,0X00,0X10, +0XCF,0X8B,0XFF,0XFF,0X38,0XC6,0XC3,0X20,0X41,0X18,0XC2,0X20,0X89,0X5A,0XF3,0XA4, +0X34,0XAD,0X75,0XAD,0X0C,0X6B,0XC2,0X20,0X00,0X10,0X44,0X39,0X79,0XD6,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0X82,0X18,0X45,0X39,0XBA,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X0C,0X6B,0X41,0X18,0X41,0X18,0XCB,0X62,0XFF,0XFF,0XFB,0XDE, +0X45,0X31,0X00,0X10,0X81,0X18,0X08,0X4A,0XB2,0X9C,0XF3,0XA4,0XF3,0X9C,0X08,0X4A, +0X82,0X18,0X00,0X10,0X86,0X39,0X7C,0XE7,0XBE,0XF7,0XCB,0X62,0X00,0X08,0X00,0X10, +0X0C,0X73,0X7D,0XEF,0XFF,0XFF,0XFF,0XFF,0XBE,0XF7,0X4D,0X6B,0X00,0X10,0X41,0X18, +0XCB,0X62,0XBE,0XF7,0XFF,0XFF,0XB2,0X94,0XC3,0X20,0X00,0X18,0X86,0X39,0XFB,0XE6, +0XFF,0XFF,0XB1,0X94,0X00,0X00,0X81,0X18,0X04,0X21,0X4D,0X73,0X34,0XAD,0XF3,0XA4, +0XF3,0X9C,0X34,0XAD,0X7D,0XEF,0XFF,0XFF,0XCF,0X7B,0X00,0X08,0X82,0X20,0X04,0X29, +0X8E,0X7B,0X34,0XAD,0X34,0XAD,0X4D,0X7B,0XC3,0X28,0X82,0X20,0X00,0X08,0X30,0X8C, +0X86,0X39,0X81,0X20,0X81,0X18,0X30,0X84,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XF7,0XD0,0X8B, +0X00,0X10,0X40,0X08,0X08,0X4A,0X3C,0XE7,0X3C,0XEF,0X85,0X39,0X81,0X18,0X41,0X20, +0XCF,0X83,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3C,0XEF,0X49,0X5A,0X00,0X08,0X00,0X10, +0X30,0X8C,0XFF,0XFF,0XCF,0X83,0X41,0X10,0X41,0X18,0XC6,0X41,0XBA,0XDE,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X33,0XA5,0X81,0X18,0X00,0X10,0X44,0X39,0X79,0XD6,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0X82,0X18,0X45,0X39,0XBA,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X0C,0X6B,0X41,0X18,0X41,0X18,0XCB,0X62,0XFF,0XFF,0X75,0XAD, +0X41,0X10,0X40,0X10,0X85,0X31,0X38,0XC6,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBA,0XD6, +0X04,0X29,0X81,0X18,0X82,0X18,0X34,0XAD,0XFF,0XFF,0X2F,0X84,0X00,0X10,0X00,0X10, +0XC7,0X41,0XFB,0XE6,0XFF,0XFF,0XFF,0XFF,0XFB,0XDE,0X86,0X39,0X40,0X10,0X81,0X18, +0X30,0X8C,0XFF,0XFF,0XFF,0XFF,0XB2,0X94,0X82,0X20,0X00,0X10,0X86,0X39,0X3C,0XE7, +0XBE,0XF7,0X8A,0X5A,0X00,0X08,0X41,0X18,0XCB,0X62,0XBD,0XF7,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XF7,0XC7,0X41,0X41,0X18,0X82,0X18,0X4D,0X73, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X4D,0X7B,0X82,0X20,0X41,0X18,0XC7,0X49, +0X86,0X39,0X81,0X20,0X81,0X18,0X30,0X84,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X79,0XCE,0X30,0X84,0X75,0XB5,0XBA,0XD6,0XFF,0XFF,0XBE,0XF7,0XD0,0X8B, +0X00,0X10,0X40,0X08,0X08,0X4A,0X3C,0XE7,0XFB,0XDE,0X44,0X31,0X81,0X18,0X41,0X18, +0X34,0XAD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3C,0XE7,0X49,0X52,0X00,0X08,0X00,0X10, +0X30,0X8C,0XFF,0XFF,0X0C,0X6B,0X41,0X18,0X41,0X18,0X8A,0X5A,0XBF,0XF7,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF3,0X9C,0X82,0X18,0X00,0X10,0X44,0X39,0X79,0XD6,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0X82,0X18,0X45,0X39,0XBA,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X0C,0X6B,0X41,0X18,0X41,0X18,0XCB,0X62,0XFF,0XFF,0X71,0X94, +0X40,0X10,0X40,0X10,0XC7,0X41,0X38,0XC6,0XFB,0XDE,0XBA,0XD6,0XBA,0XD6,0X79,0XCE, +0X85,0X31,0X81,0X20,0X81,0X18,0X71,0X94,0XFF,0XFF,0X75,0XB5,0XC2,0X20,0X00,0X08, +0XC3,0X28,0X38,0XC6,0XFF,0XFF,0XFF,0XFF,0X38,0XCE,0XC2,0X20,0X81,0X18,0XC3,0X28, +0X75,0XB5,0XFF,0XFF,0XFF,0XFF,0XB2,0X94,0X82,0X20,0X00,0X10,0X86,0X39,0X3C,0XE7, +0X7D,0XEF,0X08,0X4A,0X00,0X10,0X82,0X20,0X2F,0X84,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0XEF,0X45,0X31,0X81,0X20,0X81,0X18,0X8E,0X7B, +0X3C,0XE7,0XBA,0XD6,0XBA,0XD6,0X3C,0XE7,0X2F,0X84,0X82,0X20,0X81,0X20,0X45,0X31, +0X86,0X39,0X81,0X20,0X81,0X18,0X30,0X84,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XB6,0XBD,0XC3,0X18,0X41,0X10,0X86,0X39,0X38,0XC6,0XFF,0XFF,0XD0,0X8B, +0X00,0X10,0X40,0X08,0X08,0X4A,0X3C,0XE7,0XFB,0XDE,0X05,0X39,0X81,0X18,0X41,0X18, +0X34,0XA5,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3C,0XE7,0X49,0X52,0X00,0X08,0X00,0X10, +0X30,0X8C,0XFF,0XFF,0X4D,0X6B,0X41,0X18,0X41,0X18,0X8A,0X5A,0XBE,0XF7,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF3,0X9C,0X82,0X18,0X00,0X10,0X44,0X39,0X79,0XD6,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0X82,0X18,0X45,0X39,0XBA,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X0C,0X6B,0X41,0X18,0X41,0X18,0XCC,0X62,0XFF,0XFF,0X70,0X94, +0X40,0X10,0XC2,0X20,0X03,0X29,0X44,0X31,0X85,0X39,0X85,0X39,0X85,0X39,0X85,0X31, +0X03,0X21,0X82,0X20,0X82,0X20,0X30,0X8C,0XFF,0XFF,0XBA,0XDE,0XC7,0X41,0X00,0X08, +0X00,0X10,0X71,0X94,0XFF,0XFF,0XFF,0XFF,0X71,0X94,0X40,0X10,0X82,0X18,0X86,0X41, +0XFB,0XDE,0XFF,0XFF,0XFF,0XFF,0XB2,0X94,0X82,0X20,0X00,0X10,0X86,0X39,0X3C,0XE7, +0X7D,0XEF,0X08,0X4A,0X00,0X10,0X82,0X20,0XCF,0X83,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0XEF,0X45,0X31,0X82,0X20,0XC3,0X20,0X03,0X29, +0X85,0X39,0X85,0X39,0X85,0X39,0X85,0X39,0X04,0X29,0XC3,0X20,0X82,0X20,0X45,0X31, +0X86,0X39,0X81,0X20,0X81,0X18,0X30,0X84,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF7,0XBD,0XC3,0X20,0X41,0X10,0XC2,0X20,0XB6,0XBD,0XFF,0XFF,0XD0,0X8B, +0X00,0X10,0X40,0X08,0X08,0X4A,0X3C,0XE7,0XFB,0XDE,0X05,0X39,0X81,0X18,0X41,0X18, +0XF3,0X9C,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3C,0XE7,0X49,0X52,0X00,0X08,0X00,0X10, +0X30,0X8C,0XFF,0XFF,0X4D,0X6B,0X41,0X18,0X41,0X18,0X8A,0X5A,0XBE,0XF7,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF3,0X9C,0X82,0X18,0X00,0X10,0X44,0X39,0X79,0XD6,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0X82,0X18,0X45,0X39,0XBA,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X0C,0X6B,0X41,0X18,0X41,0X18,0XCC,0X62,0XFF,0XFF,0XB0,0X94, +0X40,0X10,0XC3,0X20,0XC3,0X20,0X41,0X10,0X00,0X10,0X40,0X18,0X40,0X10,0X40,0X18, +0X81,0X18,0X41,0X18,0X41,0X10,0X30,0X84,0XFF,0XFF,0XBE,0XF7,0X0D,0X6B,0X40,0X10, +0X00,0X10,0XCB,0X6A,0X7D,0XF7,0XFF,0XFF,0XCA,0X62,0X41,0X18,0X41,0X18,0XCA,0X62, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB2,0X94,0X82,0X20,0X00,0X10,0X86,0X39,0X3C,0XE7, +0X7D,0XEF,0X08,0X4A,0X00,0X10,0X82,0X20,0XCF,0X7B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0XEF,0X45,0X31,0X82,0X20,0XC3,0X20,0X81,0X20, +0X00,0X18,0X40,0X18,0X40,0X18,0X00,0X10,0X41,0X10,0X82,0X18,0X41,0X18,0X04,0X29, +0X86,0X39,0X81,0X20,0X81,0X18,0XCF,0X83,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF7,0XB5,0XC3,0X28,0X41,0X20,0XC3,0X28,0XB6,0XBD,0XFF,0XFF,0XD0,0X8B, +0X00,0X10,0X40,0X08,0X08,0X4A,0X3C,0XE7,0XFB,0XDE,0X05,0X39,0X81,0X18,0X41,0X18, +0XF3,0XA4,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3C,0XE7,0X49,0X52,0X00,0X08,0X00,0X10, +0X30,0X8C,0XFF,0XFF,0X4D,0X6B,0X41,0X18,0X41,0X18,0X8A,0X5A,0XBE,0XF7,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF3,0X9C,0X82,0X18,0X00,0X10,0X44,0X39,0X79,0XD6,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0X82,0X18,0X45,0X39,0XBA,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0X0C,0X6B,0X41,0X18,0X41,0X18,0XCC,0X62,0XFF,0XFF,0X70,0X94, +0X40,0X10,0XC1,0X20,0X04,0X31,0X08,0X52,0X8A,0X52,0X49,0X52,0X49,0X52,0X49,0X52, +0X49,0X52,0X49,0X52,0X48,0X52,0X34,0XAD,0XFF,0XFF,0XFF,0XFF,0XB2,0X9C,0X82,0X20, +0X00,0X08,0X45,0X31,0XBA,0XD6,0X7D,0XF7,0X45,0X31,0X41,0X20,0X82,0X20,0X71,0X8C, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB2,0X94,0X82,0X20,0X00,0X10,0X86,0X39,0X3C,0XE7, +0X7D,0XEF,0X08,0X4A,0X00,0X10,0X82,0X20,0XCF,0X7B,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0XEF,0X45,0X31,0X82,0X20,0XC2,0X20,0X86,0X41, +0X8A,0X5A,0X49,0X52,0X49,0X52,0X49,0X52,0X49,0X52,0X49,0X52,0X49,0X52,0XCB,0X62, +0X07,0X4A,0X81,0X18,0X41,0X18,0XCB,0X6A,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF7,0XBD,0XC3,0X28,0X41,0X20,0XC3,0X28,0XB6,0XBD,0XFF,0XFF,0XD0,0X8B, +0X00,0X10,0X40,0X08,0X08,0X4A,0X3C,0XE7,0XFB,0XDE,0X44,0X31,0X81,0X18,0X41,0X18, +0X34,0XA5,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3C,0XE7,0X49,0X52,0X00,0X08,0X00,0X10, +0X30,0X8C,0XFF,0XFF,0X0C,0X6B,0X41,0X18,0X41,0X18,0X8A,0X5A,0XBE,0XF7,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF3,0X9C,0X82,0X18,0X00,0X10,0X44,0X39,0X79,0XD6,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0X82,0X18,0X45,0X39,0XBA,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X3C,0XE7,0X08,0X4A,0X81,0X18,0X41,0X18,0X4D,0X6B,0XFF,0XFF,0X30,0X94, +0X00,0X10,0X00,0X08,0X08,0X4A,0XFB,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XBD,0X04,0X31, +0X40,0X10,0X81,0X18,0XB6,0XBD,0XB6,0XBD,0X82,0X20,0X82,0X18,0X04,0X29,0X78,0XCE, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB2,0X94,0X82,0X20,0X00,0X10,0X86,0X39,0X3C,0XE7, +0X7D,0XEF,0X07,0X4A,0X00,0X10,0X82,0X20,0X2F,0X84,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0XEF,0X45,0X31,0X81,0X20,0X82,0X20,0X71,0X8C, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X8E,0X7B,0X00,0X10,0X82,0X20,0XC3,0X28,0X33,0XA5,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XF7,0XC5,0XC3,0X28,0X41,0X18,0XC3,0X28,0XB6,0XBD,0XFF,0XFF,0XD0,0X8B, +0X00,0X10,0X40,0X08,0X08,0X4A,0X3C,0XE7,0X7C,0XE7,0X85,0X39,0X81,0X18,0X41,0X20, +0X30,0X84,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3C,0XEF,0X49,0X5A,0X00,0X08,0X00,0X10, +0X30,0X8C,0XFF,0XFF,0X8E,0X7B,0X41,0X10,0X81,0X18,0X07,0X4A,0XFB,0XDE,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XF3,0X9C,0X82,0X20,0X00,0X10,0X44,0X39,0X79,0XD6,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0X82,0X18,0X85,0X39,0XBA,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0X71,0X8C,0X82,0X20,0X82,0X20,0X41,0X18,0X71,0X94,0XFF,0XFF,0XF4,0XA4, +0X41,0X10,0X40,0X10,0X85,0X31,0X38,0XC6,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,0XE6,0X08,0X4A, +0X41,0X18,0X00,0X08,0X70,0X8C,0X4E,0X7B,0X81,0X18,0X41,0X18,0X08,0X52,0X7D,0XF7, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB2,0X94,0X82,0X20,0X00,0X10,0X86,0X39,0X3C,0XE7, +0XBE,0XF7,0X89,0X5A,0X00,0X08,0X41,0X18,0X0C,0X6B,0XBE,0XF7,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XF7,0XC6,0X41,0X41,0X18,0X81,0X18,0X4D,0X73, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XF7,0XC5,0X82,0X20,0X41,0X18,0X41,0X18,0X44,0X29,0X2F,0X84,0X75,0XAD,0X34,0XAD, +0XB6,0XBD,0X2F,0X84,0XC2,0X20,0X82,0X20,0XC3,0X28,0XB6,0XBD,0XFF,0XFF,0X30,0X8C, +0X40,0X10,0X40,0X10,0X08,0X4A,0XFC,0XE6,0XFF,0XFF,0XCB,0X6A,0X00,0X10,0X82,0X20, +0X45,0X39,0XB2,0X94,0XB5,0XB5,0X75,0XB5,0X33,0XA5,0XC6,0X41,0X40,0X18,0X00,0X10, +0XCF,0X8B,0XFF,0XFF,0XF7,0XBD,0X82,0X20,0X41,0X18,0XC2,0X20,0X0C,0X6B,0XB5,0XB5, +0X75,0XB5,0XB6,0XB5,0X4D,0X73,0XC2,0X20,0X40,0X10,0X44,0X39,0X79,0XD6,0XFF,0XFF, +0XF3,0XA4,0X41,0X10,0XC2,0X20,0X44,0X31,0XB2,0X94,0XB6,0XB5,0X34,0XAD,0X75,0XAD, +0X4D,0X73,0XC2,0X20,0X82,0X20,0X41,0X18,0X45,0X39,0XFB,0XDE,0XFF,0XFF,0XBA,0XD6, +0X45,0X31,0X40,0X10,0X81,0X18,0X49,0X52,0X34,0XAD,0X75,0XB5,0X34,0XAD,0X34,0XAD, +0X74,0XAD,0X34,0XA5,0X38,0XC6,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X4D,0X73, +0X41,0X18,0X81,0X18,0X85,0X41,0X45,0X39,0XC2,0X20,0X41,0X10,0X8E,0X73,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB2,0X94,0XC3,0X20,0X40,0X10,0X86,0X39,0XFB,0XE6, +0XFF,0XFF,0X70,0X8C,0X00,0X08,0X81,0X18,0X04,0X31,0XCF,0X83,0XB6,0XB5,0X74,0XAD, +0X35,0XAD,0X34,0XA5,0X38,0XC6,0XBE,0XF7,0XCE,0X7B,0X00,0X08,0X82,0X18,0X44,0X31, +0X71,0X8C,0X75,0XB5,0X74,0XAD,0X34,0XAD,0X74,0XAD,0X34,0XAD,0X75,0XAD,0X7D,0XEF, +0XBE,0XFF,0X30,0X8C,0X00,0X08,0X00,0X10,0X40,0X10,0X00,0X08,0X40,0X10,0X01,0X18, +0X40,0X10,0X81,0X18,0XC2,0X20,0X81,0X18,0XC3,0X28,0XB6,0XBD,0XFF,0XFF,0XCF,0X83, +0X00,0X10,0X00,0X08,0X08,0X4A,0XFB,0XDE,0XFF,0XFF,0X38,0XCE,0X45,0X31,0X00,0X10, +0X00,0X10,0X00,0X10,0X40,0X18,0X00,0X18,0X40,0X18,0XC2,0X20,0XC2,0X20,0X00,0X10, +0XD0,0X8B,0XBE,0XF7,0XFF,0XFF,0X4D,0X6B,0X00,0X10,0X40,0X10,0X00,0X10,0X40,0X10, +0X40,0X18,0X40,0X10,0X41,0X18,0XC3,0X20,0X01,0X10,0X44,0X31,0X79,0XCE,0XFF,0XFF, +0XF3,0X9C,0X00,0X10,0XC3,0X20,0X82,0X18,0X41,0X18,0X40,0X18,0X01,0X18,0X40,0X10, +0X00,0X08,0X00,0X10,0X40,0X10,0X82,0X20,0X33,0XA5,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X71,0X8C,0X00,0X08,0X00,0X10,0X00,0X10,0X00,0X10,0X00,0X18,0X00,0X18,0X00,0X18, +0X40,0X10,0X41,0X08,0X71,0X94,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X33,0XA5, +0X81,0X18,0X41,0X10,0X41,0X18,0X81,0X18,0X41,0X10,0X82,0X10,0X75,0XAD,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB2,0X94,0X82,0X18,0X40,0X10,0X45,0X31,0XBA,0XDE, +0XFF,0XFF,0XFB,0XDE,0XC7,0X41,0X00,0X00,0X40,0X10,0X00,0X10,0X40,0X10,0X40,0X18, +0X00,0X10,0X00,0X00,0X8E,0X7B,0XBE,0XF7,0XFB,0XDE,0X85,0X39,0X00,0X08,0X40,0X10, +0X00,0X10,0X40,0X10,0X40,0X18,0X00,0X18,0X40,0X18,0X00,0X00,0X45,0X31,0X3C,0XE7, +0XFF,0XFF,0XBE,0XF7,0X70,0X8C,0X45,0X39,0X41,0X18,0X00,0X10,0X00,0X10,0X00,0X10, +0X00,0X10,0X00,0X10,0X40,0X10,0X00,0X08,0X41,0X18,0XB6,0XBD,0XFF,0XFF,0XCF,0X7B, +0X00,0X00,0X00,0X00,0XC7,0X39,0XFB,0XDE,0XFF,0XFF,0XFF,0XFF,0XB6,0XB5,0XC7,0X49, +0X82,0X18,0X00,0X10,0X00,0X10,0X00,0X08,0X00,0X10,0X82,0X20,0X03,0X21,0X00,0X10, +0XD0,0X8B,0XBE,0XF7,0XFF,0XFF,0X3C,0XE7,0X4D,0X7B,0X04,0X29,0X41,0X10,0X00,0X10, +0X00,0X10,0X00,0X10,0X00,0X10,0X40,0X10,0X00,0X00,0XC3,0X20,0X79,0XCE,0XFF,0XFF, +0XB2,0X94,0X00,0X00,0X40,0X10,0X40,0X10,0X00,0X10,0X00,0X10,0X00,0X10,0X00,0X10, +0X00,0X10,0XC1,0X18,0XC7,0X49,0X34,0XAD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X7D,0XEF,0X30,0X84,0X04,0X31,0X40,0X10,0X00,0X10,0X00,0X10,0X00,0X10,0X00,0X10, +0X00,0X00,0XC3,0X20,0X79,0XCE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0XEF, +0X4D,0X73,0X81,0X18,0X00,0X08,0X00,0X10,0X41,0X18,0X0C,0X73,0X7D,0XEF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X30,0X8C,0X00,0X08,0X00,0X00,0X04,0X29,0XFB,0XDE, +0XFF,0XFF,0XFF,0XFF,0X79,0XCE,0X4A,0X52,0X82,0X20,0X00,0X10,0X00,0X08,0X00,0X10, +0X00,0X08,0X00,0X08,0X34,0XAD,0XFF,0XFF,0XFF,0XFF,0X38,0XC6,0X08,0X52,0X82,0X18, +0X00,0X10,0X00,0X10,0X00,0X10,0X00,0X10,0X00,0X10,0X00,0X00,0X4D,0X6B,0XBE,0XF7, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBA,0XD6,0XF3,0X9C,0XCE,0X7B,0XCE,0X7B,0XCE,0X83, +0XCE,0X83,0XCE,0X83,0XCE,0X83,0X8E,0X7B,0XCF,0X7B,0XFB,0XD6,0XFF,0XFF,0XB6,0XBD, +0X8D,0X7B,0X4D,0X73,0XB2,0X94,0X7D,0XEF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFB,0XDE, +0X34,0XAD,0XCF,0X83,0XCE,0X83,0X2F,0X84,0X8E,0X7B,0X86,0X39,0X81,0X18,0X00,0X10, +0XCF,0X8B,0XBE,0XF7,0XFF,0XFF,0XFF,0XFF,0XBE,0XF7,0XF8,0XBD,0X30,0X94,0XCE,0X7B, +0XCE,0X83,0XCE,0X83,0XCE,0X83,0XCE,0X83,0X8E,0X7B,0X30,0X84,0X3B,0XEF,0XFF,0XFF, +0X38,0XCE,0X8D,0X73,0XCE,0X83,0XCE,0X83,0XCE,0X83,0XCE,0X83,0XCE,0X83,0XCE,0X7B, +0XCF,0X83,0X74,0XAD,0XFB,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XBE,0XF7,0X79,0XCE,0X72,0X94,0XCE,0X7B,0XCE,0X7B,0XCE,0X83,0XCE,0X7B, +0X8E,0X7B,0XB2,0X94,0XBE,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0X7D,0XEF,0X34,0XAD,0XCF,0X7B,0X8E,0X7B,0X34,0XAD,0X7D,0XEF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XC5,0XCE,0X7B,0X8E,0X7B,0X71,0X8C,0X7D,0XEF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X7D,0XEF,0X75,0XB5,0XCF,0X83,0X8E,0X83,0XCF,0X83, +0X8E,0X7B,0XCF,0X8B,0X3C,0XE7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3C,0XE7,0X74,0XAD, +0X2F,0X84,0XCE,0X83,0XCE,0X83,0XCE,0X83,0XCE,0X7B,0X4D,0X73,0X38,0XCE,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X3C,0XE7,0X49,0X52,0X00,0X10,0X40,0X10, +0X30,0X8C,0XBE,0XF7,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XF7, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XBE,0XF7,0X7D,0XEF, +0X7D,0XF7,0X7D,0XF7,0XBE,0XF7,0XBE,0XF7,0X33,0XA5,0XC3,0X28,0X41,0X18,0X40,0X10, +0X74,0XAD,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XB6,0XBD,0XC7,0X49, +0XC7,0X41,0XC7,0X49,0X08,0X4A,0XC7,0X49,0X04,0X29,0XC2,0X20,0X00,0X08,0XC7,0X41, +0XFB,0XDE,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0X79,0XD6,0XC3,0X28, +0X00,0X10,0X41,0X18,0X41,0X18,0X41,0X18,0X41,0X18,0X00,0X10,0X45,0X31,0XF7,0XBD, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XCA,0X62, +0XC2,0X20,0X04,0X29,0X04,0X29,0X03,0X29,0X85,0X39,0X4D,0X7B,0XBA,0XDE,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF,0XFF, +}; diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/picture.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/picture.h new file mode 100644 index 0000000..c25d916 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/picture.h @@ -0,0 +1,44 @@ +/*! + \file picture.h + \brief picture header file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef PICTURE_H +#define PICTURE_H + +#include "gd32vf103.h" + +#define BMP_HEADSIZE (8) + +extern const uint8_t picture[]; + +#endif /* PICTURE_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/readme.txt new file mode 100644 index 0000000..de49140 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/LCD/readme.txt @@ -0,0 +1,40 @@ +/*! + \file readme.txt + \brief description of the EXMC_LCD demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use EXMC +peripheral to drive LCD. This board uses EXMC_NE0 to support LCD. You can see +GigaDevice logo and website on the LCD screen. + + JP13 and JP14 must be fitted to EXMC. + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/exmc_norflash.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/exmc_norflash.c new file mode 100644 index 0000000..7b85989 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/exmc_norflash.c @@ -0,0 +1,340 @@ +/*! + \file exmc_norflash.c + \brief EXMC NOR Flash(M29W128FH) driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "exmc_norflash.h" + +#define BANK0_NOR1_ADDR ((uint32_t)0x60000000) +#define BANK_NORFLASH_ADDR BANK0_NOR1_ADDR + +#define BLOCKERASE_TIMEOUT ((uint32_t)0x00A00000) +#define CHIPERASE_TIMEOUT ((uint32_t)0x30000000) +#define PROGRAM_TIMEOUT ((uint32_t)0x00001400) + +#define ADDR_SHIFT(A) (BANK_NORFLASH_ADDR + (2 * (A))) +#define NOR_WRITE(Address, Data) (*(__IO uint16_t *)(Address) = (Data)) + +/*! + \brief nor flash peripheral initialize + \param[in] none + \param[out] none + \retval none +*/ +void exmc_norflash_init(void) +{ + exmc_norsram_parameter_struct nor_init_struct; + exmc_norsram_timing_parameter_struct nor_timing_init_struct; + + /* EXMC clock enable */ + rcu_periph_clock_enable(RCU_EXMC); + + /* EXMC enable */ + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_GPIOD); + rcu_periph_clock_enable(RCU_GPIOE); + + /* configure EXMC_D[0~15]*/ + /* PD14(EXMC_D0), PD15(EXMC_D1),PD0(EXMC_D2), PD1(EXMC_D3), PD8(EXMC_D13), PD9(EXMC_D14), PD10(EXMC_D15) */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_8 | GPIO_PIN_9 | + GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15); + + /* PE7(EXMC_D4), PE8(EXMC_D5), PE9(EXMC_D6), PE10(EXMC_D7), PE11(EXMC_D8), PE12(EXMC_D9), + PE13(EXMC_D10), PE14(EXMC_D11), PE15(EXMC_D12) */ + gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, 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); + + /* PD11(EXMC_A16), PD12(EXMC_A17), PD13(EXMC_A18) */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13); + + /* PE3(EXMC_A19), PE4(EXMC_A20), PE5(EXMC_A21), PE6(EXMC_A22) */ + gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3 | GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_6); + + /* configure PD4(NOE), PD5(NWE), PD7(NE0) */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7); + + /* configure NADV */ + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7); + + /* configure NWAIT */ + gpio_init(GPIOD, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, GPIO_PIN_6); + + nor_timing_init_struct.bus_latency = 1; + nor_timing_init_struct.asyn_data_setuptime = 7; + nor_timing_init_struct.asyn_address_holdtime = 2; + nor_timing_init_struct.asyn_address_setuptime = 6; + + nor_init_struct.norsram_region = EXMC_BANK0_NORSRAM_REGION0; + nor_init_struct.asyn_wait = DISABLE; + nor_init_struct.nwait_signal = DISABLE; + nor_init_struct.memory_write = ENABLE; + nor_init_struct.nwait_polarity = EXMC_NWAIT_POLARITY_LOW; + nor_init_struct.databus_width = EXMC_NOR_DATABUS_WIDTH_16B; + nor_init_struct.memory_type = EXMC_MEMORY_TYPE_NOR; + nor_init_struct.address_data_mux = ENABLE; + nor_init_struct.read_write_timing = &nor_timing_init_struct; + + exmc_norsram_init(&nor_init_struct); + + exmc_norsram_enable(EXMC_BANK0_NORSRAM_REGION0); +} + + +/*! + \brief read NOR memory's manufacturer, device code, block_protection_indicator, block_protection_status + \param[in] nor_id: pointer to a nor_idtypedef structure + \param[out] none + \retval none +*/ +void nor_read_id(nor_id_struct* nor_id) +{ + NOR_WRITE(ADDR_SHIFT(CMD_READID_ADD_1ST), CMD_READID_DATA_1ST); + NOR_WRITE(ADDR_SHIFT(CMD_READID_ADD_2ND), CMD_READID_DATA_2ND); + NOR_WRITE(ADDR_SHIFT(CMD_READID_ADD_3RD), CMD_READID_DATA_3RD); + + /* read NOR Flash ID */ + nor_id->manufacturer_code = *(__IO uint16_t *) ADDR_SHIFT(0x0000); + nor_id->device_code1 = *(__IO uint16_t *) ADDR_SHIFT(0x0001); + nor_id->device_code2 = *(__IO uint16_t *) ADDR_SHIFT(0x000E); + nor_id->device_code3 = *(__IO uint16_t *) ADDR_SHIFT(0x000F); +} + +/*! + \brief erase the specified nor flash block + \param[in] blockaddr: address of the block to be erased + \param[out] none + \retval NOR_SUCCESS,NOR_ERROR,NOR_TIMEOUT +*/ +nor_status_struct nor_eraseblock(uint32_t blockaddr) +{ + NOR_WRITE(ADDR_SHIFT(CMD_BLOCKERASE_ADD_1ST), CMD_BLOCKERASE_DATA_1ST); + NOR_WRITE(ADDR_SHIFT(CMD_BLOCKERASE_ADD_2ND), CMD_BLOCKERASE_DATA_2ND); + NOR_WRITE(ADDR_SHIFT(CMD_BLOCKERASE_ADD_3RD), CMD_BLOCKERASE_DATA_3RD); + NOR_WRITE(ADDR_SHIFT(CMD_BLOCKERASE_ADD_4TH), CMD_BLOCKERASE_DATA_4TH); + NOR_WRITE(ADDR_SHIFT(CMD_BLOCKERASE_ADD_5TH), CMD_BLOCKERASE_DATA_5TH); + NOR_WRITE((BANK_NORFLASH_ADDR + blockaddr), CMD_BLOCKERASE_DATA_6TH); + + return (nor_get_status(BLOCKERASE_TIMEOUT)); +} + +/*! + \brief erase the entire chip + \param[in] none + \param[out] none + \retval NOR_SUCCESS,NOR_ERROR,NOR_TIMEOUT +*/ +nor_status_struct nor_erasechip(void) +{ + NOR_WRITE(ADDR_SHIFT(CMD_CHIPERASE_ADD_1ST), CMD_CHIPERASE_DATA_1ST); + NOR_WRITE(ADDR_SHIFT(CMD_CHIPERASE_ADD_2ND), CMD_CHIPERASE_DATA_2ND); + NOR_WRITE(ADDR_SHIFT(CMD_CHIPERASE_ADD_3RD), CMD_CHIPERASE_DATA_3RD); + NOR_WRITE(ADDR_SHIFT(CMD_CHIPERASE_ADD_4TH), CMD_CHIPERASE_DATA_4TH); + NOR_WRITE(ADDR_SHIFT(CMD_CHIPERASE_ADD_5TH), CMD_CHIPERASE_DATA_5TH); + NOR_WRITE(ADDR_SHIFT(CMD_CHIPERASE_ADD_6TH), CMD_CHIPERASE_DATA_6TH); + + return (nor_get_status(CHIPERASE_TIMEOUT)); +} + +/*! + \brief write a half-word to the specified address of nor flash + \param[in] writeaddr: NOR flash internal address to write to + \param[in] data: data to be written + \param[out] none + \retval NOR_SUCCESS,NOR_ERROR,NOR_TIMEOUT +*/ +nor_status_struct nor_write_halfword(uint32_t writeaddr, uint16_t data) +{ + NOR_WRITE(ADDR_SHIFT(CMD_WRITE_ADD_1ST), CMD_WRITE_DATA_1ST); + NOR_WRITE(ADDR_SHIFT(CMD_WRITE_ADD_2ND), CMD_WRITE_DATA_2ND); + NOR_WRITE(ADDR_SHIFT(CMD_WRITE_ADD_3RD), CMD_WRITE_DATA_3RD); + NOR_WRITE((BANK_NORFLASH_ADDR + writeaddr), data); + + return (nor_get_status(PROGRAM_TIMEOUT)); +} + +/*! + \brief write a half-word buffer to the specified address of nor flash + \param[in] pbuffer: pointer to a half-word buffer + \param[in] writeaddr: NOR flash internal address from which the data will be written + \param[in] halfword_count: count of half words to write + \param[out] none + \retval NOR_SUCCESS,NOR_ERROR,NOR_TIMEOUT +*/ +nor_status_struct nor_write_buffer(uint16_t* pbuffer, uint32_t writeaddr, uint32_t halfword_count) +{ + nor_status_struct status = NOR_ONGOING; + + do{ + /* write data to nor flash */ + status = nor_write_halfword(writeaddr, *pbuffer++); + writeaddr = writeaddr + 2; + halfword_count--; + }while((NOR_SUCCESS == status) && (halfword_count != 0)); + + return (status); +} + +/*! + \brief read a half-word from the specified address of nor flash + \param[in] readaddr: NOR flash internal address to read from + \param[out] none + \retval A half-word read from the nor flash +*/ +uint16_t nor_read_halfword(uint32_t readaddr) +{ + NOR_WRITE(ADDR_SHIFT(CMD_READ_ADD_1ST), CMD_READ_DATA_1ST); + NOR_WRITE(ADDR_SHIFT(CMD_READ_ADD_2ND), CMD_READ_DATA_2ND); + NOR_WRITE((BANK_NORFLASH_ADDR + readaddr), CMD_READ_DATA_3RD); + + return (*(__IO uint16_t *)((BANK_NORFLASH_ADDR + readaddr))); +} + +/*! + \brief read a set of data from the specified address of nor flash + \param[in] pbuffer: pointer to a half-word buffer + \param[in] readaddr: NOR flash internal address to read from + \param[in] halfword_count: count of half words to write + \param[out] none + \retval none +*/ +void nor_readbuffer(uint16_t* pbuffer, uint32_t readaddr, uint32_t halfword_count) +{ + NOR_WRITE(ADDR_SHIFT(CMD_READ_ADD_1ST), CMD_READ_DATA_1ST); + NOR_WRITE(ADDR_SHIFT(CMD_READ_ADD_2ND), CMD_READ_DATA_2ND); + NOR_WRITE((BANK_NORFLASH_ADDR + readaddr), CMD_READ_DATA_3RD); + + for(; halfword_count != 0x00; halfword_count--){ + /* read a halfword from the nor flash */ + *pbuffer++ = *(__IO uint16_t *)((BANK_NORFLASH_ADDR + readaddr)); + readaddr = readaddr + 2; + } +} + +/*! + \brief return the nor flash to read mode and reset the errors in the nor flash status register + \param[in] none + \param[out] none + \retval none +*/ +void nor_reset(void) +{ + NOR_WRITE(ADDR_SHIFT(CMD_RESET_ADD_1ST), CMD_RESET_DATA_1ST); + NOR_WRITE(ADDR_SHIFT(CMD_RESET_ADD_2ND), CMD_RESET_DATA_2ND); + NOR_WRITE(BANK_NORFLASH_ADDR , CMD_RESET_DATA_3RD); +} + +/*! + \brief return the nor flash to read mode + \param[in] none + \param[out] none + \retval none +*/ +void nor_return_to_read_mode(void) +{ + NOR_WRITE(BANK_NORFLASH_ADDR , CMD_RESET_DATA_3RD); +} + +/*! + \brief return the nor flash operation status + \param[in] time_out: NOR flash programming timeout + \param[out] none + \retval none +*/ +nor_status_struct nor_get_status(uint32_t time_out) +{ + uint16_t val1 = 0x00, val2 = 0x00; + nor_status_struct status = NOR_ONGOING; + uint32_t timeout = time_out; + + /* poll on nor flash ready/busy signal */ + while(RESET != (gpio_input_bit_get(GPIOD, GPIO_PIN_6)) && (timeout > 0)){ + timeout--; + } + + timeout = time_out; + + while((gpio_input_bit_get(GPIOD, GPIO_PIN_6) == RESET) && (timeout > 0)){ + timeout--; + } + + /* get the nor flash operation status */ + while((time_out != 0x00) && (status != NOR_SUCCESS)){ + time_out--; + + /* read DQ6 and DQ5 */ + val1 = *(__IO uint16_t *)(BANK_NORFLASH_ADDR ); + val2 = *(__IO uint16_t *)(BANK_NORFLASH_ADDR ); + + if((val1 & 0x0040) == (val2 & 0x0040)) { + return NOR_SUCCESS; + } + + if((val1 & 0x0020) != 0x0020){ + status = NOR_ONGOING; + } + + val1 = *(__IO uint16_t *)(BANK_NORFLASH_ADDR ); + val2 = *(__IO uint16_t *)(BANK_NORFLASH_ADDR ); + + if((val1 & 0x0040) == (val2 & 0x0040)) { + return NOR_SUCCESS; + }else if((val1 & 0x0020) == 0x0020){ + return NOR_ERROR; + } + } + + if(time_out == 0x00){ + status = NOR_TIMEOUT; + } + + return (status); +} + +/*! + \brief fill the buffer with specified value + \param[in] pbuffer: pointer on the buffer to fill + \param[in] buffer_lenght: length of the buffer to fill + \param[in] value: value to fill on the buffer + \param[out] none + \retval none +*/ +void nor_fill_buffer(uint16_t *pbuffer, uint16_t buffer_lenght, uint32_t value) +{ + uint16_t index = 0; + + /* put in global buffer same values */ + for (index = 0; index < buffer_lenght; index++ ){ + pbuffer[index] = value + index; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/exmc_norflash.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/exmc_norflash.h new file mode 100644 index 0000000..e9798a9 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/exmc_norflash.h @@ -0,0 +1,145 @@ +/*! + \file exmc_norflash.h + \brief the header file of EXMC NOR Flash(M29W128FH) driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +#ifndef EXMC_NORFLASH_H +#define EXMC_NORFLASH_H + +/* read id command define */ +#define CMD_READID_ADD_1ST 0x0555 +#define CMD_READID_DATA_1ST 0x00AA +#define CMD_READID_ADD_2ND 0x02AA +#define CMD_READID_DATA_2ND 0x0055 +#define CMD_READID_ADD_3RD 0x0555 +#define CMD_READID_DATA_3RD 0x0090 + +/* block erase command define */ +#define CMD_BLOCKERASE_ADD_1ST 0x0555 +#define CMD_BLOCKERASE_DATA_1ST 0x00AA +#define CMD_BLOCKERASE_ADD_2ND 0x02AA +#define CMD_BLOCKERASE_DATA_2ND 0x0055 +#define CMD_BLOCKERASE_ADD_3RD 0x0555 +#define CMD_BLOCKERASE_DATA_3RD 0x0080 +#define CMD_BLOCKERASE_ADD_4TH 0x0555 +#define CMD_BLOCKERASE_DATA_4TH 0x00AA +#define CMD_BLOCKERASE_ADD_5TH 0x02AA +#define CMD_BLOCKERASE_DATA_5TH 0x0055 +#define CMD_BLOCKERASE_DATA_6TH 0x0030 + +/* chip erase command define */ +#define CMD_CHIPERASE_ADD_1ST 0x0555 +#define CMD_CHIPERASE_DATA_1ST 0x00AA +#define CMD_CHIPERASE_ADD_2ND 0x02AA +#define CMD_CHIPERASE_DATA_2ND 0x0055 +#define CMD_CHIPERASE_ADD_3RD 0x0555 +#define CMD_CHIPERASE_DATA_3RD 0x0080 +#define CMD_CHIPERASE_ADD_4TH 0x0555 +#define CMD_CHIPERASE_DATA_4TH 0x00AA +#define CMD_CHIPERASE_ADD_5TH 0x02AA +#define CMD_CHIPERASE_DATA_5TH 0x0055 +#define CMD_CHIPERASE_ADD_6TH 0x0555 +#define CMD_CHIPERASE_DATA_6TH 0x0010 + +/* reset command define */ +#define CMD_RESET_ADD_1ST 0x0555 +#define CMD_RESET_DATA_1ST 0x00AA +#define CMD_RESET_ADD_2ND 0x02AA +#define CMD_RESET_DATA_2ND 0x0055 +#define CMD_RESET_DATA_3RD 0x00F0 + +/* read command define */ +#define CMD_READ_ADD_1ST 0x0555 +#define CMD_READ_DATA_1ST 0x00AA +#define CMD_READ_ADD_2ND 0x02AA +#define CMD_READ_DATA_2ND 0x0055 +#define CMD_READ_DATA_3RD 0x00F0 + +/* write command define */ +#define CMD_WRITE_ADD_1ST 0x0555 +#define CMD_WRITE_DATA_1ST 0x00AA +#define CMD_WRITE_ADD_2ND 0x02AA +#define CMD_WRITE_DATA_2ND 0x0055 +#define CMD_WRITE_ADD_3RD 0x0555 +#define CMD_WRITE_DATA_3RD 0x00A0 + +/* max read and write address */ +#define NOR_MAX_ADDRESS ((uint32_t)0x01000000) + +/* NOR id structure */ +typedef struct +{ + uint16_t manufacturer_code; + uint16_t device_code1; + uint16_t device_code2; + uint16_t device_code3; +}nor_id_struct; + +/* NOR status */ +typedef enum +{ + NOR_SUCCESS = 0, + NOR_ONGOING, + NOR_ERROR, + NOR_TIMEOUT +}nor_status_struct; + +/* function declarations */ +/* nor flash peripheral initialize */ +void exmc_norflash_init(void); +/* read NOR memory's manufacturer, device code, + block_protection_indicator, block_protection_status */ +void nor_read_id(nor_id_struct* nor_id); +/* erase the specified nor flash block */ +nor_status_struct nor_eraseblock(uint32_t blockaddr); +/* erase the entire chip */ +nor_status_struct nor_erasechip(void); +/* write a half-word to the specified address of nor flash */ +nor_status_struct nor_write_halfword(uint32_t writeaddr, uint16_t data); +/* write a half-word buffer to the specified address of nor flash */ +nor_status_struct nor_write_buffer(uint16_t* pbuffer, uint32_t writeaddr, uint32_t halfword_count); +/* read a half-word from the specified address of nor flash */ +uint16_t nor_read_halfword(uint32_t readaddr); +/* read a set of data from the specified address of nor flash */ +void nor_readbuffer(uint16_t* pbuffer, uint32_t readaddr, uint32_t halfwordcount); +/* return the nor flash to read mode and reset the errors in the nor flash status register */ +void nor_reset(void); +/* return the nor flash operation status */ +nor_status_struct nor_get_status(uint32_t time_out); +/* return the nor flash to read mode */ +void nor_return_to_read_mode(void); +/* fill the buffer with specified value */ +void nor_fill_buffer(uint16_t *pbuffer, uint16_t buffer_lenght, uint32_t value); + +#endif /* EXMC_NORFLASH_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/main.c new file mode 100644 index 0000000..e6ebdbd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/main.c @@ -0,0 +1,132 @@ +/*! + \file main.c + \brief EXMC NOR Flash demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include +#include "exmc_norflash.h" + +/* NOR */ +#define BUFFER_SIZE 10 +#define WRITE_READ_ADDR 0x0000 + +nor_id_struct nor_id; +uint32_t writereadstatus = 0; +uint16_t writebuffer[BUFFER_SIZE]; +uint16_t readbuffer[BUFFER_SIZE]; +nor_status_struct status; + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + uint32_t i = 0; + + /* configure the USART */ + gd_eval_com_init(EVAL_COM0); + /* configure the EXMC access mode */ + exmc_norflash_init(); + /* read nor flash id and printf */ + nor_read_id(&nor_id); + + printf("\r\nread NOR ID"); + + /* print NOR ID */ + printf("\r\nNOR flash ID:0x%X 0x%X 0x%X 0x%X\r\n",nor_id.manufacturer_code,nor_id.device_code1, + nor_id.device_code2,nor_id.device_code3); + nor_return_to_read_mode(); + + /* erase the nor flash block to be written data */ + status = nor_eraseblock(WRITE_READ_ADDR); + if(NOR_SUCCESS == status){ + printf("\r\nerase nor flash block successfully!"); + }else{ + printf("\r\nerase nor flash block failure!"); + while(1); + } + /* read data from nor flash, WRITE_READ_ADDR: the starting address of the read data*/ + nor_readbuffer(readbuffer, WRITE_READ_ADDR, BUFFER_SIZE); + + /* whether address cross-border */ + if((WRITE_READ_ADDR + BUFFER_SIZE ) > NOR_MAX_ADDRESS){ + printf("\n\raddress cross-border\n\r"); + while(1); + } + + /* fill writeBuffer with the specified value */ + nor_fill_buffer(writebuffer, BUFFER_SIZE, 0x0004); + + /* write data to nor flash, WRITE_READ_ADDR: the starting address of the write data */ + status = nor_write_buffer(writebuffer, WRITE_READ_ADDR, BUFFER_SIZE); + if(NOR_SUCCESS == status){ + printf("\r\nwrite data to nor flash block successfully!"); + }else{ + printf("\r\nwrite data to nor flash block failure!"); + + while(1); + } + + /* read data from nor flash, WRITE_READ_ADDR: the starting address of the read data*/ + nor_readbuffer(readbuffer, WRITE_READ_ADDR, BUFFER_SIZE); + + /* read and write data comparison for equality */ + writereadstatus = 0; + for(i = 0x00; i < BUFFER_SIZE; i++){ + if (readbuffer[i] != writebuffer[i]){ + writereadstatus++; + break; + } + } + + printf("\n\rthe result to access the nor flash:\n\r"); + if(writereadstatus == 0) + { + printf("\n\raccess nor flash successfully!\n\r"); + }else{ + printf("\n\raccess nor flash failure!\n\r"); + while(1); + } + + printf("\n\rprintf data to be read: \n\r"); + printf("\n\r"); + for(i = 0; i < BUFFER_SIZE; i++) + { + printf("%d ",readbuffer[i]); + } + while(1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/readme.txt new file mode 100644 index 0000000..8bfb1bd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/NOR/readme.txt @@ -0,0 +1,40 @@ +/*! + \file readme.txt + \brief description of the EXMC_NOR demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V board, it shows how to use EXMC peripheral to +control NOR memory. + + This demo shows the write and read data operation process of NOR memory by +EXMC module. If the operation is correct, a success information and the data writed +to the NOR memory. Otherwise, a failure information will be printed out. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/exmc_sram.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/exmc_sram.c new file mode 100644 index 0000000..3819a32 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/exmc_sram.c @@ -0,0 +1,239 @@ +/*! + \file exmc_sram.c + \brief EXMC SRAM(ISSI IS61LV51216) driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "exmc_sram.h" + +#define Bank0_SRAM2_ADDR ((uint32_t)0x60000000) +#define BANK_SRAM_ADDR Bank0_SRAM2_ADDR + +/*! + \brief SRAM peripheral initialize + \param[in] none + \param[out] none + \retval none +*/ +void exmc_sram_init(void) +{ + exmc_norsram_parameter_struct nor_init_struct; + exmc_norsram_timing_parameter_struct nor_timing_init_struct; + + /* EXMC clock enable */ + rcu_periph_clock_enable(RCU_EXMC); + + /* EXMC enable */ + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_GPIOD); + rcu_periph_clock_enable(RCU_GPIOE); + + /* configure EXMC_D[0~15]*/ + /* PD14(EXMC_D0), PD15(EXMC_D1),PD0(EXMC_D2), PD1(EXMC_D3), PD8(EXMC_D13), PD9(EXMC_D14), PD10(EXMC_D15) */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_8 | GPIO_PIN_9 | + GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15); + + /* PE7(EXMC_D4), PE8(EXMC_D5), PE9(EXMC_D6), PE10(EXMC_D7), PE11(EXMC_D8), PE12(EXMC_D9), + PE13(EXMC_D10), PE14(EXMC_D11), PE15(EXMC_D12) */ + gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, 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); + /* PD11(EXMC_A16), PD12(EXMC_A17), PD13(EXMC_A18) */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11 | GPIO_PIN_12 | GPIO_PIN_13); + + /* configure NOE(PD4),NWE(PD5) and NE0(PD7) */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7); + + /* configure NBL0(PE0) and NBL1(PE1) */ + gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1); + + /* configure EXMC NADV (PB7) */ + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7); + + /* configure timing parameter */ + nor_timing_init_struct.bus_latency = 1; + nor_timing_init_struct.asyn_data_setuptime = 7; + nor_timing_init_struct.asyn_address_holdtime = 2; + nor_timing_init_struct.asyn_address_setuptime = 5; + + /* configure EXMC bus parameters */ + nor_init_struct.norsram_region = EXMC_BANK0_NORSRAM_REGION0; + nor_init_struct.asyn_wait = DISABLE; + nor_init_struct.nwait_signal = DISABLE; + nor_init_struct.memory_write = ENABLE; + nor_init_struct.nwait_polarity = EXMC_NWAIT_POLARITY_LOW; + nor_init_struct.databus_width = EXMC_NOR_DATABUS_WIDTH_16B; + nor_init_struct.memory_type = EXMC_MEMORY_TYPE_SRAM; + nor_init_struct.address_data_mux = ENABLE; + nor_init_struct.read_write_timing = &nor_timing_init_struct; + exmc_norsram_init(&nor_init_struct); + + /* enable the EXMC bank0 NORSRAM */ + exmc_norsram_enable(EXMC_BANK0_NORSRAM_REGION0); +} + +/*! + \brief write a Half-word buffer(data is 16 bits) to the EXMC SRAM memory + \param[in] pbuffer : pointer to buffer + \param[in] writeaddr : SRAM memory internal address from which the data will be written + \param[in] num_halfword_write : number of half-words to write + \param[out] none + \retval none +*/ +void exmc_sram_writebuffer_16(uint16_t* pbuffer, uint32_t writeaddr, uint32_t num_halfword_write) +{ + /* while there is data to write */ + for(;num_halfword_write != 0;num_halfword_write--){ + /* transfer data to the memory */ + *(uint16_t *) (BANK_SRAM_ADDR + writeaddr) = *pbuffer++; + + /* increment the address */ + writeaddr += 2; + } +} + +/*! + \brief read a block of 16-bit data from the EXMC SRAM memory + \param[in] pbuffer : pointer to the buffer that receives the data read from the SRAM memory + \param[in] readaddr : SRAM memory internal address to read from + \param[in] num_halfword_read : number of half-words to read + \param[out] none + \retval none +*/ +void exmc_sram_readbuffer_16(uint16_t* pbuffer, uint32_t readaddr, uint32_t num_halfword_read) +{ + /* while there is data to read */ + for(; num_halfword_read != 0; num_halfword_read--) { + /* read a half-word from the memory */ + *pbuffer++ = *(uint16_t*) (BANK_SRAM_ADDR + readaddr); + + /* increment the address */ + readaddr += 2; + } +} + +/*! + \brief write a word buffer(data is 32 bits) to the EXMC SRAM memory + \param[in] pbuffer : pointer to buffer + \param[in] writeaddr : SRAM memory internal address from which the data will be written + \param[in] num_word_write : number of words to write + \param[out] none + \retval none +*/ +void exmc_sram_writebuffer_32(uint32_t* pbuffer, uint32_t writeaddr, uint32_t num_word_write) +{ + /* while there is data to write */ + for(; num_word_write != 0; num_word_write--){ + /* transfer data to the memory */ + *(uint32_t *)(BANK_SRAM_ADDR + writeaddr) = *pbuffer++; + + /* increment the address */ + writeaddr += 4; + } +} + +/*! + \brief read a block of 32-bit data from the EXMC SRAM memory + \param[in] pbuffer : pointer to the buffer that receives the data read from the SRAM memory + \param[in] readaddr : SRAM memory internal address to read from + \param[in] num_word_read : number of words to read + \param[out] none + \retval none +*/ +void exmc_sram_readbuffer_32(uint32_t* pbuffer, uint32_t readaddr, uint32_t num_word_read) +{ + /* while there is data to read */ + for(; num_word_read != 0; num_word_read--){ + /* read a word from the memory */ + *pbuffer++ = *(uint32_t*) (BANK_SRAM_ADDR + readaddr); + + /* increment the address */ + readaddr += 4; + } +} + +/*! + \brief write a Byte buffer(data is 8 bits ) to the EXMC SRAM memory + \param[in] pbuffer : pointer to buffer + \param[in] writeaddr : SRAM memory internal address from which the data will be written + \param[in] num_byte_write : number of bytes to write + \param[out] none + \retval none +*/ +void exmc_sram_writebuffer_8(uint8_t* pbuffer, uint32_t writeaddr, uint32_t num_byte_write) +{ + /* while there is data to write */ + for(; num_byte_write != 0; num_byte_write--){ + /* transfer data to the memory */ + *(uint8_t *) (BANK_SRAM_ADDR + writeaddr) = *pbuffer++; + + /* increment the address*/ + writeaddr += 1; + } +} + +/*! + \brief read a block of 8-bit data from the EXMC SRAM memory + \param[in] pbuffer : pointer to the buffer that receives the data read from the SRAM memory + \param[in] readaddr : SRAM memory internal address to read from + \param[in] num_byte_read : number of bytes to write + \param[out] none + \retval none +*/ +void exmc_sram_readbuffer_8(uint8_t* pbuffer, uint32_t readaddr, uint32_t num_byte_read) +{ + /* while there is data to read */ + for(; num_byte_read != 0; num_byte_read--){ + /* read a byte from the memory */ + *pbuffer++ = *(uint8_t*) (BANK_SRAM_ADDR + readaddr); + + /* increment the address */ + readaddr += 1; + } +} + +/*! + \brief fill the 16-bit buffer with specified value + \param[in] pbuffer: pointer on the buffer to fill + \param[in] buffersize: size of the buffer to fill + \param[in] offset: first value to fill on the buffer + \param[out] none + \retval none +*/ +void fill_buffer_16(uint16_t *pbuffer, uint16_t buffer_lenght, uint16_t offset) +{ + uint16_t index = 0; + + for(index = 0; index < buffer_lenght; index++ ){ + pbuffer[index] = index + offset; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/exmc_sram.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/exmc_sram.h new file mode 100644 index 0000000..530f96a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/exmc_sram.h @@ -0,0 +1,58 @@ +/*! + \file exmc_sram.h + \brief the header file of EXMC SRAM(ISSI IS61LV51216) driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef EXMC_SRAM_H +#define EXMC_SRAM_H + +#include "gd32vf103.h" + +/* function declarations */ +/* SRAM peripheral initialize */ +void exmc_sram_init(void); +/* write a Half-word buffer(data is 16 bits) to the EXMC SRAM memory */ +void exmc_sram_writebuffer_16(uint16_t* pbuffer, uint32_t writeaddr, uint32_t num_halfword_write); +/* read a block of 16-bit data from the EXMC SRAM memory */ +void exmc_sram_readbuffer_16(uint16_t* pbuffer, uint32_t readaddr, uint32_t num_halfword_read); +/* write a Byte buffer(data is 8 bits ) to the EXMC SRAM memory */ +void exmc_sram_writebuffer_8(uint8_t* pbuffer, uint32_t writeaddr, uint32_t num_byte_write); +/* read a block of 8-bit data from the EXMC SRAM memory */ +void exmc_sram_readbuffer_8(uint8_t* pbuffer, uint32_t readaddr, uint32_t num_byte_read); +/* write a word buffer(data is 32 bits) to the EXMC SRAM memory */ +void exmc_sram_writebuffer_32(uint32_t* pbuffer, uint32_t writeaddr, uint32_t num_word_write); +/* read a block of 32-bit data from the EXMC SRAM memory */ +void exmc_sram_readbuffer_32(uint32_t* pbuffer, uint32_t readaddr, uint32_t num_word_read); +/* fill the 16-bit buffer with specified value */ +void fill_buffer_16(uint16_t *pbuffer, uint16_t buffer_lenght, uint16_t offset); + +#endif /* EXMC_SRAM_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/main.c new file mode 100644 index 0000000..845c412 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/main.c @@ -0,0 +1,88 @@ +/*! + \file main.c + \brief EXMC SRAM demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include +#include "exmc_sram.h" + +#define BUFFER_SIZE 4 /*!< write or read buffer size */ +#define WRITE_READ_ADDR 0x0000 /*!< SRAM write or read address */ + +uint16_t txbuffer[BUFFER_SIZE]; +uint16_t rxbuffer[BUFFER_SIZE]; +uint16_t writereadstatus = 0; + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + uint16_t i = 0; + + /* configure the USART */ + gd_eval_com_init(EVAL_COM0); + /* configure the EXMC access mode */ + exmc_sram_init(); + /* fill txbuffer */ + fill_buffer_16(txbuffer, BUFFER_SIZE, 0x1215); + /* write data to SRAM */ + exmc_sram_writebuffer_16(txbuffer, WRITE_READ_ADDR, BUFFER_SIZE); + /* read data from SRAM */ + exmc_sram_readbuffer_16(rxbuffer, WRITE_READ_ADDR, BUFFER_SIZE); + /* compare two buffers */ + for(i = 0;i < BUFFER_SIZE;i++){ + if (rxbuffer[i] != txbuffer[i]){ + writereadstatus ++; + break; + } + } + if(writereadstatus){ + printf("SRAM test failed!\r\n"); + }else{ + printf("SRAM test successed!\r\n"); + printf("the data is:\r\n"); + for(i=0;i < BUFFER_SIZE;i++){ + printf("%6x",rxbuffer[i]); + if(((i+1)%6) == 0){ + printf("\r\n"); + } + } + } + + while(1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/readme.txt new file mode 100644 index 0000000..384f72c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXMC/SRAM/readme.txt @@ -0,0 +1,41 @@ +/*! + \file readme.txt + \brief description of the EXMC_SRAM demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V board, it shows how to use EXMC peripheral +to control SRAM memory. + + This demo shows the write and read data operation process of SRAM memory by EXMC +module. If the operation is correct, "SRAM test successed!" will be printed and the +data read from the SRAM will be printed out. Otherwise, "SRAM test failed!" will be +printed. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/gd32vf103_it.c new file mode 100644 index 0000000..508218a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/gd32vf103_it.c @@ -0,0 +1,55 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" +#include "gd32vf103v_eval.h" + +/*! + \brief this function handles external lines 10 to 15 interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void EXTI10_15_IRQHandler(void) +{ + if (RESET != exti_interrupt_flag_get(KEY_B_PIN)){ + exti_interrupt_flag_clear(KEY_B_PIN); + + if(RESET == gd_eval_key_state_get(KEY_B_PIN)){ + gd_eval_led_toggle(LED3); + } + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/gd32vf103_it.h new file mode 100644 index 0000000..e0f9b45 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/gd32vf103_it.h @@ -0,0 +1,47 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* this function handles external lines 10 to 15 interrupt request */ +void EXTI10_15_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/main.c new file mode 100644 index 0000000..baff91d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/main.c @@ -0,0 +1,97 @@ +/*! + \file main.c + \brief the example of EXTI which generates an interrupt request and toggle the LED + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +void key_gpio_init(void); +void key_exti_init(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ + +int main(void) +{ + /* initialize the LEDs and turn on LED2 */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_on(LED2); + + /* initialize the key */ + key_gpio_init(); + key_exti_init(); + + while (1); +} + +/*! + \brief initialize the key GPIO + \param[in] none + \param[out] none + \retval none +*/ +void key_gpio_init(void) +{ + /* enable the key gpio clock */ + rcu_periph_clock_enable(RCU_GPIOC); + /* configure button pin as input */ + gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_13); +} + +/*! + \brief initialize the EXTI configuration of the key + \param[in] none + \param[out] none + \retval none +*/ +void key_exti_init(void) +{ + /* enable the AF clock */ + rcu_periph_clock_enable(RCU_AF); + /* enable and set key EXTI interrupt to the specified priority */ + eclic_global_interrupt_enable(); + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1); + eclic_irq_enable(EXTI10_15_IRQn, 1, 1); + + /* connect key EXTI line to key GPIO pin */ + gpio_exti_source_select(GPIO_PORT_SOURCE_GPIOC, GPIO_PIN_SOURCE_13); + + /* configure key EXTI line */ + exti_init(EXTI_13, EXTI_INTERRUPT, EXTI_TRIG_FALLING); + exti_interrupt_flag_clear(EXTI_13); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/readme.txt new file mode 100644 index 0000000..fb1a69d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/EXTI/Key_external_interrupt_mode/readme.txt @@ -0,0 +1,43 @@ +/*! + \file readme.txt + \brief description of the EXTI Key example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows how to generate +the interrupt request, and toggle the LED. After the system start-up, LED2 is on. +When Key B is pressed, LED3 is toggled, it is switched on; when Key B is pressed +once again, LED3 is toggled, it is switched off. + + On the GD32VF103V-EVAL-V1.0 board, LED1 connected to PC0, LED2 connected to PC2, LED3 +connected to PE0, LED4 connected to PE1. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/main.c new file mode 100644 index 0000000..0d2c293 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/main.c @@ -0,0 +1,183 @@ +/*! + \file main.c + \brief main flash program, erase + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include "main.h" + +#define FMC_PAGE_SIZE ((uint16_t)0x400U) +#define FMC_WRITE_START_ADDR ((uint32_t)0x08004000U) +#define FMC_WRITE_END_ADDR ((uint32_t)0x08004800U) + +uint32_t *ptrd; +uint32_t address = 0x00; +uint32_t data0 = 0x01234567U; +led_typedef_enum led_num = LED4; + +/* calculate the num of page to be programmed/erased */ +uint32_t page_num = (FMC_WRITE_END_ADDR - FMC_WRITE_START_ADDR) / FMC_PAGE_SIZE; +/* calculate the num of page to be programmed/erased */ +uint32_t word_num = ((FMC_WRITE_END_ADDR - FMC_WRITE_START_ADDR) >> 2); + +/*! + \brief erase fmc pages from FMC_WRITE_START_ADDR to FMC_WRITE_END_ADDR + \param[in] none + \param[out] none + \retval none +*/ +void fmc_erase_pages(void) +{ + uint32_t erase_counter; + + /* unlock the flash program/erase controller */ + fmc_unlock(); + + /* clear all pending flags */ + fmc_flag_clear(FMC_FLAG_END); + fmc_flag_clear(FMC_FLAG_WPERR); + fmc_flag_clear(FMC_FLAG_PGERR); + + /* erase the flash pages */ + for(erase_counter = 0; erase_counter < page_num; erase_counter++){ + fmc_page_erase(FMC_WRITE_START_ADDR + (FMC_PAGE_SIZE * erase_counter)); + fmc_flag_clear(FMC_FLAG_END); + fmc_flag_clear(FMC_FLAG_WPERR); + fmc_flag_clear(FMC_FLAG_PGERR); + } + + /* lock the main FMC after the erase operation */ + fmc_lock(); +} + +/*! + \brief program fmc word by word from FMC_WRITE_START_ADDR to FMC_WRITE_END_ADDR + \param[in] none + \param[out] none + \retval none +*/ +void fmc_program(void) +{ + /* unlock the flash program/erase controller */ + fmc_unlock(); + + address = FMC_WRITE_START_ADDR; + + /* program flash */ + while(address < FMC_WRITE_END_ADDR){ + fmc_word_program(address, data0); + address += 4; + fmc_flag_clear(FMC_FLAG_END); + fmc_flag_clear(FMC_FLAG_WPERR); + fmc_flag_clear(FMC_FLAG_PGERR); + } + + /* lock the main FMC after the program operation */ + fmc_lock(); +} + +/*! + \brief check fmc erase result + \param[in] none + \param[out] none + \retval none +*/ +void fmc_erase_pages_check(void) +{ + uint32_t i; + + ptrd = (uint32_t *)FMC_WRITE_START_ADDR; + + /* check flash whether has been erased */ + for(i = 0; i < word_num; i++){ + if(0xFFFFFFFF != (*ptrd)){ + led_num = LED2; + gd_eval_led_on(led_num); + break; + }else{ + ptrd++; + } + } +} + +/*! + \brief check fmc program result + \param[in] none + \param[out] none + \retval none +*/ +void fmc_program_check(void) +{ + uint32_t i; + + ptrd = (uint32_t *)FMC_WRITE_START_ADDR; + + /* check flash whether has been programmed */ + for(i = 0; i < word_num; i++){ + if((*ptrd) != data0){ + led_num = LED3; + gd_eval_led_on(led_num); + break; + }else{ + ptrd++; + } + } +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* initialize led on the board */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); + + /* step1: erase pages and check if it is successful. if not, light the LED2 */ + fmc_erase_pages(); + fmc_erase_pages_check(); + + /* step2: program and check if it is successful. if not, light the LED3 */ + fmc_program(); + fmc_program_check(); + + /* if all the operations are successful, light the LED4 */ + gd_eval_led_on(led_num); + + while(1); +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/main.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/main.h new file mode 100644 index 0000000..bc70b70 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/main.h @@ -0,0 +1,47 @@ +/*! + \file main.h + \brief the header file of main + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef MAIN_H +#define MAIN_H + +/* erase fmc pages from FMC_WRITE_START_ADDR to FMC_WRITE_END_ADDR */ +void fmc_erase_pages(void); +/* program fmc word by word from FMC_WRITE_START_ADDR to FMC_WRITE_END_ADDR */ +void fmc_program(void); +/* check fmc erase result */ +void fmc_erase_pages_check(void); +/* check fmc program result */ +void fmc_program_check(void); + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/readme.txt new file mode 100644 index 0000000..dd65db1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Erase_Program/readme.txt @@ -0,0 +1,46 @@ +/*! + \file readme.txt + \brief description of the Erase_Program example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it provides a description of +how to erase and program flash memory. + + In erasing operation, a comparison between flash memory and 0xffffffff is done to +check whether the flash memory has been correctly erased. If the result is wrong, +LED2 will be on. + + In programming operation, a comparison between flash memory and target data is +done to check whether the flash memory has been correctly programmed. If the result +is wrong, LED3 will be on. + + If all the three operations are successful, LED4 will be on. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Write_Protection/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Write_Protection/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Write_Protection/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Write_Protection/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Write_Protection/main.c new file mode 100644 index 0000000..7e00aa4 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Write_Protection/main.c @@ -0,0 +1,158 @@ +/*! + \file main.c + \brief main flash program, write_protection + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include + +#define FLASH_PAGE_PROGRAM +//#define WRITE_PROTECTION_ENABLE +#define WRITE_PROTECTION_DISABLE + +typedef enum {FAILED = 0, PASSED = !FAILED} test_state; +#define FLASH_PAGE_SIZE ((uint16_t)0x400) +#define FMC_PAGES_PROTECTED (OB_WP_4 | OB_WP_5) + +#define WRITE_START_ADDR ((uint32_t)0x08004000) +#define WRITE_END_ADDR ((uint32_t)0x08010000) + +uint32_t erase_counter = 0x0, address = 0x0; +uint32_t data = 0x5a5a5a5a; +uint32_t wp_value = 0xFFFFFFFF, protected_pages = 0x0; +uint32_t page_number; +__IO fmc_state_enum fmc_state = FMC_READY; +__IO test_state program_state = PASSED; + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* initialize led on the board */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + + /* unlock the flash program/erase controller */ + fmc_unlock(); + ob_unlock(); + + fmc_flag_clear(FMC_FLAG_END); + fmc_flag_clear(FMC_FLAG_WPERR); + fmc_flag_clear(FMC_FLAG_PGERR); + + /* get pages write protection status */ + wp_value = ob_write_protection_get(); + +#ifdef WRITE_PROTECTION_DISABLE + /* get pages already write protected */ + protected_pages = ~(wp_value | FMC_PAGES_PROTECTED); + /* check if desired pages are already write protected */ + if((wp_value | (~FMC_PAGES_PROTECTED)) != 0xFFFFFFFF ){ + /* erase all the option Bytes */ + fmc_state = ob_erase(); + + /* check if there is write protected pages */ + if(protected_pages != 0x0){ + /* Restore write protected pages */ + fmc_state = ob_write_protection_enable(protected_pages); + } + /* generate system reset to load the new option byte values */ + eclic_system_reset(); + } +#elif defined WRITE_PROTECTION_ENABLE + /* get current write protected pages and the new pages to be protected */ + protected_pages = (~wp_value) | FMC_PAGES_PROTECTED; + + /* check if desired pages are not yet write protected */ + if(((~wp_value) & FMC_PAGES_PROTECTED )!= FMC_PAGES_PROTECTED){ + + /* erase all the option bytes because if a program operation is + performed on a protected page, the flash memory returns a + protection error */ + fmc_state = ob_erase(); + + /* enable the pages write protection */ + fmc_state = ob_write_protection_enable(protected_pages); + + /* generate system reset to load the new option byte values */ + eclic_system_reset(); + } +#endif /* WRITE_PROTECTION_DISABLE */ + +#ifdef FLASH_PAGE_PROGRAM + /* get the number of pages to be erased */ + page_number = (WRITE_END_ADDR - WRITE_START_ADDR) / FLASH_PAGE_SIZE; + + /* the selected pages are not write protected */ + if(0x00 != (wp_value & FMC_PAGES_PROTECTED)){ + /* clear all pending flags */ + fmc_flag_clear(FMC_FLAG_END); + fmc_flag_clear(FMC_FLAG_WPERR); + fmc_flag_clear(FMC_FLAG_PGERR); + + /* erase the flash pages */ + for(erase_counter = 0; (erase_counter < page_number) && (FMC_READY == fmc_state); erase_counter++){ + fmc_state = fmc_page_erase(WRITE_START_ADDR + (FLASH_PAGE_SIZE * erase_counter)); + } + + /* flash word program of data 0x5a5a5a5a at addresses defined by WRITE_START_ADDR and WRITE_END_ADDR */ + address = WRITE_START_ADDR; + + while((address < WRITE_END_ADDR) && (FMC_READY == fmc_state)){ + fmc_state = fmc_word_program(address, data); + address = address + 4; + } + /* check the correctness of written data */ + address = WRITE_START_ADDR; + + while((address < WRITE_END_ADDR) && (FAILED != program_state)){ + if(REG32(address) != data){ + program_state = FAILED; + } + address += 4; + } + gd_eval_led_on(LED2); + } + else{ + /* error to program the flash: the desired pages are write protected */ + program_state = FAILED; + gd_eval_led_on(LED3); + } +#endif /* FLASH_PAGE_PROGRAM */ + while(1){ + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Write_Protection/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Write_Protection/readme.txt new file mode 100644 index 0000000..df8937d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FMC/Write_Protection/readme.txt @@ -0,0 +1,46 @@ +/*! + \file readme.txt + \brief description of the Write_Protection example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it provides a description of how to +enable and disable the write protection for the embedded flash. + + Uncomment the line "#define WRITE_PROTECTION_ENABLE" and "#define FLASH_PAGE_PROGRAM" +in main.c file, download the program, an error will occur to program the flash and LED3 +will on. + + Uncomment the line "#define WRITE_PROTECTION_DISABLE" and "#define FLASH_PAGE_PROGRAM" +in main.c file, download the program, the flash will be writeen correctly and LED2 will on. + + User can check the value of FMC_WP register to verify if the write protected operation is +successful or not. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/gd32vf103_it.c new file mode 100644 index 0000000..e7a6f3c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/gd32vf103_it.c @@ -0,0 +1,55 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" +#include "gd32vf103v_eval.h" + + +/*! + \brief this function handles external lines 10 to 15 interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void EXTI10_15_IRQHandler(void) +{ + /* make sure whether the EXTI Line is interrupted */ + if(RESET != exti_interrupt_flag_get(EXTI_13)){ + /* reload FWDGT counter */ + fwdgt_counter_reload(); + } + + /* clear the interrupt flag bit */ + exti_interrupt_flag_clear(EXTI_13); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/gd32vf103_it.h new file mode 100644 index 0000000..0c96ab1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/gd32vf103_it.h @@ -0,0 +1,44 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* external lines 10 to 15 interrupt handle function */ +void EXTI10_15_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/main.c new file mode 100644 index 0000000..c9ae4d1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/main.c @@ -0,0 +1,110 @@ +/*! + \file main.c + \brief FWDGT key demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include "gd32vf103v_eval.h" + +#define BKP_DATA_REG_NUM 42 + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* enable IRC40K */ + rcu_osci_on(RCU_IRC40K); + + /* wait till IRC40K is ready */ + while(SUCCESS != rcu_osci_stab_wait(RCU_IRC40K)){ + } + /* config systick */ + //systick_config(); + /* configure LED */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + + /* configure the Tamper key which is used to reload FWDGT */ + gd_eval_key_init(KEY_B, KEY_MODE_EXTI); + delay_1ms(500); + /* confiure FWDGT counter clock: 40KHz(IRC40K) / 64 = 0.625 KHz */ + fwdgt_config(2*500, FWDGT_PSC_DIV64); + /* after 1.6 seconds to generate a reset */ + fwdgt_enable(); + + /* check if the system has resumed from FWDGT reset */ + if(RESET != rcu_flag_get(RCU_FLAG_FWDGTRST)){ + /* turn on LED3 */ + gd_eval_led_on(LED3); + /* clear the FWDGT reset flag */ + rcu_all_reset_flag_clear(); + + while(1){ + } + }else{ + /* turn on LED2 */ + gd_eval_led_on(LED2); + } + while(1){ + } +} + +/*! + \brief check if the backup data registers are clear or not + \param[in] none + \param[out] none + \retval the number of data register +*/ +uint32_t is_backup_register_clear(void) +{ + uint32_t temp = 0; + + for(temp = 0; temp < BKP_DATA_REG_NUM; temp++){ + if(temp < 10){ + /* check if the data of data register 0-9 is 0x0000 */ + if(0x0000 != BKP_DATA_GET(BKP_DATA0_9(temp))){ + return temp+1; + } + }else{ + /* check if the data of data register 10-41 is 0x0000 */ + if(0x0000 != BKP_DATA_GET(BKP_DATA10_41(temp))){ + return temp+1; + } + } + } + return 0; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/readme.txt new file mode 100644 index 0000000..aea41ef --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/readme.txt @@ -0,0 +1,48 @@ +/*! + \file readme.txt + \brief description of the FWDGT_key example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to reload the +FWDGT counter at regulate period using the EXTI interrupt. The FWDGT timeout +is set to 1.6s (the timeout may varies due to IRC40K frequency dispersion). + + An EXTI is connected to a specific GPIO pin and configured to generate an interrupt +on its falling edge: when the EXTI Line interrupt is triggered (by pressing the Key_B +on the board), the corresponding interrupt is served. In the ISR, FWDGT counter is +reloaded). As a result, when the FWDGT counter is reloaded, which prevents any FWDGT +reset, LED2 or LED3 remains illuminated. + + If the EXTI Line interrupt does not occur, the FWDGT counter is not reloaded before +the FWDGT counter reaches 00h, and the FWDGT reset. If the FWDGT reset is generated, +LED2 and LED3 are turned off with the system reset. FWDGTRST flag is set by hardware, +and then LED3 is turned on. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/systick.c new file mode 100644 index 0000000..4296e59 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/systick.h new file mode 100644 index 0000000..9a74c22 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/FWDGT/FWDGT_key/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/main.c new file mode 100644 index 0000000..07347b5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/main.c @@ -0,0 +1,75 @@ +/*! + \file main.c + \brief keyboard polling mode + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include "gd32vf103v_eval.h" +#include + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* enable the LED1 clock */ + rcu_periph_clock_enable(RCU_GPIOC); + /* configure LED1 GPIO port */ + gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); + + gpio_bit_reset(GPIOC, GPIO_PIN_0); + + /* enable the KEY_B clock */ + rcu_periph_clock_enable(RCU_GPIOC); + rcu_periph_clock_enable(RCU_AF); + + /* configure button pin as input */ + gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_13); + + while(1){ + /* check whether the button is pressed */ + if(RESET == gpio_input_bit_get(GPIOC, GPIO_PIN_13)){ + delay_1ms(100); + + /* check whether the button is pressed */ + if(RESET == gpio_input_bit_get(GPIOC, GPIO_PIN_13)){ + gpio_bit_write(GPIOC, GPIO_PIN_0, (bit_status)(1-gpio_input_bit_get(GPIOC, GPIO_PIN_0))); + } + while(RESET == gpio_input_bit_get(GPIOC, GPIO_PIN_13)){ + } + } + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/readme.txt new file mode 100644 index 0000000..542a0b6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/readme.txt @@ -0,0 +1,44 @@ +/*! + \file readme.txt + \brief description of keyboard polling mode example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it provides a description +of how to use Tamper key to control the LED1. The example uses polling mode. + + Press the KEY_B, LED1 will be on. Press the KEY_B again, LED1 will be off. + + On the GD32VF103V-EVAL-V1.0 board, the Tamper key is connected to PA0 and the LED1 +is connected to PC0. + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/systick.c new file mode 100644 index 0000000..83344fa --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + /* Don't start measuruing until we see an mtime tick */ + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/systick.h new file mode 100644 index 0000000..9a74c22 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Keyboard_polling_mode/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/main.c new file mode 100644 index 0000000..83ba26e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/main.c @@ -0,0 +1,79 @@ +/*! + \file main.c + \brief running led + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include "systick.h" +#include + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* enable the LED clock */ + rcu_periph_clock_enable(RCU_GPIOC); + rcu_periph_clock_enable(RCU_GPIOE); + /* configure LED GPIO port */ + gpio_init(GPIOC, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_2); + gpio_init(GPIOE, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1); + + gpio_bit_reset(GPIOC, GPIO_PIN_0 | GPIO_PIN_2); + gpio_bit_reset(GPIOE, GPIO_PIN_0 | GPIO_PIN_1); + + while(1){ + /* turn on LED1, turn off LED4 */ + gpio_bit_set(GPIOC, GPIO_PIN_0); + gpio_bit_reset(GPIOE, GPIO_PIN_1); + delay_1ms(1000); + + /* turn on LED2, turn off LED1 */ + gpio_bit_set(GPIOC, GPIO_PIN_2); + gpio_bit_reset(GPIOC, GPIO_PIN_0); + delay_1ms(1000); + + /* turn on LED3, turn off LED2 */ + gpio_bit_set(GPIOE, GPIO_PIN_0); + gpio_bit_reset(GPIOC, GPIO_PIN_2); + delay_1ms(1000); + + /* turn on LED4, turn off LED3 */ + gpio_bit_set(GPIOE, GPIO_PIN_1); + gpio_bit_reset(GPIOE, GPIO_PIN_0); + delay_1ms(1000); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/readme.txt new file mode 100644 index 0000000..2ca093d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/readme.txt @@ -0,0 +1,40 @@ +/*! + \file readme.txt + \brief description of running led example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it provides a description +of Running_led. After system start-up, firstly, LED1 on, then, LED2 on, four +LEDs can light periodically. + + On the GD32VF103V-EVAL-V1.0 board,LED1 connected to PC0, LED2 connected to PC2, LED3 +connected to PE0, LED4 connected to PE1. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/systick.c new file mode 100644 index 0000000..83344fa --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + /* Don't start measuruing until we see an mtime tick */ + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/systick.h new file mode 100644 index 0000000..9a74c22 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/GPIO/Running_led/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Fast_mode_ plus_communication/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Fast_mode_ plus_communication/gd32vf103_libopt.h new file mode 100644 index 0000000..7863c96 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Fast_mode_ plus_communication/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-09-18, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Fast_mode_ plus_communication/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Fast_mode_ plus_communication/main.c new file mode 100644 index 0000000..ce121df --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Fast_mode_ plus_communication/main.c @@ -0,0 +1,206 @@ +/*! + \file main.c + \brief master receiver and slave transmitter in fast mode plus + + \version 2019-09-18, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +#define I2C0_SLAVE_ADDRESS7 0x82 +#define I2C1_SLAVE_ADDRESS7 0x72 + +uint8_t i2c_transmitter[16]; +uint8_t i2c_receiver[16]; +__IO ErrStatus state = ERROR; + +void rcu_config(void); +void gpio_config(void); +void i2c_config(void); +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + int i; + + /* initialize led */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + /* RCU config */ + rcu_config(); + /* GPIO config */ + gpio_config(); + /* I2C config */ + i2c_config(); + + for(i=0; i<16; i++){ + i2c_transmitter[i] = i + 0x80; + } + /* wait until I2C bus is idle */ + while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); + /* send a start condition to I2C bus */ + i2c_start_on_bus(I2C0); + /* wait until SBSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); + /* send slave address to I2C bus */ + i2c_master_addressing(I2C0, I2C1_SLAVE_ADDRESS7, I2C_RECEIVER); + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND); + + for(i=0; i<15; i++){ + /* send a data byte */ + i2c_data_transmit(I2C1, i2c_transmitter[i]); + /* wait until the transmission data register is empty */ + while(!i2c_flag_get(I2C1, I2C_FLAG_TBE)); + /* wait until the RBNE bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE)); + /* read a data from I2C_DATA */ + i2c_receiver[i] = i2c_data_receive(I2C0); + } + /* send a NACK for the last data byte */ + i2c_ack_config(I2C0, I2C_ACK_DISABLE); + /* send a data byte */ + i2c_data_transmit(I2C1, i2c_transmitter[i]); + /* wait until the transmission data register is empty */ + while(!i2c_flag_get(I2C1, I2C_FLAG_TBE)); + /* the master doesn't acknowledge for the last byte */ + while(!i2c_flag_get(I2C1, I2C_FLAG_AERR)); + /* send a stop condition to I2C bus */ + i2c_stop_on_bus(I2C0); + /* wait until stop condition generate */ + while(I2C_CTL0(I2C0)&0x0200); + i2c_receiver[i] = i2c_data_receive(I2C0); + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + /* clear the bit of AE */ + i2c_flag_clear(I2C1, I2C_FLAG_AERR); + + /* compare the transmit buffer and the receive buffer */ + state = memory_compare(i2c_transmitter, i2c_receiver, 16); + /* if success, LED2 and LED3 are on */ + if(SUCCESS == state){ + gd_eval_led_on(LED2); + gd_eval_led_on(LED3); + }else{ + /* if failed, LED2 and LED3 are off */ + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + } + while(1){ + } +} + +/*! + \brief memory compare function + \param[in] src : source data + \param[in] dst : destination data + \param[in] length : the compare data length + \param[out] none + \retval ErrStatus : ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length) +{ + while(length--){ + if(*src++ != *dst++){ + return ERROR; + } + } + return SUCCESS; +} + +/*! + \brief enable the peripheral clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOB clock */ + rcu_periph_clock_enable(RCU_GPIOB); + /* enable I2C1 clock */ + rcu_periph_clock_enable(RCU_I2C1); + /* enable I2C0 clock */ + rcu_periph_clock_enable(RCU_I2C0); +} + +/*! + \brief cofigure the GPIO ports + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* connect PB6 to I2C0_SCL */ + /* connect PB7 to I2C0_SDA */ + /* connect PB10 to I2C1_SCL */ + /* connect PB11 to I2C1_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10 | GPIO_PIN_11); +} + +/*! + \brief cofigure the I2C0 and I2C1 interfaces + \param[in] none + \param[out] none + \retval none +*/ +void i2c_config(void) +{ + /* I2C clock configure */ + i2c_clock_config(I2C0, 1000000, I2C_DTCY_16_9); + /* I2C address configure */ + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_SLAVE_ADDRESS7); + /* enable I2C0 */ + i2c_enable(I2C0); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + i2c_clock_config(I2C1, 1000000, I2C_DTCY_16_9); + /* I2C address configure */ + i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C1_SLAVE_ADDRESS7); + /* enable I2C1 */ + i2c_enable(I2C1); + /* enable acknowledge */ + i2c_ack_config(I2C1, I2C_ACK_ENABLE); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Fast_mode_ plus_communication/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Fast_mode_ plus_communication/readme.txt new file mode 100644 index 0000000..a53c266 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Fast_mode_ plus_communication/readme.txt @@ -0,0 +1,44 @@ +/*! + \file readme.txt + \brief description of the master receiver and slave transmitter in fast mode plus + + \version 2019-09-18, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows the I2C programming mode in +master receiving mode and slave transmitting mode. In this demo, I2C0 is operated as +master receiver, I2C1 is operated as slave and the SCL line and SDA line of I2C interface +are controled by the I/O pin PB10 and PB11(or PB6 and PB7) respectively. + + This demo shows the receiving data process of the master and the sending data process +of the slave. If transfer is sucessfully completed, LED2 and LED3 are on. + + We shoud use the jumper to connect the PB6 and PB10. The PB7 and PB11 are connected as well. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver/main.c new file mode 100644 index 0000000..e5f1519 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver/main.c @@ -0,0 +1,187 @@ +/*! + \file main.c + \brief master receiver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +#define I2C_10BIT_ADDRESS 0 + +#define I2C0_OWN_ADDRESS7 0x72 +#define I2C0_SLAVE_ADDRESS7 0x82 +#define I2C0_SLAVE_ADDRESS10 0x0322 + +uint8_t i2c_receiver[16]; + +void rcu_config(void); +void gpio_config(void); +void i2c_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + uint8_t i; + uint8_t slave10_first_byte,slave10_second_byte; + + /* configure USART */ + gd_eval_com_init(EVAL_COM0); + + printf("\r\n I2C Start\n"); + + /* RCU config */ + rcu_config(); + /* GPIO config */ + gpio_config(); + /* I2C config */ + i2c_config(); + + /* wait until I2C bus is idle */ + while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); + /* send a start condition to I2C bus */ + i2c_start_on_bus(I2C0); + /* wait until SBSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); + +#if I2C_10BIT_ADDRESS + slave10_first_byte = (0xF0) | (uint8_t)((I2C0_SLAVE_ADDRESS10 & 0x0300)>>7); + /* send slave address first byte to I2C bus */ + i2c_master_addressing(I2C0, slave10_first_byte, I2C_TRANSMITTER); + /* wait until ADD10SEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADD10SEND)); + /* the second byte contains the remaining 8 bits of the 10-bit address */ + slave10_second_byte = (uint8_t)(I2C0_SLAVE_ADDRESS10 & 0x00FF); + /* send slave address 2nd byte to I2C bus */ + i2c_master_addressing(I2C0, slave10_second_byte, I2C_TRANSMITTER); + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + /* send a start condition to I2C bus */ + i2c_start_on_bus(I2C0); + /* wait until SBSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); + /* send slave address first byte to I2C bus */ + i2c_master_addressing(I2C0, slave10_first_byte, I2C_RECEIVER); +#else + /* send slave address to I2C bus */ + i2c_master_addressing(I2C0, I2C0_SLAVE_ADDRESS7, I2C_RECEIVER); +#endif + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + + for(i=0; i<16; i++){ + if(13 == i){ + /* wait until the second last data byte is received into the shift register */ + while(!i2c_flag_get(I2C0, I2C_FLAG_BTC)); + /* disable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_DISABLE); + } + /* wait until the RBNE bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE)); + /* read a data from I2C_DATA */ + i2c_receiver[i] = i2c_data_receive(I2C0); + } + /* send a stop condition to I2C bus */ + i2c_stop_on_bus(I2C0); + /* wait until stop condition generate */ + while(I2C_CTL0(I2C0)&0x0200); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + + printf("\r\n I2C SUCCESS\n"); + + while(1){ + } +} + +/*! + \brief enable the peripheral clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOB clock */ + rcu_periph_clock_enable(RCU_GPIOB); + /* enable I2C0 clock */ + rcu_periph_clock_enable(RCU_I2C0); +} + +/*! + \brief cofigure the GPIO ports + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* connect PB6 to I2C0_SCL */ + /* connect PB7 to I2C0_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); +} + +/*! + \brief cofigure the I2C0 interfaces + \param[in] none + \param[out] none + \retval none +*/ +void i2c_config(void) +{ + /* I2C clock configure */ + i2c_clock_config(I2C0, 400000, I2C_DTCY_2); + /* I2C address configure */ + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_OWN_ADDRESS7); + /* enable I2C0 */ + i2c_enable(I2C0); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); +} + +/* retarget the C library printf function to the usart */ +int fputc(int ch, FILE *f) +{ + usart_data_transmit(EVAL_COM0, (uint8_t)ch); + while (RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE)); + return ch; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver/readme.txt new file mode 100644 index 0000000..7acc7c0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver/readme.txt @@ -0,0 +1,50 @@ +/*! + \file readme.txt + \brief description of the master receiver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows the I2C programming +mode in master receiving mode. In this demo, I2C0 is operated as master receiver, +and the SCL line and SDA line of I2C0 interface are controled by the I/O pin +PB6 and PB7 respectively. + + This demo shows the receiving data process of the master. And it will store +the received data in the i2c_receiver array. + + This demo doesn't perform the data transfer actually, which is due to no +specific slave.In the specific application, we must send the correct slave +address, and the master and the slave may need to be connected by the jumper +if necessary. When the macro I2C_10BIT_ADDRESS is 1, I2C communicate in 10 bit +addressing mode, otherwise, I2C communicate in 7 bit addressing mode. + + JP16 must be fitted. \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_one_byte/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_one_byte/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_one_byte/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_one_byte/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_one_byte/main.c new file mode 100644 index 0000000..fd5464b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_one_byte/main.c @@ -0,0 +1,138 @@ +/*! + \file main.c + \brief master receiver one byte + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +#define I2C0_SLAVE_ADDRESS7 0x72 +#define I2C1_SLAVE_ADDRESS7 0x82 + +uint8_t i2c_receiver[16]; + +void rcu_config(void); +void gpio_config(void); +void i2c_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + int i; + + /* RCU config */ + rcu_config(); + /* GPIO config */ + gpio_config(); + /* I2C config */ + i2c_config(); + + i=0; + /* wait until I2C bus is idle */ + while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); + /* send a start condition to I2C bus */ + i2c_start_on_bus(I2C0); + /* wait until SBSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); + /* send slave address to I2C bus */ + i2c_master_addressing(I2C0, I2C1_SLAVE_ADDRESS7, I2C_RECEIVER); + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + + /* N=1,reset ACKEN bit before clearing ADDRSEND bit */ + i2c_ack_config(I2C0, I2C_ACK_DISABLE); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + /* N=1,send stop condition after clearing ADDRSEND bit */ + i2c_stop_on_bus(I2C0); + /* wait until the RBNE bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE)); + /* read a data from I2C_DATA */ + i2c_receiver[i++] = i2c_data_receive(I2C0); + + while(I2C_CTL0(I2C0)&0x0200); + /* Enable Acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + + while(1){ + } +} + +/*! + \brief enable the peripheral clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOB clock */ + rcu_periph_clock_enable(RCU_GPIOB); + /* enable I2C0 clock */ + rcu_periph_clock_enable(RCU_I2C0); +} + +/*! + \brief cofigure the GPIO ports + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* connect PB6 to I2C0_SCL */ + /* connect PB7 to I2C0_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); +} + +/*! + \brief cofigure the I2C0 interfaces + \param[in] none + \param[out] none + \retval none +*/ +void i2c_config(void) +{ + /* I2C clock configure */ + i2c_clock_config(I2C0, 100000, I2C_DTCY_2); + /* I2C address configure */ + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_SLAVE_ADDRESS7); + /* enable I2C0 */ + i2c_enable(I2C0); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_one_byte/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_one_byte/readme.txt new file mode 100644 index 0000000..9a54052 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_one_byte/readme.txt @@ -0,0 +1,48 @@ +/*! + \file readme.txt + \brief description of the master receiver one byte + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows the I2C programming +mode in master receiving mode which the master only want to receive one byte of +data. In this demo,I2C0 is operated as master receiver,and the SCL line and SDA +line of I2C0 interface are controled by the I/O pin PB6 and PB7 respectively. + + This demo shows the receiving one byte process of the master. And it will store +the received data in the i2c_receiver array. + + This demo doesn't perform the data transfer actually, which is due to no +specific slave.In the specific application, we must send the correct slave +address, and the master and the slave may need to be connected by the jumper +if necessary. + JP16 must be fitted. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter/main.c new file mode 100644 index 0000000..29d3457 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter/main.c @@ -0,0 +1,207 @@ +/*! + \file main.c + \brief master receiver and slave transmitter + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +#define I2C0_SLAVE_ADDRESS7 0x82 +#define I2C1_SLAVE_ADDRESS7 0x72 + +uint8_t i2c_transmitter[16]; +uint8_t i2c_receiver[16]; +ErrStatus state = ERROR; + +void rcu_config(void); +void gpio_config(void); +void i2c_config(void); +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + int i; + + /* initialize led */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + /* RCU config */ + rcu_config(); + /* GPIO config */ + gpio_config(); + /* I2C config */ + i2c_config(); + + for(i=0; i<16; i++){ + i2c_transmitter[i] = i + 0x80; + } + /* wait until I2C bus is idle */ + while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); + /* send a start condition to I2C bus */ + i2c_start_on_bus(I2C0); + /* wait until SBSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); + /* send slave address to I2C bus */ + i2c_master_addressing(I2C0, I2C1_SLAVE_ADDRESS7, I2C_RECEIVER); + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND); + + for(i=0; i<15; i++){ + /* send a data byte */ + i2c_data_transmit(I2C1, i2c_transmitter[i]); + /* wait until the transmission data register is empty */ + while(!i2c_flag_get(I2C1, I2C_FLAG_TBE)); + /* wait until the RBNE bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE)); + /* read a data from I2C_DATA */ + i2c_receiver[i] = i2c_data_receive(I2C0); + } + /* send a NACK for the last data byte */ + i2c_ack_config(I2C0, I2C_ACK_DISABLE); + /* send a data byte */ + i2c_data_transmit(I2C1, i2c_transmitter[i]); + /* wait until the transmission data register is empty */ + while(!i2c_flag_get(I2C1, I2C_FLAG_TBE)); + /* the master doesn't acknowledge for the last byte */ + while(!i2c_flag_get(I2C1, I2C_FLAG_AERR)); + /* send a stop condition to I2C bus */ + i2c_stop_on_bus(I2C0); + /* wait until stop condition generate */ + while(I2C_CTL0(I2C0)&0x0200); + i2c_receiver[i] = i2c_data_receive(I2C0); + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + /* clear the bit of AE */ + i2c_flag_clear(I2C1, I2C_FLAG_AERR); + + /* compare the transmit buffer and the receive buffer */ + state = memory_compare(i2c_transmitter, i2c_receiver, 16); + /* if success, LED2 and LED3 are on */ + if(SUCCESS == state){ + gd_eval_led_on(LED2); + gd_eval_led_on(LED3); + }else{ + /* if failed, LED2 and LED3 are off */ + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + } + while(1){ + } +} + +/*! + \brief memory compare function + \param[in] src : source data + \param[in] dst : destination data + \param[in] length : the compare data length + \param[out] none + \retval ErrStatus : ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length) +{ + while(length--){ + if(*src++ != *dst++){ + return ERROR; + } + } + return SUCCESS; +} + +/*! + \brief enable the peripheral clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOB clock */ + rcu_periph_clock_enable(RCU_GPIOB); + /* enable I2C1 clock */ + rcu_periph_clock_enable(RCU_I2C1); + /* enable I2C0 clock */ + rcu_periph_clock_enable(RCU_I2C0); +} + +/*! + \brief cofigure the GPIO ports + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* I2C0 and I2C1 GPIO ports */ + /* connect PB6 to I2C0_SCL */ + /* connect PB7 to I2C0_SDA */ + /* connect PB10 to I2C1_SCL */ + /* connect PB11 to I2C1_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10 | GPIO_PIN_11); +} + +/*! + \brief cofigure the I2C0 and I2C1 interfaces + \param[in] none + \param[out] none + \retval none +*/ +void i2c_config(void) +{ + /* I2C clock configure */ + i2c_clock_config(I2C0, 100000, I2C_DTCY_2); + /* I2C address configure */ + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_SLAVE_ADDRESS7); + /* enable I2C0 */ + i2c_enable(I2C0); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + i2c_clock_config(I2C1, 100000, I2C_DTCY_2); + /* I2C address configure */ + i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C1_SLAVE_ADDRESS7); + /* enable I2C1 */ + i2c_enable(I2C1); + /* enable acknowledge */ + i2c_ack_config(I2C1, I2C_ACK_ENABLE); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter/readme.txt new file mode 100644 index 0000000..cf84f61 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter/readme.txt @@ -0,0 +1,47 @@ +/*! + \file readme.txt + \brief description of the master receiver and slave transmitter + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows the I2C programming mode in +master receiving mode and slave transmitting mode. In this demo, I2C0 is operated as +master receiver, I2C1 is operated as slave and the SCL line and SDA line of I2C interface +are controled by the I/O pin PB10 and PB11(or PB6 and PB7) respectively. + + This demo shows the receiving data process of the master and the sending data process +of the slave. If transfer is sucessfully completed, LED2 and LED3 are on. + + We shoud use the jumper to connect the PB6 and PB10. The PB7 and PB11 are connected as well. + + JP16 must be fitted. + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/I2C0_IE.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/I2C0_IE.c new file mode 100644 index 0000000..9b1a6aa --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/I2C0_IE.c @@ -0,0 +1,134 @@ +/*! + \file I2C0_IE.c + \brief I2C0_MasterReceiver interrupt program + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_i2c.h" +#include "I2C_IE.h" + +uint32_t event1; + +/*! + \brief handle I2C0 event interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void I2C0_EventIRQ_Handler(void) +{ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_SBSEND)){ + /* the master sends slave address */ + i2c_master_addressing(I2C0, I2C1_SLAVE_ADDRESS7, I2C_RECEIVER); + }else if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_ADDSEND)){ + if((1 == I2C_nBytes)||(2 == I2C_nBytes)){ + /* clear the ACKEN before the ADDSEND is cleared */ + i2c_ack_config(I2C0, I2C_ACK_DISABLE); + /* clear the ADDSEND bit */ + i2c_interrupt_flag_clear(I2C0,I2C_INT_FLAG_ADDSEND); + }else{ + /* clear the ADDSEND bit */ + i2c_interrupt_flag_clear(I2C0,I2C_INT_FLAG_ADDSEND); + } + } + else if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_RBNE)){ + if(I2C_nBytes>0){ + if(3 == I2C_nBytes){ + /* wait until the second last data byte is received into the shift register */ + while(!i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_BTC)); + /* send a NACK for the last data byte */ + i2c_ack_config(I2C0, I2C_ACK_DISABLE); + } + /* read a data byte from I2C_DATA*/ + *i2c_rxbuffer++ = i2c_data_receive(I2C0); + I2C_nBytes--; + if(0 == I2C_nBytes){ + i2c_stop_on_bus(I2C0); + status=SUCCESS; + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT); + i2c_interrupt_disable(I2C0, I2C_INT_ERR); + i2c_interrupt_disable(I2C0, I2C_INT_BUF); + i2c_interrupt_disable(I2C0, I2C_INT_EV); + } + } + } +} + +/*! + \brief handle I2C0 error interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void I2C0_ErrorIRQ_Handler(void) +{ + /* no acknowledge received */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_AERR)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_AERR); + } + + /* SMBus alert */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_SMBALT)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_SMBALT); + } + + /* bus timeout in SMBus mode */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_SMBTO)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_SMBTO); + } + + /* over-run or under-run when SCL stretch is disabled */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_OUERR)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_OUERR); + } + + /* arbitration lost */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_LOSTARB)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_LOSTARB); + } + + /* bus error */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_BERR)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_BERR); + } + + /* CRC value doesn't match */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_PECERR)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_PECERR); + } + + /* disable the error interrupt */ + i2c_interrupt_disable(I2C0, I2C_INT_ERR); + i2c_interrupt_disable(I2C0, I2C_INT_BUF); + i2c_interrupt_disable(I2C0, I2C_INT_EV); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/I2C1_IE.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/I2C1_IE.c new file mode 100644 index 0000000..6af60f9 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/I2C1_IE.c @@ -0,0 +1,105 @@ +/*! + \file I2C1_IE.c + \brief I2C1_SlaveTransmitter interrupt program + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_i2c.h" +#include "I2C_IE.h" + +uint32_t event2; + +/*! + \brief handle I2C1 event interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void I2C1_EventIRQ_Handler(void) +{ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_ADDSEND)){ + /* clear the ADDSEND bit */ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_ADDSEND); + }else if((i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_TBE))&&(!i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_AERR))){ + /* send a data byte */ + i2c_data_transmit(I2C1, *i2c_txbuffer++); + } +} + +/*! + \brief handle I2C1 error interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void I2C1_ErrorIRQ_Handler(void) +{ + /* no acknowledge received */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_AERR)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_AERR); + } + + /* SMBus alert */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_SMBALT)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_SMBALT); + } + + /* bus timeout in SMBus mode */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_SMBTO)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_SMBTO); + } + + /* over-run or under-run when SCL stretch is disabled */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_OUERR)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_OUERR); + } + + /* arbitration lost */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_LOSTARB)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_LOSTARB); + } + + /* bus error */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_BERR)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_BERR); + } + + /* CRC value doesn't match */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_PECERR)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_PECERR); + } + + /* disable the error interrupt */ + i2c_interrupt_disable(I2C1,I2C_INT_ERR); + i2c_interrupt_disable(I2C1,I2C_INT_BUF); + i2c_interrupt_disable(I2C1,I2C_INT_EV); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/I2C_IE.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/I2C_IE.h new file mode 100644 index 0000000..fb19e1f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/I2C_IE.h @@ -0,0 +1,59 @@ +/*! + \file I2C_IE.h + \brief The header file of I2C0 and I2C1 interrupt + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef I2C_IE_H +#define I2C_IE_H + +#include "gd32vf103.h" + +#define I2C0_SLAVE_ADDRESS7 0x82 +#define I2C1_SLAVE_ADDRESS7 0x72 + +extern volatile ErrStatus status; +extern volatile uint8_t* i2c_txbuffer; +extern volatile uint8_t* i2c_rxbuffer; +extern volatile uint16_t I2C_nBytes; + +/* function declarations */ +/* handle I2C0 event interrupt request */ +void I2C0_EventIRQ_Handler(void); +/* handle I2C0 error interrupt request */ +void I2C0_ErrorIRQ_Handler(void); +/* handle I2C1 event interrupt request */ +void I2C1_EventIRQ_Handler(void); +/* handle I2C1 error interrupt request */ +void I2C1_ErrorIRQ_Handler(void); + +#endif /* I2C_IE_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/gd32vf103_it.c new file mode 100644 index 0000000..5415d0c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/gd32vf103_it.c @@ -0,0 +1,81 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" +#include "I2C_IE.h" + +/*! + \brief this function handles I2C0 event interrupt request exception + \param[in] none + \param[out] none + \retval none +*/ +void I2C0_EV_IRQHandler(void) +{ + I2C0_EventIRQ_Handler(); +} + +/*! + \brief this function handles I2C0 error interrupt request exception + \param[in] none + \param[out] none + \retval none +*/ +void I2C0_ER_IRQHandler(void) +{ + I2C0_ErrorIRQ_Handler(); +} + +/*! + \brief this function handles I2C1 event interrupt request exception + \param[in] none + \param[out] none + \retval none +*/ +void I2C1_EV_IRQHandler(void) +{ + I2C1_EventIRQ_Handler(); +} + +/*! + \brief this function handles I2C1 error interrupt request exception + \param[in] none + \param[out] none + \retval none +*/ +void I2C1_ER_IRQHandler(void) +{ + I2C1_ErrorIRQ_Handler(); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/gd32vf103_it.h new file mode 100644 index 0000000..743acbd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/gd32vf103_it.h @@ -0,0 +1,51 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* I2C0 event handle function */ +void I2C0_EV_IRQHandler(void); +/* I2C0 error handle function */ +void I2C0_ER_IRQHandler(void); +/* I2C1 event handle function */ +void I2C1_EV_IRQHandler(void); +/* I2C1 error handle function */ +void I2C1_ER_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/main.c new file mode 100644 index 0000000..adec5c0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/main.c @@ -0,0 +1,205 @@ +/*! + \file main.c + \brief master receiver and slave transmitter interrupt + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" +#include "I2C_IE.h" + +uint8_t i2c_buffer_transmitter[16]; +uint8_t i2c_buffer_receiver[16]; + +volatile uint8_t* i2c_txbuffer; +volatile uint8_t* i2c_rxbuffer; +volatile uint16_t I2C_nBytes; +volatile ErrStatus status; +ErrStatus state = ERROR; + +void rcu_config(void); +void gpio_config(void); +void i2c_config(void); +void i2c_clic_config(void); +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + int i; + + /* initialize LED2, LED3, as the transfer instruction */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + rcu_config(); + gpio_config(); + i2c_config(); + i2c_clic_config(); + + for(i=0; i<16; i++){ + i2c_buffer_transmitter[i] = i + 0x80; + } + /* initialize i2c_txbuffer, i2c_rxbuffer, I2C_nBytes and status */ + i2c_txbuffer = i2c_buffer_transmitter; + i2c_rxbuffer = i2c_buffer_receiver; + I2C_nBytes = 16; + status = ERROR; + + /* enable the I2C0 interrupt */ + i2c_interrupt_enable(I2C0, I2C_INT_ERR); + i2c_interrupt_enable(I2C0, I2C_INT_EV); + i2c_interrupt_enable(I2C0, I2C_INT_BUF); + /* enable the I2C1 interrupt */ + i2c_interrupt_enable(I2C1, I2C_INT_ERR); + i2c_interrupt_enable(I2C1, I2C_INT_EV); + i2c_interrupt_enable(I2C1, I2C_INT_BUF); + if(2 == I2C_nBytes){ + /* send ACK for the next byte */ + i2c_ackpos_config(I2C0, I2C_ACKPOS_NEXT); + } + /* the master waits until the I2C bus is idle */ + while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); + /* the master sends a start condition to I2C bus */ + i2c_start_on_bus(I2C0); + + while(I2C_nBytes>0); + while(SUCCESS != status); + /* if the transfer is successfully completed, LED2 and LED3 is on */ + state = memory_compare(i2c_buffer_transmitter, i2c_buffer_receiver, 16); + if(SUCCESS == state){ + /* if success, LED2 and LED3 are on */ + gd_eval_led_on(LED2); + gd_eval_led_on(LED3); + }else{ + /* if failed, LED2 and LED3 are off */ + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + } + while(1){ + } +} + +/*! + \brief memory compare function + \param[in] src : source data + \param[in] dst : destination data + \param[in] length : the compare data length + \param[out] none + \retval ErrStatus : ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length) +{ + while(length--){ + if(*src++ != *dst++){ + return ERROR; + } + } + return SUCCESS; +} + +/*! + \brief enable the peripheral clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOB clock */ + rcu_periph_clock_enable(RCU_GPIOB); + /* enable I2C1 clock */ + rcu_periph_clock_enable(RCU_I2C1); + /* enable I2C0 clock */ + rcu_periph_clock_enable(RCU_I2C0); +} + +/*! + \brief cofigure the GPIO ports + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* I2C0 and I2C1 GPIO ports */ + /* connect PB6 to I2C0_SCL */ + /* connect PB7 to I2C0_SDA */ + /* connect PB10 to I2C1_SCL */ + /* connect PB11 to I2C1_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10 | GPIO_PIN_11); +} + +/*! + \brief cofigure the I2C0 and I2C1 interfaces + \param[in] none + \param[out] none + \retval none +*/ +void i2c_config(void) +{ + /* I2C clock configure */ + i2c_clock_config(I2C0, 100000, I2C_DTCY_2); + /* I2C address configure */ + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_SLAVE_ADDRESS7); + /* enable I2C0 */ + i2c_enable(I2C0); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + i2c_clock_config(I2C1, 100000, I2C_DTCY_2); + /* I2C address configure */ + i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C1_SLAVE_ADDRESS7); + /* enable I2C1 */ + i2c_enable(I2C1); + /* enable acknowledge */ + i2c_ack_config(I2C1, I2C_ACK_ENABLE); +} + +/*! + \brief cofigure the NVIC peripheral + \param[in] none + \param[out] none + \retval none +*/ +void i2c_clic_config(void) +{ + eclic_global_interrupt_enable(); + eclic_irq_enable(I2C0_EV_IRQn,1,0); + eclic_irq_enable(I2C1_EV_IRQn,2,0); + eclic_irq_enable(I2C0_ER_IRQn,3,0); + eclic_irq_enable(I2C1_ER_IRQn,4,0); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/readme.txt new file mode 100644 index 0000000..a9e0656 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_slave_transmitter_interrupt/readme.txt @@ -0,0 +1,49 @@ +/*! + \file readme.txt + \brief description of the master receiver and slave transmitter interrupt + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use the I2C +interrupt programming mode in master receiving mode or slave transmitting mode. +In this demo, I2C0 is operated as the master receiver and I2C1 as the slave +transmitter. Moreover,the SCL line and SDA line of I2C0 interface are controled +by the I/O pin PB6 and PB7 respectively. The SCL and SDA of I2C1 are controled +by the pin PB10 and PB11 respectively. + + This demo will send the data of i2c_buffer_transmitter array through I2C1 interface +to the I2C0, and it will store the data received by I2C0 in the i2c_buffer_receiver +array. If transfer is sucessfully completed, LED2 and LED3 are on. + + We shoud use the jumper to connect the PB6 and PB10. The PB7 and PB11 are +connected as well. + JP16 must be fitted. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_two_bytes/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_two_bytes/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_two_bytes/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_two_bytes/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_two_bytes/main.c new file mode 100644 index 0000000..61c7719 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_two_bytes/main.c @@ -0,0 +1,147 @@ +/*! + \file main.c + \brief master receiver two bytes + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +#define I2C0_OWN_ADDRESS7 0x72 +#define I2C0_SLAVE_ADDRESS7 0x82 + +uint8_t i2c_receiver[16]; + +void rcu_config(void); +void gpio_config(void); +void i2c_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + int i; + + /* RCU config */ + rcu_config(); + /* GPIO config */ + gpio_config(); + /* I2C config */ + i2c_config(); + + i=0; + /* send a NACK for the next data byte which will be received into the shift register */ + i2c_ackpos_config(I2C0, I2C_ACKPOS_NEXT); + /* wait until I2C bus is idle */ + while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); + /* send a start condition to I2C bus */ + i2c_start_on_bus(I2C0); + /* wait until SBSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); + /* send slave address to I2C bus */ + i2c_master_addressing(I2C0, I2C0_SLAVE_ADDRESS7, I2C_RECEIVER); + /* disable ACK before clearing ADDSEND bit */ + i2c_ack_config(I2C0, I2C_ACK_DISABLE); + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + /* Wait until the last data byte is received into the shift register */ + while(!i2c_flag_get(I2C0, I2C_FLAG_BTC)); + /* wait until the RBNE bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE)); + + /* read a data from I2C_DATA */ + i2c_receiver[i++] = i2c_data_receive(I2C0); + /* wait until the RBNE bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE)); + /* read a data from I2C_DATA */ + i2c_receiver[i++] = i2c_data_receive(I2C0); + /* send a stop condition */ + i2c_stop_on_bus(I2C0); + /* wait until stop condition generate */ + while(I2C_CTL0(I2C0)&0x0200); + i2c_ackpos_config(I2C0, I2C_ACKPOS_CURRENT); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + + while(1){ + } +} + +/*! + \brief enable the peripheral clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOB clock */ + rcu_periph_clock_enable(RCU_GPIOB); + /* enable I2C0 clock */ + rcu_periph_clock_enable(RCU_I2C0); +} + +/*! + \brief cofigure the GPIO ports + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* connect PB6 to I2C0_SCL */ + /* connect PB7 to I2C0_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); +} + +/*! + \brief cofigure the I2C0 interfaces + \param[in] none + \param[out] none + \retval none +*/ +void i2c_config(void) +{ + /* I2C clock configure */ + i2c_clock_config(I2C0, 100000, I2C_DTCY_2); + /* I2C address configure */ + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_OWN_ADDRESS7); + /* enable I2C0 */ + i2c_enable(I2C0); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_two_bytes/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_two_bytes/readme.txt new file mode 100644 index 0000000..d2bb491 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_receiver_two_bytes/readme.txt @@ -0,0 +1,49 @@ +/*! + \file readme.txt + \brief description of the master receiver two bytes + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows the I2C programming +mode in master receiving mode which the master only want to receive two bytes of +data. In this demo,I2C0 is operated as master receiver,and the SCL line and SDA +line of I2C0 interface are controled by the I/O pin PB6 and PB7 respectively. + + This demo shows the receiving two bytes process of the master. And it will store +the received data in the i2c_receiver array. + + This demo doesn't perform the data transfer actually, which is due to no +specific slave.In the specific application, we must send the correct slave +address, and the master and the slave may need to be connected by the jumper +if necessary. + + JP16 must be fitted. \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter/main.c new file mode 100644 index 0000000..dcde8c0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter/main.c @@ -0,0 +1,143 @@ +/*! + \file main.c + \brief master transmitter + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +#define I2C0_OWN_ADDRESS7 0x72 +#define I2C0_SLAVE_ADDRESS7 0x82 + +uint8_t i2c_transmitter[16]; + +void rcu_config(void); +void gpio_config(void); +void i2c_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + int i; + + /* RCU config */ + rcu_config(); + /* GPIO config */ + gpio_config(); + /* I2C config */ + i2c_config(); + + for(i=0; i<16; i++){ + i2c_transmitter[i]=i+0x80; + } + + /* wait until I2C bus is idle */ + while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); + /* send a start condition to I2C bus */ + i2c_start_on_bus(I2C0); + /* wait until SBSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); + /* send slave address to I2C bus */ + i2c_master_addressing(I2C0, I2C0_SLAVE_ADDRESS7, I2C_TRANSMITTER); + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + /* wait until the transmit data buffer is empty */ + while(!i2c_flag_get(I2C0, I2C_FLAG_TBE)); + + for(i=0; i<16; i++){ + /* data transmission */ + i2c_data_transmit(I2C0, i2c_transmitter[i]); + /* wait until the TBE bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_TBE)); + } + /* send a stop condition to I2C bus */ + i2c_stop_on_bus(I2C0); + /* wait until stop condition generate */ + while(I2C_CTL0(I2C0)&0x0200); + + /* infinite loop */ + while(1){ + } +} + +/*! + \brief enable the peripheral clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOB clock */ + rcu_periph_clock_enable(RCU_GPIOB); + /* enable I2C0 clock */ + rcu_periph_clock_enable(RCU_I2C0); +} + +/*! + \brief cofigure the GPIO ports + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* I2C0 and I2C1 GPIO ports */ + /* connect PB6 to I2C0_SCL */ + /* connect PB7 to I2C0_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); +} + +/*! + \brief cofigure the I2C0 interfaces + \param[in] none + \param[out] none + \retval none +*/ +void i2c_config(void) +{ + /* I2C clock configure */ + i2c_clock_config(I2C0, 100000, I2C_DTCY_2); + /* I2C address configure */ + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_SLAVE_ADDRESS7); + /* enable I2C0 */ + i2c_enable(I2C0); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter/readme.txt new file mode 100644 index 0000000..7eb9baf --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter/readme.txt @@ -0,0 +1,48 @@ +/*! + \file readme.txt + \brief description of the master transmitter + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows the I2C programming +mode in master transmitting mode.In this demo,I2C0 is operated as the master +transmitter, and the SCL line and SDA line of I2C0 interface are controled by +the I/O pin PB6 and PB7 respectively. + + This demo shows the sending process of the master. And it will send the data +in the i2c_transmitter array through I2C0. + + The demo doesn't perform the data transfer actually, which is due to no specific +slave. In the specific application, we must send the correct slave address, and the +master and the slave may need to be connected by the jumper if necessary. + + JP16 must be fitted. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver/main.c new file mode 100644 index 0000000..f6cf71f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver/main.c @@ -0,0 +1,191 @@ +/*! + \file main.c + \brief master transmitter slave receiver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +#define I2C0_SLAVE_ADDRESS7 0x82 +#define I2C1_SLAVE_ADDRESS7 0x72 + +uint8_t i2c_transmitter[16]; +uint8_t i2c_receiver[16]; +ErrStatus state = ERROR; + +void rcu_config(void); +void gpio_config(void); +void i2c_config(void); +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + int i; + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + rcu_config(); + gpio_config(); + i2c_config(); + + for(i=0;i<16;i++){ + i2c_transmitter[i]=i+0x80; + } + + /* wait until I2C bus is idle */ + while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); + + /* send a start condition to I2C bus */ + i2c_start_on_bus(I2C0); + + /* wait until SBSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); + + /* send slave address to I2C bus*/ + i2c_master_addressing(I2C0, I2C1_SLAVE_ADDRESS7, I2C_TRANSMITTER); + + /* wait until ADDSEND bit is set*/ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND); + for(i=0;i<16;i++){ + /* send a data byte */ + i2c_data_transmit(I2C0,i2c_transmitter[i]); + /* wait until the transmission data register is empty*/ + while(!i2c_flag_get(I2C0, I2C_FLAG_TBE)); + /* wait until the RBNE bit is set */ + while(!i2c_flag_get(I2C1, I2C_FLAG_RBNE)); + /* read a data from I2C_DATA */ + i2c_receiver[i] = i2c_data_receive(I2C1); + } + /* send a stop condition to I2C bus*/ + i2c_stop_on_bus(I2C0); + /* wait until stop condition generate */ + while(I2C_CTL0(I2C0)&0x0200); + while(!i2c_flag_get(I2C1, I2C_FLAG_STPDET)); + /* clear the STPDET bit */ + i2c_enable(I2C1); + state = memory_compare(i2c_transmitter, i2c_receiver,16); + if(SUCCESS == state){ + gd_eval_led_on(LED2); + gd_eval_led_on(LED3); + }else{ + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + } + while(1); +} + +/*! + \brief memory compare function + \param[in] src : source data + \param[in] dst : destination data + \param[in] length : the compare data length + \param[out] none + \retval ErrStatus : ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length) +{ + while(length--){ + if(*src++ != *dst++){ + return ERROR; + } + } + return SUCCESS; +} + +/*! + \brief enable the peripheral clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOB clock */ + rcu_periph_clock_enable(RCU_GPIOB); + /* enable I2C1 clock */ + rcu_periph_clock_enable(RCU_I2C1); + /* enable I2C0 clock */ + rcu_periph_clock_enable(RCU_I2C0); +} + +/*! + \brief cofigure the GPIO ports. + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* I2C0 and I2C1 GPIO ports */ + /* connect PB6 to I2C0_SCL */ + /* connect PB7 to I2C0_SDA */ + /* connect PB10 to I2C1_SCL */ + /* connect PB11 to I2C1_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10 | GPIO_PIN_11); +} + +/*! + \brief cofigure the I2C0 and I2C1 interfaces + \param[in] none + \param[out] none + \retval none +*/ +void i2c_config(void) +{ + /* configure I2C0 clock */ + i2c_clock_config(I2C0, 100000, I2C_DTCY_2); + /* configure I2C0 address */ + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_SLAVE_ADDRESS7); + /* enable I2C0 */ + i2c_enable(I2C0); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + /* configure I2C1 clock */ + i2c_clock_config(I2C1, 100000, I2C_DTCY_2); + /* configure I2C1 address */ + i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C1_SLAVE_ADDRESS7); + /* enable I2C1 */ + i2c_enable(I2C1); + /* enable acknowledge */ + i2c_ack_config(I2C1, I2C_ACK_ENABLE); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver/readme.txt new file mode 100644 index 0000000..d0071ec --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver/readme.txt @@ -0,0 +1,48 @@ +/*! + \file readme.txt + \brief description of the master transmitter and slave receiver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows the I2C programming mode in master +transmitter mode and slave receiving mode. In this demo,I2C0 is operated as master transmitter +,I2C1 is operated as slave receiver and the SCL line and SDA line of I2C interface are controled +by the I/O pin PB10 and PB11(or PB6 and PB7) respectively. + + This demo shows the sending data process of the master and the receiving data process of the slave. +If transfer is sucessfully completed, LED2 and LED3 is light. + + We shoud use the jumper to connect the PB6 and PB10. The PB7 and PB11 are connected as well. + + JP16 must be fitted. + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_dma/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_dma/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_dma/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_dma/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_dma/main.c new file mode 100644 index 0000000..9598892 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_dma/main.c @@ -0,0 +1,221 @@ +/*! + \file main.c + \brief master transmitter slave receiver through DMA + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +#define I2C0_SLAVE_ADDRESS7 0x82 +#define I2C1_SLAVE_ADDRESS7 0x72 +#define ARRAYNUM(arr_nanme) (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme))) +#define I2C0_DATA_ADDRESS 0x40005410 +#define I2C1_DATA_ADDRESS 0x40005810 +#define BUFFER_SIZE (ARRAYNUM(i2c0_buff_tx)-1) + +uint8_t i2c0_buff_tx[] = "I2C DMA test"; +uint8_t i2c1_buff_rx[BUFFER_SIZE]; +__IO ErrStatus state = ERROR; + +void rcu_config(void); +void gpio_config(void); +void i2c_config(void); +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + dma_parameter_struct dma_init_struct; + + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + rcu_config(); + gpio_config(); + i2c_config(); + + /* initialize DMA channel4 */ + dma_deinit(DMA0, DMA_CH4); + dma_struct_para_init(&dma_init_struct); + + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.memory_addr = (uint32_t)i2c1_buff_rx; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.number = BUFFER_SIZE; + dma_init_struct.periph_addr = I2C1_DATA_ADDRESS; + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA0, DMA_CH4, &dma_init_struct); + + /* initialize DMA channel5 */ + dma_deinit(DMA0, DMA_CH5); + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.memory_addr = (uint32_t)i2c0_buff_tx; + dma_init_struct.periph_addr = I2C0_DATA_ADDRESS; + dma_init_struct.priority = DMA_PRIORITY_HIGH; + dma_init(DMA0, DMA_CH5, &dma_init_struct); + + /* wait until I2C bus is idle */ + while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); + + /* send a start condition to I2C bus */ + i2c_start_on_bus(I2C0); + + /* wait until SBSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_SBSEND)); + + /* send slave address to I2C bus*/ + i2c_master_addressing(I2C0, I2C1_SLAVE_ADDRESS7, I2C_TRANSMITTER); + + /* wait until ADDSEND bit is set*/ + while(!i2c_flag_get(I2C1, I2C_FLAG_ADDSEND)); + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + i2c_flag_clear(I2C1, I2C_FLAG_ADDSEND); + + /* enable I2C1 DMA */ + i2c_dma_enable(I2C1, I2C_DMA_ON); + /* enable I2C0 DMA */ + i2c_dma_enable(I2C0, I2C_DMA_ON); + /* enable DMA0 channel4 */ + dma_channel_enable(DMA0, DMA_CH4); + /* enable DMA0 channel5 */ + dma_channel_enable(DMA0, DMA_CH5); + + /* DMA0 channel4 full transfer finish flag */ + while(!dma_flag_get(DMA0, DMA_CH4, DMA_FLAG_FTF)); + /* DMA0 channel5 full transfer finish flag */ + while(!dma_flag_get(DMA0, DMA_CH5, DMA_FLAG_FTF)); + + /* send a stop condition to I2C bus*/ + i2c_stop_on_bus(I2C0); + /* wait until stop condition generate */ + while(I2C_CTL0(I2C0)&0x0200); + while(!i2c_flag_get(I2C1, I2C_FLAG_STPDET)); + /* clear the STPDET bit */ + i2c_enable(I2C1); + state = memory_compare(i2c0_buff_tx, i2c1_buff_rx, BUFFER_SIZE); + if(SUCCESS == state){ + gd_eval_led_on(LED2); + gd_eval_led_on(LED3); + }else{ + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + } + while(1); +} + +/*! + \brief memory compare function + \param[in] src : source data + \param[in] dst : destination data + \param[in] length : the compare data length + \param[out] none + \retval ErrStatus : ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length) +{ + while(length--){ + if(*src++ != *dst++){ + return ERROR; + } + } + return SUCCESS; +} + +/*! + \brief enable the peripheral clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOB clock */ + rcu_periph_clock_enable(RCU_GPIOB); + /* enable I2C1 clock */ + rcu_periph_clock_enable(RCU_I2C1); + /* enable I2C0 clock */ + rcu_periph_clock_enable(RCU_I2C0); + /* enable DMA0 clock */ + rcu_periph_clock_enable(RCU_DMA0); +} + +/*! + \brief cofigure the GPIO ports. + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* connect PB6 to I2C0_SCL */ + /* connect PB7 to I2C0_SDA */ + /* connect PB10 to I2C1_SCL */ + /* connect PB11 to I2C1_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7 | GPIO_PIN_10 | GPIO_PIN_11); +} + +/*! + \brief cofigure the I2C0 and I2C1 interfaces + \param[in] none + \param[out] none + \retval none +*/ +void i2c_config(void) +{ + /* configure I2C0 clock */ + i2c_clock_config(I2C0, 100000, I2C_DTCY_2); + /* configure I2C0 address */ + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_SLAVE_ADDRESS7); + /* enable I2C0 */ + i2c_enable(I2C0); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + /* configure I2C1 clock */ + i2c_clock_config(I2C1, 100000, I2C_DTCY_2); + /* configure I2C1 address */ + i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C1_SLAVE_ADDRESS7); + /* enable I2C1 */ + i2c_enable(I2C1); + /* enable acknowledge */ + i2c_ack_config(I2C1, I2C_ACK_ENABLE); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_dma/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_dma/readme.txt new file mode 100644 index 0000000..e96b771 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_dma/readme.txt @@ -0,0 +1,47 @@ +/*! + \file main.c + \brief master transmitter slave receiver through DMA + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use DMA channel5 to transimit data +from RAM memory to I2C0 data register and how to use DMA channel4 to receive data from I2C1 data register. + + In this demo, I2C0 is operated as master transmitter ,I2C1 is operated as slave receiver and the SCL +line and SDA line of I2C interface are controled by the I/O pin PB10 and PB11(or PB6 and PB7) respectively. +If transfer is sucessfully completed, LED2 and LED3 is light. + + We shoud use the jumper to connect the PB6 and PB10. The PB7 and PB11 are connected as well. + + JP16 must be fitted. + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/I2C0_IE.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/I2C0_IE.c new file mode 100644 index 0000000..2aacaf3 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/I2C0_IE.c @@ -0,0 +1,119 @@ +/*! + \file I2C0_IE.c + \brief I2C0 master transmitter interrupt program + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_i2c.h" + +#include "../Master_transmitter_slave_receiver_interrupt/I2C_IE.h" + +uint32_t event1; + +/*! + \brief handle I2C0 event interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void I2C0_EventIRQ_Handler(void) +{ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_SBSEND)){ + /* send slave address */ + i2c_master_addressing(I2C0, I2C1_SLAVE_ADDRESS7, I2C_TRANSMITTER); + }else if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_ADDSEND)){ + /*clear ADDSEND bit */ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_ADDSEND); + }else if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_TBE)){ + if(I2C_nBytes>0){ + /* the master sends a data byte */ + i2c_data_transmit(I2C0, *i2c_txbuffer++); + I2C_nBytes--; + }else{ + /* the master sends a stop condition to I2C bus */ + i2c_stop_on_bus(I2C0); + /* disable the I2C0 interrupt */ + i2c_interrupt_disable(I2C0, I2C_INT_ERR); + i2c_interrupt_disable(I2C0, I2C_INT_BUF); + i2c_interrupt_disable(I2C0, I2C_INT_EV); + } + } +} + +/*! + \brief handle I2C0 error interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void I2C0_ErrorIRQ_Handler(void) +{ + /* no acknowledge received */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_AERR)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_AERR); + } + + /* SMBus alert */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_SMBALT)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_SMBALT); + } + + /* bus timeout in SMBus mode */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_SMBTO)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_SMBTO); + } + + /* over-run or under-run when SCL stretch is disabled */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_OUERR)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_OUERR); + } + + /* arbitration lost */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_LOSTARB)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_LOSTARB); + } + + /* bus error */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_BERR)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_BERR); + } + + /* CRC value doesn't match */ + if(i2c_interrupt_flag_get(I2C0, I2C_INT_FLAG_PECERR)){ + i2c_interrupt_flag_clear(I2C0, I2C_INT_FLAG_PECERR); + } + + /* disable the error interrupt */ + i2c_interrupt_disable(I2C0, I2C_INT_ERR); + i2c_interrupt_disable(I2C0, I2C_INT_BUF); + i2c_interrupt_disable(I2C0, I2C_INT_EV); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/I2C1_IE.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/I2C1_IE.c new file mode 100644 index 0000000..409ceaa --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/I2C1_IE.c @@ -0,0 +1,114 @@ +/*! + \file I2C1_IE.c + \brief I2C1 slave receiver interrupt program + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_i2c.h" + +#include "../Master_transmitter_slave_receiver_interrupt/I2C_IE.h" + +uint32_t event2; + +/*! + \brief handle I2C1 event interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void I2C1_EventIRQ_Handler(void) +{ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_ADDSEND)){ + /* clear the ADDSEND bit */ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_ADDSEND); + }else if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_RBNE)){ + /* if reception data register is not empty ,I2C1 will read a data from I2C_DATA */ + *i2c_rxbuffer++ = i2c_data_receive(I2C1); + }else if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_STPDET)){ + status = SUCCESS; + /* clear the STPDET bit */ + i2c_enable(I2C1); + /* disable I2C1 interrupt */ + i2c_interrupt_disable(I2C1, I2C_INT_ERR); + i2c_interrupt_disable(I2C1, I2C_INT_BUF); + i2c_interrupt_disable(I2C1, I2C_INT_EV); + } +} + +/*! + \brief handle I2C1 error interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void I2C1_ErrorIRQ_Handler(void) +{ + /* no acknowledge received */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_AERR)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_AERR); + } + + /* SMBus alert */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_SMBALT)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_SMBALT); + } + + /* bus timeout in SMBus mode */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_SMBTO)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_SMBTO); + } + + /* over-run or under-run when SCL stretch is disabled */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_OUERR)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_OUERR); + } + + /* arbitration lost */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_LOSTARB)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_LOSTARB); + } + + /* bus error */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_BERR)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_BERR); + } + + /* CRC value doesn't match */ + if(i2c_interrupt_flag_get(I2C1, I2C_INT_FLAG_PECERR)){ + i2c_interrupt_flag_clear(I2C1, I2C_INT_FLAG_PECERR); + } + + /* disable the error interrupt */ + i2c_interrupt_disable(I2C1, I2C_INT_ERR); + i2c_interrupt_disable(I2C1, I2C_INT_BUF); + i2c_interrupt_disable(I2C1, I2C_INT_EV); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/I2C_IE.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/I2C_IE.h new file mode 100644 index 0000000..7bbde86 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/I2C_IE.h @@ -0,0 +1,60 @@ +/*! + \file I2C1_IE.c + \brief The header file of I2C0 and I2C1 interrupt + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef I2C_IE_H +#define I2C_IE_H + +#include "gd32vf103.h" + +#define I2C0_SLAVE_ADDRESS7 0x82 +#define I2C1_SLAVE_ADDRESS7 0x72 + +extern volatile ErrStatus status; +extern volatile uint8_t* i2c_txbuffer; +extern volatile uint8_t* i2c_rxbuffer; +extern volatile uint16_t I2C_nBytes; + +/* function declarations */ +/* handle I2C0 event interrupt request */ +void I2C0_EventIRQ_Handler(void); +/* handle I2C0 error interrupt request */ +void I2C0_ErrorIRQ_Handler(void); +/* handle I2C1 event interrupt request */ +void I2C1_EventIRQ_Handler(void); +/* handle I2C1 error interrupt request */ +void I2C1_ErrorIRQ_Handler(void); + +#endif /* I2C_IE_H */ + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/gd32vf103_it.c new file mode 100644 index 0000000..a4eee21 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/gd32vf103_it.c @@ -0,0 +1,83 @@ +#include "../Master_transmitter_slave_receiver_interrupt/gd32vf103_it.h" + +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#include "../Master_transmitter_slave_receiver_interrupt/I2C_IE.h" + +/*! + \brief this function handles I2C0 event interrupt request exception + \param[in] none + \param[out] none + \retval none +*/ +void I2C0_EV_IRQHandler(void) +{ + I2C0_EventIRQ_Handler(); +} + +/*! + \brief this function handles I2C0 error interrupt request exception + \param[in] none + \param[out] none + \retval none +*/ +void I2C0_ER_IRQHandler(void) +{ + I2C0_ErrorIRQ_Handler(); +} + +/*! + \brief this function handles I2C1 event interrupt request exception + \param[in] none + \param[out] none + \retval none +*/ +void I2C1_EV_IRQHandler(void) +{ + I2C1_EventIRQ_Handler(); +} + +/*! + \brief this function handles I2C1 error interrupt request exception + \param[in] none + \param[out] none + \retval none +*/ +void I2C1_ER_IRQHandler(void) +{ + I2C1_ErrorIRQ_Handler(); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/gd32vf103_it.h new file mode 100644 index 0000000..7b56750 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/gd32vf103_it.h @@ -0,0 +1,50 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* I2C0 event handle function */ +void I2C0_EV_IRQHandler(void); +/* I2C0 error handle function */ +void I2C0_ER_IRQHandler(void); +/* I2C1 event handle function */ +void I2C1_EV_IRQHandler(void); +/* I2C1 error handle function */ +void I2C1_ER_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/main.c new file mode 100644 index 0000000..f507d3a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/main.c @@ -0,0 +1,208 @@ +/*! + \file main.c + \brief master transmitter slave receiver interrupt + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include + +#include "../Master_transmitter_slave_receiver_interrupt/I2C_IE.h" +#include "gd32vf103v_eval.h" + +uint8_t i2c_buffer_transmitter[16]; +uint8_t i2c_buffer_receiver[16]; + +volatile uint8_t* i2c_txbuffer; +volatile uint8_t* i2c_rxbuffer; +volatile uint16_t I2C_nBytes; +volatile ErrStatus status; +ErrStatus state = ERROR; + +void rcu_config(void); +void gpio_config(void); +void i2c_config(void); +void i2c_clic_config(void); +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + int i; + + /* initialize LED2, LED3, as the transfer instruction */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + rcu_config(); + gpio_config(); + i2c_config(); + i2c_clic_config(); + + for(i=0; i<16; i++){ + i2c_buffer_transmitter[i] = i + 0x80; + } + /* initialize i2c_txbuffer, i2c_rxbuffer, I2C_nBytes and status */ + i2c_txbuffer = i2c_buffer_transmitter; + i2c_rxbuffer = i2c_buffer_receiver; + I2C_nBytes = 16; + status = ERROR; + + /* enable the I2C0 interrupt */ + i2c_interrupt_enable(I2C0, I2C_INT_ERR); + i2c_interrupt_enable(I2C0, I2C_INT_EV); + i2c_interrupt_enable(I2C0, I2C_INT_BUF); + + /* enable the I2C1 interrupt */ + i2c_interrupt_enable(I2C1, I2C_INT_ERR); + i2c_interrupt_enable(I2C1, I2C_INT_EV); + i2c_interrupt_enable(I2C1, I2C_INT_BUF); + + /* the master waits until the I2C bus is idle */ + while(i2c_flag_get(I2C0, I2C_FLAG_I2CBSY)); + + /* the master sends a start condition to I2C bus */ + i2c_start_on_bus(I2C0); + + while((I2C_nBytes>0)); + while(SUCCESS != status); + /* if the transfer is successfully completed, LED2 and LED3 is on */ + state = memory_compare(i2c_buffer_transmitter, i2c_buffer_receiver, 16); + if(SUCCESS == state){ + /* if success, LED2 and LED3 are on */ + gd_eval_led_on(LED2); + gd_eval_led_on(LED3); + }else{ + /* if failed, LED2 and LED3 are off */ + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + } + while(1){ + } +} + +/*! + \brief memory compare function + \param[in] src : source data + \param[in] dst : destination data + \param[in] length : the compare data length + \param[out] none + \retval ErrStatus : ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length) +{ + while(length--){ + if(*src++ != *dst++){ + return ERROR; + } + } + return SUCCESS; +} + +/*! + \brief enable the peripheral clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOB clock */ + rcu_periph_clock_enable(RCU_GPIOB); + /* enable I2C1 clock */ + rcu_periph_clock_enable(RCU_I2C1); + /* enable I2C0 clock */ + rcu_periph_clock_enable(RCU_I2C0); +} + +/*! + \brief cofigure the GPIO ports. + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* I2C0 and I2C1 GPIO ports */ + /* connect PB6 to I2C0_SCL */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6); + /* connect PB7 to I2C0_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_7); + /* connect PB10 to I2C1_SCL */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_10); + /* connect PB11 to I2C1_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_11); +} + +/*! + \brief cofigure the I2C0 and I2C1 interfaces.. + \param[in] none + \param[out] none + \retval none +*/ +void i2c_config(void) +{ + /* I2C clock configure */ + i2c_clock_config(I2C0, 100000, I2C_DTCY_2); + /* I2C address configure */ + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_SLAVE_ADDRESS7); + /* enable I2C0 */ + i2c_enable(I2C0); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); + i2c_clock_config(I2C1, 100000, I2C_DTCY_2); + /* I2C address configure */ + i2c_mode_addr_config(I2C1, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C1_SLAVE_ADDRESS7); + /* enable I2C1 */ + i2c_enable(I2C1); + /* enable acknowledge */ + i2c_ack_config(I2C1, I2C_ACK_ENABLE); +} + +/*! + \brief cofigure the NVIC peripheral + \param[in] none + \param[out] none + \retval none +*/ +void i2c_clic_config(void) +{ + eclic_global_interrupt_enable(); + eclic_irq_enable(I2C0_EV_IRQn,1,0); + eclic_irq_enable(I2C1_EV_IRQn,2,0); + eclic_irq_enable(I2C0_ER_IRQn,3,0); + eclic_irq_enable(I2C1_ER_IRQn,4,0); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/readme.txt new file mode 100644 index 0000000..55ac1de --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Master_transmitter_slave_receiver_interrupt/readme.txt @@ -0,0 +1,52 @@ +/*! + \file readme.txt + \brief description of the master transmitter and slave receiver interrupt + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use the I2C +interrupt programming mode in master transmitting mode or slave receiving mode. +In this demo, I2C0 is operated as the master transmitter and I2C1 as the slave +receiver. Moreover,the SCL line and SDA line of I2C0 interface are controled +by the I/O pin PB6 and PB7 respectively. The SCL and SDA of I2C1 are controled +by the pin PB10 and PB11 respectively. + + This demo will send the data of i2c_buffer_transmitter array through I2C1 interface +to the I2C0, and it will store the data received by I2C1 in the i2c_buffer_receiver +array. If transfer is sucessfully completed, LED2 and LED3 are on. + + We shoud use the jumper to connect the PB6 and PB10. The PB7 and PB11 are +connected as well. + + JP16 must be fitted. + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_receiver/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_receiver/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_receiver/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_receiver/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_receiver/main.c new file mode 100644 index 0000000..891e9d8 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_receiver/main.c @@ -0,0 +1,145 @@ +/*! + \file main.c + \brief slave receiver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +#define I2C0_OWN_ADDRESS7 0x82 + +uint8_t i2c_receiver[16]; + +void rcu_config(void); +void gpio_config(void); +void i2c_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + int i; + + /* configure USART */ + gd_eval_com_init(EVAL_COM0); + + printf("\r\n I2C Start\n"); + + /* RCU config */ + rcu_config(); + /* GPIO config */ + gpio_config(); + /* I2C config */ + i2c_config(); + + i=0; + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + printf("\r\n I2C slave receive data: \r\n\n"); + for(i=0; i<16; i++){ + /* wait until the RBNE bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_RBNE)); + + /* read a data byte from I2C_DATA */ + i2c_receiver[i] = i2c_data_receive(I2C0); + } + /* wait until the STPDET bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_STPDET)); + /* clear the STPDET bit */ + i2c_enable(I2C0); + + printf("\r\n I2C SUCCESS\n"); + + while(1){ + } +} + +/*! + \brief enable the peripheral clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOB clock */ + rcu_periph_clock_enable(RCU_GPIOB); + /* enable I2C0 clock */ + rcu_periph_clock_enable(RCU_I2C0); +} + +/*! + \brief cofigure the GPIO ports + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* connect PB6 to I2C0_SCL */ + /* connect PB7 to I2C0_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); +} + +/*! + \brief cofigure the I2C0 interfaces + \param[in] none + \param[out] none + \retval none +*/ +void i2c_config(void) +{ + /* I2C clock configure */ + i2c_clock_config(I2C0, 100000, I2C_DTCY_2); + /* I2C address configure */ + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_OWN_ADDRESS7); + /* enable I2C0 */ + i2c_enable(I2C0); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); +} + +/* retarget the C library printf function to the usart */ +int fputc(int ch, FILE *f) +{ + usart_data_transmit(EVAL_COM0, (uint8_t)ch); + while (RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE)); + return ch; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_receiver/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_receiver/readme.txt new file mode 100644 index 0000000..486b0e9 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_receiver/readme.txt @@ -0,0 +1,49 @@ +/*! + \file readme.txt + \brief description of the slave receiver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows the I2C programming +mode in slave receiving mode. In this demo, I2C0 is operated as slave receiver, +and the SCL line and SDA line of I2C0 interface are controled by the I/O pin +PB6 and PB7 respectively. + + This demo shows the receving process of the slave. And it will store the +received data in the i2c_receiver array. + + The demo doesn't perform the data transfer actually, which is due to no specific +master.In the specific application, we need config the master to start a data +transmission.In addition,the master and the slave may need to be connected by +the jumper if necessary. + + JP16 must be fitted. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_transmitter/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_transmitter/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_transmitter/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_transmitter/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_transmitter/main.c new file mode 100644 index 0000000..fcb2179 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_transmitter/main.c @@ -0,0 +1,151 @@ +/*! + \file main.c + \brief slave transmitter + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" + +#define I2C_10BIT_ADDRESS 0 + +#define I2C0_OWN_ADDRESS7 0x82 +#define I2C0_SLAVE_ADDRESS7 0x72 +#define I2C0_OWN_ADDRESS10 0x0322 + +uint8_t i2c_transmitter[16]; + +void rcu_config(void); +void gpio_config(void); +void i2c_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + int i; + + /* RCU config */ + rcu_config(); + /* GPIO config */ + gpio_config(); + /* I2C config */ + i2c_config(); + + for(i=0; i<16; i++){ + i2c_transmitter[i] = i+0x80; + } + +#if I2C_10BIT_ADDRESS + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); +#else + /* wait until ADDSEND bit is set */ + while(!i2c_flag_get(I2C0, I2C_FLAG_ADDSEND)); + /* clear ADDSEND bit */ + i2c_flag_clear(I2C0, I2C_FLAG_ADDSEND); +#endif + /* wait until the transmission data register is empty */ + while(!i2c_flag_get(I2C0, I2C_FLAG_TBE)); + + for(i=0;i<16;i++){ + /* send a data byte */ + i2c_data_transmit(I2C0, i2c_transmitter[i]); + /* wait until the transmission data register is empty */ + while(!i2c_flag_get(I2C0, I2C_FLAG_TBE)); + } + /* the master doesn't acknowledge for the last byte */ + while(!i2c_flag_get(I2C0, I2C_FLAG_AERR)); + /* clear the bit of AERR */ + i2c_flag_clear(I2C0, I2C_FLAG_AERR); + + while(1){ + } +} + +/*! + \brief enable the peripheral clock + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + /* enable GPIOB clock */ + rcu_periph_clock_enable(RCU_GPIOB); + /* enable I2C0 clock */ + rcu_periph_clock_enable(RCU_I2C0); +} + +/*! + \brief cofigure the GPIO ports + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* connect PB6 to I2C0_SCL */ + /* connect PB7 to I2C0_SDA */ + gpio_init(GPIOB, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, GPIO_PIN_6 | GPIO_PIN_7); +} + +/*! + \brief cofigure the I2C0 interfaces + \param[in] none + \param[out] none + \retval none +*/ +void i2c_config(void) +{ + /* I2C clock configure */ + i2c_clock_config(I2C0, 400000, I2C_DTCY_2); + /* I2C address configure */ +#if I2C_10BIT_ADDRESS + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_10BITS, I2C0_OWN_ADDRESS10); +#else + i2c_mode_addr_config(I2C0, I2C_I2CMODE_ENABLE, I2C_ADDFORMAT_7BITS, I2C0_OWN_ADDRESS7); +#endif + /* enable I2C0 */ + i2c_enable(I2C0); + /* enable acknowledge */ + i2c_ack_config(I2C0, I2C_ACK_ENABLE); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_transmitter/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_transmitter/readme.txt new file mode 100644 index 0000000..be9912c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/I2C/Slave_transmitter/readme.txt @@ -0,0 +1,52 @@ +/*! + \file readme.txt + \brief description of the slave transmitter + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows the I2C programming +mode in slave transmitting mode.In this demo,I2C0 is operated as slave +transmitter,and the SCL line and SDA line of I2C0 interface are controled by +the I/O pin PB6 and PB7 respectively. + + This demo shows the sending data process of the slave. And it will send the +data in the i2c_transmitter array through the I2C0. + + The demo doesn't perform the data transfer actually, which is due to no specific +master.In the specific application, we need config the master to start a data +transmission.In addition,the master and the slave may need to be connected by +the jumper if necessary.When the macro I2C_10BIT_ADDRESS is 1, I2C communicate in +10 bit addressing mode, otherwise, I2C communicate in 7 bit addressing mode. + + JP16 must be fitted. + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/gd32vf103_it.c new file mode 100644 index 0000000..bd781ea --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/gd32vf103_it.c @@ -0,0 +1,62 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" +#include "gd32vf103v_eval.h" +#include "main.h" + +/*! + \brief this function handles eclic_mtip exception + \param[in] none + \param[out] none + \retval none +*/ +void eclic_mtip_handler(void) +{ + *(uint64_t*)(TIMER_CTRL_ADDR + TIMER_MTIME) = 0; + led_spark(); +} + +/*! + \brief this function handles EXTI10_15 exception + \param[in] none + \param[out] none + \retval none +*/ +void EXTI10_15_IRQHandler(void) +{ + if(SET == exti_interrupt_flag_get(EXTI_13)){ + exti_interrupt_flag_clear(EXTI_13); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/gd32vf103_it.h new file mode 100644 index 0000000..c27b8a1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/gd32vf103_it.h @@ -0,0 +1,46 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* eclic_mtip handle function */ +void eclic_mtip_handler(void); +/* EXTI10_15 handle function */ +void EXTI10_15_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/main.c new file mode 100644 index 0000000..cd67ffe --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/main.c @@ -0,0 +1,138 @@ +/*! + \file main.c + \brief deepsleep wakeup through exti interrupt + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include "systick.h" +#include "main.h" + +#define BKP_DATA_REG_NUM 42 + +void led_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* configure systick */ + systick_config(); + + /* led config */ + led_config(); + /* clock enable */ + rcu_periph_clock_enable(RCU_PMU); + /* wakeup key config */ + gd_eval_key_init(KEY_A, KEY_MODE_GPIO); + /* tamper key EXTI config */ + gd_eval_key_init(KEY_B, KEY_MODE_EXTI); + /* press wakeup key to enter deepsleep mode and use tamper key generate a exti interrupt to wakeup mcu */ + while(1){ + if(RESET == gpio_input_bit_get(KEY_A_GPIO_PORT, KEY_A_PIN)) + pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD); + } +} + +/*! + \brief toggle the led + \param[in] none + \param[out] none + \retval none +*/ +void led_spark(void) +{ + static __IO uint32_t timingdelaylocal = 0; + + if (timingdelaylocal != 0x00){ + /* all the leds on */ + if(timingdelaylocal < 200){ + gd_eval_led_on(LED1); + gd_eval_led_on(LED2); + gd_eval_led_on(LED3); + gd_eval_led_on(LED4); + }else{ + /* all the leds off */ + gd_eval_led_off(LED1); + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + gd_eval_led_off(LED4); + } + timingdelaylocal--; + }else{ + timingdelaylocal = 400; + } +} + +/*! + \brief check if the backup data registers are clear or not + \param[in] none + \param[out] none + \retval the number of data register +*/ +uint32_t is_backup_register_clear(void) +{ + uint32_t temp = 0; + + for(temp = 0; temp < BKP_DATA_REG_NUM; temp++){ + if(temp < 10){ + /* check if the data of data register 0-9 is 0x0000 */ + if(0x0000 != BKP_DATA_GET(BKP_DATA0_9(temp))){ + return temp+1; + } + }else{ + /* check if the data of data register 10-41 is 0x0000 */ + if(0x0000 != BKP_DATA_GET(BKP_DATA10_41(temp))){ + return temp+1; + } + } + } + return 0; +} + +/*! + \brief led config + \param[in] none + \param[out] none + \retval none +*/ +void led_config(void) +{ + gd_eval_led_init(LED1); + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/main.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/main.h new file mode 100644 index 0000000..b6c147f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/main.h @@ -0,0 +1,41 @@ +/*! + \file main.h + \brief the header file of the main + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef MAIN_H +#define MAIN_H + +/* led spark function */ +void led_spark(void); + +#endif /* MAIN_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/readme.txt new file mode 100644 index 0000000..3299df8 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/readme.txt @@ -0,0 +1,39 @@ +/*! + \file readme.txt + \brief description of the deepsleep wakeup through exti demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows pmu how to enter deepsleep +mode and wakeup it. Press wakeup key to enter deepsleep mode, led stop flashing. When +you press tamper key to generate an exti interrupt, mcu will be wakeuped from deepsleep +mode, led sparks again. But the led sparks slower, because at this time IRC8M is the system +clock. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/systick.c new file mode 100644 index 0000000..f9870b5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/systick.c @@ -0,0 +1,80 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include "n200_func.h" + +volatile static uint32_t delay; + +/*! + \brief configure systick + \param[in] none + \param[out] none + \retval none +*/ +void systick_config(void) +{ + eclic_global_interrupt_enable(); + *(uint64_t*)(TIMER_CTRL_ADDR + TIMER_MTIMECMP) = TIMER_FREQ/1000 ; + eclic_irq_enable(CLIC_INT_TMR, 2, 0); + *(uint64_t*)(TIMER_CTRL_ADDR + TIMER_MTIME) = 0; +} + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + delay = count; + + while(0U != delay){ + } +} + +/*! + \brief delay decrement + \param[in] none + \param[out] none + \retval none +*/ +void delay_decrement(void) +{ + if (0U != delay){ + delay--; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/systick.h new file mode 100644 index 0000000..1ef3c75 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Deepsleep_wakeup_exti/systick.h @@ -0,0 +1,47 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +/* configure systick */ +void systick_config(void); +/* delay a time in milliseconds */ +void delay_1ms(uint32_t count); +/* delay decrement */ +void delay_decrement(void); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/gd32vf103_it.c new file mode 100644 index 0000000..80d56ab --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/gd32vf103_it.c @@ -0,0 +1,50 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" +#include "gd32vf103v_eval.h" + +/*! + \brief this function handles LVD exception + \param[in] none + \param[out] none + \retval none +*/ +void LVD_IRQHandler(void) +{ + if(RESET != exti_interrupt_flag_get(EXTI_16)){ + gd_eval_led_toggle(LED1); + exti_interrupt_flag_clear(EXTI_16); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/gd32vf103_it.h new file mode 100644 index 0000000..6e099ba --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/gd32vf103_it.h @@ -0,0 +1,44 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* LVD handle function */ +void LVD_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/main.c new file mode 100644 index 0000000..8be081b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/main.c @@ -0,0 +1,92 @@ +/*! + \file main.c + \brief low voltage detector + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +#define BKP_DATA_REG_NUM 42 + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* configure ECLIC */ + eclic_global_interrupt_enable(); + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1); + eclic_irq_enable(LVD_IRQn, 1, 0); + /* clock enable */ + rcu_periph_clock_enable(RCU_PMU); + /* initialize LED1 */ + gd_eval_led_init(LED1); + /* turn on LED1*/ + gd_eval_led_on(LED1); + /* configure EXTI_16 */ + exti_init(EXTI_16, EXTI_INTERRUPT, EXTI_TRIG_BOTH); + /* configure the lvd threshold to 2.9v */ + pmu_lvd_select(PMU_LVDT_7); + + while(1){ + } +} + +/*! + \brief check if the backup data registers are clear or not + \param[in] none + \param[out] none + \retval the number of data register +*/ +uint32_t is_backup_register_clear(void) +{ + uint32_t temp = 0; + + for(temp = 0; temp < BKP_DATA_REG_NUM; temp++){ + if(temp < 10){ + /* check if the data of data register 0-9 is 0x0000 */ + if(0x0000 != BKP_DATA_GET(BKP_DATA0_9(temp))){ + return temp+1; + } + }else{ + /* check if the data of data register 10-41 is 0x0000 */ + if(0x0000 != BKP_DATA_GET(BKP_DATA10_41(temp))){ + return temp+1; + } + } + } + return 0; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/readme.txt new file mode 100644 index 0000000..b0105a6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Low_voltage_detector/readme.txt @@ -0,0 +1,40 @@ +/*! + \file readme.txt + \brief description of the low voltage detector demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use low voltage detector. +If VDD/VDDA is higher or lower than the LVD threshold, then a lvd event will occur. The event +is internally connected to the EXTI line 16 and can generate an interrupt if enabled through +the EXTI registers. Use external power connect 3.3v pin and GND pin of the board , adjust +voltage higher or lower than the LVD threshold 2.9v, LED1 will toggle. + \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Standby_wakeup_pin/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Standby_wakeup_pin/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Standby_wakeup_pin/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Standby_wakeup_pin/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Standby_wakeup_pin/main.c new file mode 100644 index 0000000..7a6fb49 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Standby_wakeup_pin/main.c @@ -0,0 +1,81 @@ +/*! + \file main.c + \brief standby wakeup through wakeup pin + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +void led_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* clock enable */ + rcu_periph_clock_enable(RCU_PMU); + /* led configuration and turn on all led */ + led_config(); + gd_eval_led_on(LED1); + gd_eval_led_on(LED2); + gd_eval_led_on(LED3); + gd_eval_led_on(LED4); + /* tamper key configuration */ + gd_eval_key_init(KEY_B, KEY_MODE_GPIO); + /* wakeup pin enable */ + pmu_wakeup_pin_enable(); + /* press tamper key to enter standby mode and use wakeup key to wakeup mcu */ + while(1){ + if(RESET == gpio_input_bit_get(KEY_B_GPIO_PORT, KEY_B_PIN)){ + pmu_to_standbymode(WFI_CMD); + } + } +} + +/*! + \brief configure led + \param[in] none + \param[out] none + \retval none +*/ +void led_config(void) +{ + gd_eval_led_init(LED1); + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Standby_wakeup_pin/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Standby_wakeup_pin/readme.txt new file mode 100644 index 0000000..055d041 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/PMU/Standby_wakeup_pin/readme.txt @@ -0,0 +1,40 @@ +/*! + \file readme.txt + \brief description of the standby mode wakeup through wakeup pin demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows pmu how to enter standby +mode and wakeup it. Press tamper key enter standby mode, led turn off. When you press +wakeup key, mcu will be wakeuped from standby mode, led will be turn on. when exit from +the standby mode, a power-on reset occurs and the mcu will execute instruction code +from the 0x00000000 address. + \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/gd32vf103_it.c new file mode 100644 index 0000000..5793f8d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/gd32vf103_it.c @@ -0,0 +1,64 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" +#include "gd32vf103v_eval.h" + +extern __IO uint32_t timedisplay; + +/*! + \brief this function handles RTC global interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void RTC_IRQHandler(void) +{ + if (rtc_flag_get(RTC_FLAG_SECOND) != RESET){ + /* clear the RTC second interrupt flag*/ + rtc_flag_clear(RTC_FLAG_SECOND); + + /* enable time update */ + timedisplay = 1; + + /* wait until last write operation on RTC registers has finished */ + rtc_lwoff_wait(); + /* reset RTC counter when time is 23:59:59 */ + if (rtc_counter_get() == 0x00015180){ + rtc_counter_set(0x0); + /* wait until last write operation on RTC registers has finished */ + rtc_lwoff_wait(); + } + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/gd32vf103_it.h new file mode 100644 index 0000000..c009cbb --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/gd32vf103_it.h @@ -0,0 +1,44 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* RTC global interrupt function */ +void RTC_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/main.c new file mode 100644 index 0000000..cb295f0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/main.c @@ -0,0 +1,156 @@ +/*! + \file main.c + \brief RTC calendar + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include "rtc.h" +#include + +#define BKP_DATA_REG_NUM 42 + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* COM0 configure */ + gd_eval_com_init(EVAL_COM0); + + /* ECLIC configure */ + eclic_global_interrupt_enable(); + eclic_set_nlbits(ECLIC_GROUP_LEVEL3_PRIO1); + eclic_irq_enable(RTC_IRQn, 1, 0); + + printf( "\r\n This is a RTC demo...... \r\n" ); + + if (bkp_data_read(BKP_DATA_0) != 0xA5A5){ + /* backup data register value is not correct or not yet programmed + (when the first time the program is executed) */ + printf("\r\nThis is a RTC demo!\r\n"); + printf("\r\n\n RTC not yet configured...."); + + /* RTC configuration */ + rtc_configuration(); + + printf("\r\n RTC configured...."); + + /* adjust time by values entred by the user on the hyperterminal */ + time_adjust(); + + bkp_data_write(BKP_DATA_0, 0xA5A5); + }else{ + /* check if the power on reset flag is set */ + if (rcu_flag_get(RCU_FLAG_PORRST) != RESET){ + printf("\r\n\n Power On Reset occurred...."); + }else if (rcu_flag_get(RCU_FLAG_SWRST) != RESET){ + /* check if the pin reset flag is set */ + printf("\r\n\n External Reset occurred...."); + } + + /* allow access to BKP domain */ + rcu_periph_clock_enable(RCU_PMU); + pmu_backup_write_enable(); + + printf("\r\n No need to configure RTC...."); + /* wait for RTC registers synchronization */ + rtc_register_sync_wait(); + + /* enable the RTC second */ + rtc_interrupt_enable(RTC_INT_SECOND); + + /* wait until last write operation on RTC registers has finished */ + rtc_lwoff_wait(); + } + +#ifdef RTCCLOCKOUTPUT_ENABLE + /* enable PMU and BKPI clocks */ + rcu_periph_clock_enable(RCU_BKPI); + rcu_periph_clock_enable(RCU_PMU); + /* allow access to BKP domain */ + pmu_backup_write_enable(); + + /* disable the tamper pin */ + bkp_tamper_detection_disable(); + + /* enable RTC clock output on tamper Pin */ + bkp_rtc_calibration_output_enable(); +#endif + + /* clear reset flags */ + rcu_all_reset_flag_clear(); + + /* display time in infinite loop */ + time_show(); + + while (1){ + } +} + +/*! + \brief check if the backup data registers are clear or not + \param[in] none + \param[out] none + \retval the number of data register +*/ +uint32_t is_backup_register_clear(void) +{ + uint32_t temp = 0; + + for(temp = 0; temp < BKP_DATA_REG_NUM; temp++){ + if(temp < 10){ + /* check if the data of data register 0-9 is 0x0000 */ + if(0x0000 != BKP_DATA_GET(BKP_DATA0_9(temp))){ + return temp+1; + } + }else{ + /* check if the data of data register 10-41 is 0x0000 */ + if(0x0000 != BKP_DATA_GET(BKP_DATA10_41(temp))){ + return temp+1; + } + } + } + return 0; +} + +/* retarget the C library printf function to the USART */ +int fputc(int ch, FILE *f) +{ + usart_data_transmit(EVAL_COM0, (uint8_t)ch); + while(RESET == usart_flag_get(EVAL_COM0, USART_FLAG_TBE)); + + return ch; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/readme.txt new file mode 100644 index 0000000..fc38937 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/readme.txt @@ -0,0 +1,44 @@ +/*! + \file readme.txt + \brief description of calendar demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it explains how to configure the + RTC module. In this demo, RTC peripheral is configured to display calendar. + Select LXTAL as RTC clock source. And the HyperTerminal should be connected to the + evaluation board via COM0. + After start-up,if the BKP data register is written to a key value. If the value + is incorrect, the program will ask to set the time on the HyperTerminal. If the + key value is correct, by the HyperTerminal set time,the calendar will be displayed + on the HyperTerminal. + The RTC module is in the Backup Domain, and is not reset by the system reset. + \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/rtc.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/rtc.c new file mode 100644 index 0000000..b18c151 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/rtc.c @@ -0,0 +1,205 @@ +/*! + \file rtc.c + \brief RTC check and config,time_show and time_adjust function + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "rtc.h" + +/* enter the second interruption,set the second interrupt flag to 1 */ +__IO uint32_t timedisplay; + +/*! + \brief configure the RTC + \param[in] none + \param[out] none + \retval none +*/ +void rtc_configuration(void) +{ + /* enable PMU and BKPI clocks */ + rcu_periph_clock_enable(RCU_BKPI); + rcu_periph_clock_enable(RCU_PMU); + /* allow access to BKP domain */ + pmu_backup_write_enable(); + + /* reset backup domain */ + bkp_deinit(); + + /* enable LXTAL */ + rcu_osci_on(RCU_LXTAL); + /* wait till LXTAL is ready */ + rcu_osci_stab_wait(RCU_LXTAL); + + /* select RCU_LXTAL as RTC clock source */ + rcu_rtc_clock_config(RCU_RTCSRC_LXTAL); + + /* enable RTC Clock */ + rcu_periph_clock_enable(RCU_RTC); + + /* wait for RTC registers synchronization */ + rtc_register_sync_wait(); + + /* wait until last write operation on RTC registers has finished */ + rtc_lwoff_wait(); + + /* enable the RTC second interrupt*/ + rtc_interrupt_enable(RTC_INT_SECOND); + + /* wait until last write operation on RTC registers has finished */ + rtc_lwoff_wait(); + + /* set RTC prescaler: set RTC period to 1s */ + rtc_prescaler_set(32767); + + /* wait until last write operation on RTC registers has finished */ + rtc_lwoff_wait(); +} + +/*! + \brief return the time entered by user, using Hyperterminal + \param[in] none + \param[out] none + \retval current time of RTC counter value +*/ +uint32_t time_regulate(void) +{ + uint32_t tmp_hh = 0xFF, tmp_mm = 0xFF, tmp_ss = 0xFF; + + printf("\r\n==============Time Settings====================================="); + printf("\r\n Please Set Hours"); + + while (tmp_hh == 0xFF){ + tmp_hh = usart_scanf(23); + } + printf(": %d", tmp_hh); + printf("\r\n Please Set Minutes"); + while (tmp_mm == 0xFF){ + tmp_mm = usart_scanf(59); + } + printf(": %d", tmp_mm); + printf("\r\n Please Set Seconds"); + while (tmp_ss == 0xFF){ + tmp_ss = usart_scanf(59); + } + printf(": %d", tmp_ss); + + /* return the value store in RTC counter register */ + return((tmp_hh*3600 + tmp_mm*60 + tmp_ss)); +} + +/*! + \brief adjust time + \param[in] none + \param[out] none + \retval none +*/ +void time_adjust(void) +{ + /* wait until last write operation on RTC registers has finished */ + rtc_lwoff_wait(); + /* change the current time */ + rtc_counter_set(time_regulate()); + /* wait until last write operation on RTC registers has finished */ + rtc_lwoff_wait(); +} + +/*! + \brief display the current time + \param[in] timeVar: RTC counter value + \param[out] none + \retval none +*/ +void time_display(uint32_t timevar) +{ + uint32_t thh = 0, tmm = 0, tss = 0; + + /* compute hours */ + thh = timevar / 3600; + /* compute minutes */ + tmm = (timevar % 3600) / 60; + /* compute seconds */ + tss = (timevar % 3600) % 60; + + printf(" Time: %0.2d:%0.2d:%0.2d\r\n", thh, tmm, tss); +} + +/*! + \brief show the current time (HH:MM:SS) on the Hyperterminal + \param[in] none + \param[out] none + \retval none +*/ +void time_show(void) +{ + printf("\n\r"); + + /* infinite loop */ + while (1){ + /* if 1s has paased */ + if (timedisplay == 1){ + /* display current time */ + time_display(rtc_counter_get()); + timedisplay = 0; + } + } +} + +/*! + \brief get numeric values from the hyperterminal + \param[in] value: input value from the hyperterminal + \param[out] none + \retval input value in BCD mode +*/ +uint8_t usart_scanf(uint32_t value) +{ + uint32_t index = 0; + uint32_t tmp[2] = {0, 0}; + + while (index < 2){ + /* loop until RBNE = 1 */ + while (usart_flag_get(USART0, USART_FLAG_RBNE) == RESET); + tmp[index++] = (usart_data_receive(USART0)); + + if ((tmp[index - 1] < 0x30) || (tmp[index - 1] > 0x39)){ + printf("\n\rPlease enter valid number between 0 and 9\n"); + index--; + } + } + /* calculate the Corresponding value */ + index = (tmp[1] - 0x30) + ((tmp[0] - 0x30) * 10); + /* check */ + if (index > value){ + printf("\n\rPlease enter valid number between 0 and %d\n", value); + return 0xFF; + } + return index; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/rtc.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/rtc.h new file mode 100644 index 0000000..6295f46 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/RTC/Calendar_demo/rtc.h @@ -0,0 +1,49 @@ +/*! + \file rtc.h + \brief headfile of RTC check and config,time_show and time_adjust function + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __RTC_H +#define __RTC_H + +#include "gd32vf103.h" +#include + +void rtc_configuration(void); +uint32_t time_regulate(void); +void time_adjust(void); +void time_display(uint32_t timevar); +void time_show(void); +uint8_t usart_scanf(uint32_t value); + +#endif /* __RTC_H */ + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/I2S_master_transmit_slave_receive_dma/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/I2S_master_transmit_slave_receive_dma/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/I2S_master_transmit_slave_receive_dma/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/I2S_master_transmit_slave_receive_dma/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/I2S_master_transmit_slave_receive_dma/main.c new file mode 100644 index 0000000..fff37bf --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/I2S_master_transmit_slave_receive_dma/main.c @@ -0,0 +1,208 @@ +/*! + \file main.c + \brief I2S master send and slave receive communication use DMA + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#define ARRAYSIZE 10 + +uint16_t i2s1_send_array[ARRAYSIZE] = {0xAAB1, 0xAAB2, 0xAAB3, 0xAAB4, 0xAAB5, 0xAAB6, 0xAAB7, 0xAAB8, 0xAAB9, 0xAABA}; +uint16_t i2s2_receive_array[ARRAYSIZE]; +ErrStatus memory_compare(uint16_t* src, uint16_t* dst, uint8_t length); +uint32_t send_n = 0, receive_n = 0; + +void rcu_config(void); +void gpio_config(void); +void dma_config(void); +void spi_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* initialize the LED */ + gd_eval_led_init(LED2); + + /* peripheral clock enable */ + rcu_config(); + /* GPIO configure */ + gpio_config(); + /* DMA configure */ + dma_config(); + /* SPI configure */ + spi_config(); + /* SPI DMA enable */ + spi_dma_enable(SPI2, SPI_DMA_RECEIVE); + spi_dma_enable(SPI1, SPI_DMA_TRANSMIT); + /* DMA channel enable */ + dma_channel_enable(DMA1, DMA_CH0); + dma_channel_enable(DMA0, DMA_CH4); + /* SPI enable */ + i2s_enable(SPI2); + i2s_enable(SPI1); + + /* wait DMA transmit complete */ + while(!dma_flag_get(DMA0, DMA_CH4, DMA_FLAG_FTF)); + while(!dma_flag_get(DMA1, DMA_CH0, DMA_FLAG_FTF)); + + /* compare receive data with send data */ + if(ERROR != memory_compare(i2s2_receive_array, i2s1_send_array, ARRAYSIZE)){ + gd_eval_led_on(LED2); + }else{ + gd_eval_led_off(LED2); + } + + while(1); +} + +/*! + \brief configure different peripheral clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + rcu_pll2_config(RCU_PLL2_MUL8); + rcu_osci_on(RCU_PLL2_CK); + while((RCU_CTL & RCU_CTL_PLL2STB) == 0){ + } + rcu_i2s1_clock_config(RCU_I2S1SRC_CKPLL2_MUL2); + rcu_i2s2_clock_config(RCU_I2S2SRC_CKPLL2_MUL2); + + rcu_periph_clock_enable(RCU_SPI1); + rcu_periph_clock_enable(RCU_SPI2); + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_GPIOC); + rcu_periph_clock_enable(RCU_AF); + rcu_periph_clock_enable(RCU_DMA0); + rcu_periph_clock_enable(RCU_DMA1); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* I2S1 GPIO config: I2S1_WS/PB12, I2S1_CK/PB13, I2S_SD/PB15 */ + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12 | GPIO_PIN_13 | GPIO_PIN_15); + + /* I2S2 GPIO config: I2S2_WS/PA4, I2S2_CK/PC10, I2S2_SD/PC12 */ + gpio_pin_remap_config(GPIO_SPI2_REMAP, ENABLE); + gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_12); + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_4); +} + +/*! + \brief configure the DMA peripheral + \param[in] none + \param[out] none + \retval none +*/ +void dma_config(void) +{ + dma_parameter_struct dma_init_struct; + + /* SPI1 transmit dma config: DMA0,DMA_CH4 */ + dma_deinit(DMA0, DMA_CH4); + dma_struct_para_init(&dma_init_struct); + + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI1); + dma_init_struct.memory_addr = (uint32_t)i2s1_send_array; + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; + dma_init_struct.priority = DMA_PRIORITY_LOW; + dma_init_struct.number = ARRAYSIZE; + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init(DMA0, DMA_CH4, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH4); + dma_memory_to_memory_disable(DMA0, DMA_CH4); + + /* SPI2 receive dma config: DMA1-DMA_CH0 */ + dma_deinit(DMA1, DMA_CH0); + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI2); + dma_init_struct.memory_addr = (uint32_t)i2s2_receive_array; + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.priority = DMA_PRIORITY_HIGH; + dma_init(DMA1, DMA_CH0, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA1, DMA_CH0); + dma_memory_to_memory_disable(DMA1, DMA_CH0); +} + +/*! + \brief configure the SPI peripheral + \param[in] none + \param[out] none + \retval none +*/ +void spi_config(void) +{ + spi_i2s_deinit(SPI1); + spi_i2s_deinit(SPI2); + + i2s_init(SPI1, I2S_MODE_MASTERTX, I2S_STD_PHILLIPS, I2S_CKPL_LOW); + i2s_psc_config(SPI1, I2S_AUDIOSAMPLE_44K, I2S_FRAMEFORMAT_DT16B_CH16B, I2S_MCKOUT_DISABLE); + + i2s_init(SPI2, I2S_MODE_SLAVERX, I2S_STD_PHILLIPS, I2S_CKPL_LOW); + i2s_psc_config(SPI2, I2S_AUDIOSAMPLE_44K, I2S_FRAMEFORMAT_DT16B_CH16B, I2S_MCKOUT_DISABLE); +} + +/*! + \brief memory compare function + \param[in] src: source data pointer + \param[in] dst: destination data pointer + \param[in] length: the compare data length + \param[out] none + \retval ErrStatus : ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint16_t* src, uint16_t* dst, uint8_t length) +{ + while(length--){ + if(*src++ != *dst++) + return ERROR; + } + return SUCCESS; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/I2S_master_transmit_slave_receive_dma/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/I2S_master_transmit_slave_receive_dma/readme.txt new file mode 100644 index 0000000..651364d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/I2S_master_transmit_slave_receive_dma/readme.txt @@ -0,0 +1,41 @@ +/*! + \file readme.txt + \brief description of I2S master send and slave receive communication use DMA demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows I2S1 master send and I2S2 slave +receive communication by using DMA mode. After the communication is complete, if data received +is equal to data transmitted, led2 turns on, if not led2 turns off. + + Connect I2S1 WS PIN(PB12) to I2S2 WS PIN(PA4). + Connect I2S1 CK PIN(PB13) to I2S2 CK PIN(PC10). + Connect I2S1 SD PIN(PB15) to I2S2 SD PIN(PC12). \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_dma/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_dma/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_dma/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_dma/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_dma/main.c new file mode 100644 index 0000000..b7a3ad3 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_dma/main.c @@ -0,0 +1,255 @@ +/*! + \file main.c + \brief SPI fullduplex communication use DMA + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#define ARRAYSIZE 10 + +uint8_t spi0_send_array[ARRAYSIZE] = {0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA}; +uint8_t spi2_send_array[ARRAYSIZE] = {0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA}; +uint8_t spi0_receive_array[ARRAYSIZE]; +uint8_t spi2_receive_array[ARRAYSIZE]; +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length); + +uint32_t send_n = 0, receive_n = 0; + +void rcu_config(void); +void gpio_config(void); +void dma_config(void); +void spi_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* initialize the LEDs */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + + /* peripheral clock enable */ + rcu_config(); + /* GPIO configure */ + gpio_config(); + /* DMA configure */ + dma_config(); + /* SPI configure */ + spi_config(); + + /* SPI enable */ + spi_enable(SPI2); + spi_enable(SPI0); + + /* DMA channel enable */ + dma_channel_enable(DMA0, DMA_CH1); + dma_channel_enable(DMA0, DMA_CH2); + dma_channel_enable(DMA1, DMA_CH0); + dma_channel_enable(DMA1, DMA_CH1); + + /* SPI DMA enable */ + spi_dma_enable(SPI2, SPI_DMA_TRANSMIT); + spi_dma_enable(SPI2, SPI_DMA_RECEIVE); + spi_dma_enable(SPI0, SPI_DMA_TRANSMIT); + spi_dma_enable(SPI0, SPI_DMA_RECEIVE); + + /* wait dma transmit complete */ + while(!dma_flag_get(DMA0, DMA_CH2, DMA_FLAG_FTF)); + while(!dma_flag_get(DMA1, DMA_CH1, DMA_FLAG_FTF)); + while(!dma_flag_get(DMA0, DMA_CH1, DMA_FLAG_FTF)); + while(!dma_flag_get(DMA1, DMA_CH0, DMA_FLAG_FTF)); + + /* compare receive data with send data */ + if(ERROR !=memory_compare(spi2_receive_array, spi0_send_array, ARRAYSIZE)){ + gd_eval_led_on(LED2); + }else{ + gd_eval_led_off(LED2); + } + + if(ERROR !=memory_compare(spi0_receive_array, spi2_send_array, ARRAYSIZE)){ + gd_eval_led_on(LED3); + }else{ + gd_eval_led_off(LED3); + } + + while(1); +} + +/*! + \brief configure different peripheral clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOC); + rcu_periph_clock_enable(RCU_AF); + rcu_periph_clock_enable(RCU_DMA0); + rcu_periph_clock_enable(RCU_DMA1); + rcu_periph_clock_enable(RCU_SPI0); + rcu_periph_clock_enable(RCU_SPI2); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* SPI0 GPIO config:SCK/PA5, MISO/PA6, MOSI/PA7 */ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7); + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); + + /* SPI2 GPIO config:SCK/PC10, MISO/PC11, MOSI/PC12 */ + gpio_pin_remap_config(GPIO_SPI2_REMAP, ENABLE); + gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_12); + gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11); +} + +/*! + \brief configure the DMA peripheral + \param[in] none + \param[out] none + \retval none +*/ +void dma_config(void) +{ + dma_parameter_struct dma_init_struct; + + /* SPI0 transmit dma config:DMA0-DMA_CH2 */ + dma_deinit(DMA0, DMA_CH2); + dma_struct_para_init(&dma_init_struct); + + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0); + dma_init_struct.memory_addr = (uint32_t)spi0_send_array; + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.priority = DMA_PRIORITY_LOW; + dma_init_struct.number = ARRAYSIZE; + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init(DMA0, DMA_CH2, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH2); + dma_memory_to_memory_disable(DMA0, DMA_CH2); + + /* SPI0 receive dma config:DMA0-DMA_CH1 */ + dma_deinit(DMA0, DMA_CH1); + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0); + dma_init_struct.memory_addr = (uint32_t)spi0_receive_array; + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.priority = DMA_PRIORITY_HIGH; + dma_init(DMA0, DMA_CH1, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH1); + dma_memory_to_memory_disable(DMA0, DMA_CH1); + + /* SPI2 transmit dma config:DMA1,DMA_CH1 */ + dma_deinit(DMA1, DMA_CH1); + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI2); + dma_init_struct.memory_addr = (uint32_t)spi2_send_array; + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.priority = DMA_PRIORITY_MEDIUM; + dma_init(DMA1, DMA_CH1, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA1, DMA_CH1); + dma_memory_to_memory_disable(DMA1, DMA_CH1); + + /* SPI2 receive dma config:DMA1,DMA_CH0 */ + dma_deinit(DMA1, DMA_CH0); + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI2); + dma_init_struct.memory_addr = (uint32_t)spi2_receive_array; + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA1, DMA_CH0, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA1, DMA_CH0); + dma_memory_to_memory_disable(DMA1, DMA_CH0); +} + +/*! + \brief configure the SPI peripheral + \param[in] none + \param[out] none + \retval none +*/ +void spi_config(void) +{ + spi_parameter_struct spi_init_struct; + /* deinitilize SPI and the parameters */ + spi_i2s_deinit(SPI0); + spi_i2s_deinit(SPI2); + spi_struct_para_init(&spi_init_struct); + + /* SPI0 parameter config */ + spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; + spi_init_struct.device_mode = SPI_MASTER; + spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; + spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE; + spi_init_struct.nss = SPI_NSS_SOFT; + spi_init_struct.prescale = SPI_PSC_8; + spi_init_struct.endian = SPI_ENDIAN_MSB; + spi_init(SPI0, &spi_init_struct); + + /* SPI2 parameter config */ + spi_init_struct.device_mode = SPI_SLAVE; + spi_init_struct.nss = SPI_NSS_SOFT; + spi_init(SPI2, &spi_init_struct); + +} + +/*! + \brief memory compare function + \param[in] src: source data pointer + \param[in] dst: destination data pointer + \param[in] length: the compare data length + \param[out] none + \retval ErrStatus : ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length) +{ + while(length--){ + if(*src++ != *dst++) + return ERROR; + } + return SUCCESS; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_dma/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_dma/readme.txt new file mode 100644 index 0000000..9a6049d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_dma/readme.txt @@ -0,0 +1,43 @@ +/*! + \file readme.txt + \brief description of the master and slave fullduplex communication use dma demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows SPI0 and SPI2 fullduplex +communication use DMA mode.After the communicate is complete,if receive data is equal to +send data,led2 and led3 turn on, if not led2 and led3 turn off. + + Connect SPI0 SCK PIN(PA5) to SPI2 SCK PIN(PC10). + Connect SPI0 MISO PIN(PA6) to SPI2 MISO PIN(PC11). + Connect SPI0 MOSI PIN(PA7) to SPI2 MOSI PIN(PC12). + + JP12 and JP13 must be jumpped to SPI. \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_nssp_mode/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_nssp_mode/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_nssp_mode/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_nssp_mode/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_nssp_mode/main.c new file mode 100644 index 0000000..3e95281 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_nssp_mode/main.c @@ -0,0 +1,255 @@ +/*! + \file main.c + \brief SPI master and slave fullduplex communication with nssp mode + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#define ARRAYSIZE 10 + +uint8_t spi0_send_array[ARRAYSIZE] = {0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA}; +uint8_t spi1_send_array[ARRAYSIZE] = {0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA}; +uint8_t spi0_receive_array[ARRAYSIZE]; +uint8_t spi1_receive_array[ARRAYSIZE]; +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length); +uint32_t send_n = 0, receive_n = 0; + +void rcu_config(void); +void gpio_config(void); +void dma_config(void); +void spi_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* initialize the LEDs */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + + /* peripheral clock enable */ + rcu_config(); + /* GPIO configure */ + gpio_config(); + /* DMA configure */ + dma_config(); + /* SPI configure */ + spi_config(); + + spi_nss_output_enable(SPI0); + /* SPI NSSP mode enable */ + spi_nssp_mode_enable(SPI0); + + /* SPI enable */ + spi_enable(SPI1); + spi_enable(SPI0); + + /* DMA channel enable */ + dma_channel_enable(DMA0,DMA_CH1); + dma_channel_enable(DMA0,DMA_CH2); + dma_channel_enable(DMA0,DMA_CH3); + dma_channel_enable(DMA0,DMA_CH4); + + /* SPI DMA enable */ + spi_dma_enable(SPI1, SPI_DMA_TRANSMIT); + spi_dma_enable(SPI1, SPI_DMA_RECEIVE); + spi_dma_enable(SPI0, SPI_DMA_TRANSMIT); + spi_dma_enable(SPI0, SPI_DMA_RECEIVE); + + /* wait dma transmit complete */ + while(!dma_flag_get(DMA0,DMA_CH2,DMA_FLAG_FTF)); + while(!dma_flag_get(DMA0,DMA_CH4,DMA_FLAG_FTF)); + while(!dma_flag_get(DMA0,DMA_CH3,DMA_FLAG_FTF)); + while(!dma_flag_get(DMA0,DMA_CH1,DMA_FLAG_FTF)); + + /* compare receive data with send data */ + if(ERROR != memory_compare(spi1_receive_array, spi0_send_array, ARRAYSIZE)){ + gd_eval_led_on(LED2); + }else{ + gd_eval_led_off(LED2); + } + if(ERROR != memory_compare(spi0_receive_array, spi1_send_array, ARRAYSIZE)){ + gd_eval_led_on(LED3); + }else{ + gd_eval_led_off(LED3); + } + + while(1); +} + +/*! + \brief configure different peripheral clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_DMA0); + rcu_periph_clock_enable(RCU_SPI0); + rcu_periph_clock_enable(RCU_SPI1); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* SPI0 GPIO config: NSS/PA4, SCK/PA5, MOSI/PA7 */ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7); + /* SPI0 GPIO config: MISO/PA6 */ + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); + + /* SPI1 GPIO config: NSS/PB12, SCK/PB13, MOSI/PB15 */ + gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_12 | GPIO_PIN_13 |GPIO_PIN_15); + /* SPI1 GPIO config: MISO/PB14 */ + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14); +} + +/*! + \brief configure the DMA peripheral + \param[in] none + \param[out] none + \retval none +*/ +void dma_config(void) +{ + dma_parameter_struct dma_init_struct; + + /* SPI0 transmit dma config:DMA0,DMA_CH2 */ + dma_deinit(DMA0, DMA_CH2); + dma_struct_para_init(&dma_init_struct); + + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0); + dma_init_struct.memory_addr = (uint32_t)spi0_send_array; + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.priority = DMA_PRIORITY_LOW; + dma_init_struct.number = ARRAYSIZE; + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init(DMA0, DMA_CH2, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH2); + dma_memory_to_memory_disable(DMA0, DMA_CH2); + + /* SPI0 receive dma config:DMA0,DMA_CH1 */ + dma_deinit(DMA0, DMA_CH1); + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0); + dma_init_struct.memory_addr = (uint32_t)spi0_receive_array; + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.priority = DMA_PRIORITY_HIGH; + dma_init(DMA0, DMA_CH1, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH1); + dma_memory_to_memory_disable(DMA0, DMA_CH1); + + /* SPI1 transmit dma config:DMA0,DMA_CH4 */ + dma_deinit(DMA0, DMA_CH4); + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI1); + dma_init_struct.memory_addr = (uint32_t)spi1_send_array; + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.priority = DMA_PRIORITY_MEDIUM; + dma_init(DMA0, DMA_CH4, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH4); + dma_memory_to_memory_disable(DMA0, DMA_CH4); + + /* SPI1 receive dma config:DMA0,DMA_CH3 */ + dma_deinit(DMA0, DMA_CH3); + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI1); + dma_init_struct.memory_addr = (uint32_t)spi1_receive_array; + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA0, DMA_CH3, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH3); + dma_memory_to_memory_disable(DMA0, DMA_CH3); +} + +/*! + \brief configure the SPI peripheral + \param[in] none + \param[out] none + \retval none +*/ +void spi_config(void) +{ + spi_parameter_struct spi_init_struct; + /* deinitilize SPI and the parameters */ + spi_i2s_deinit(SPI0); + spi_i2s_deinit(SPI1); + spi_struct_para_init(&spi_init_struct); + + /* SPI0 parameter config */ + spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; + spi_init_struct.device_mode = SPI_MASTER; + spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; + spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_1EDGE; + spi_init_struct.nss = SPI_NSS_HARD; + spi_init_struct.prescale = SPI_PSC_16; + spi_init_struct.endian = SPI_ENDIAN_MSB; + spi_init(SPI0, &spi_init_struct); + + /* SPI1 parameter config */ + spi_init_struct.device_mode = SPI_SLAVE; + spi_init_struct.nss = SPI_NSS_HARD; + spi_init(SPI1, &spi_init_struct); +} + +/*! + \brief memory compare function + \param[in] src: source data pointer + \param[in] dst: destination data pointer + \param[in] length: the compare data length + \param[out] none + \retval ErrStatus : ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length) +{ + while(length--){ + if(*src++ != *dst++) + return ERROR; + } + return SUCCESS; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_nssp_mode/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_nssp_mode/readme.txt new file mode 100644 index 0000000..e42c3aa --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_nssp_mode/readme.txt @@ -0,0 +1,42 @@ +/*! + \file readme.txt + \brief description of the master and slave fullduplex communication with nssp mode + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V, it shows SPI0 and SPI1 fullduplex +communication with nssp mode. After the communicate is complete, if the receive data +equals to send data, LED2 and LED3 turn on, if not, LED2 and LED3 turn off. + + Connect SPI0 NSS PIN(PA4) to SPI1 NSS PIN(PB12) + Connect SPI0 SCK PIN(PA5) to SPI1 SCK PIN(PB13) + Connect SPI0 MISO PIN(PA6) to SPI1 MISO PIN(PB14) + Connect SPI0 MOSI PIN(PA7) to SPI1 MOSI PIN(PB15) \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_polling/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_polling/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_polling/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_polling/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_polling/main.c new file mode 100644 index 0000000..379d4a9 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_polling/main.c @@ -0,0 +1,179 @@ +/*! + \file main.c + \brief SPI fullduplex communication use polling mode + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#define ARRAYSIZE 10 + +uint32_t send_n = 0, receive_n = 0; +uint8_t spi0_send_array[ARRAYSIZE] = {0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA}; +uint8_t spi2_send_array[ARRAYSIZE] = {0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA}; +uint8_t spi0_receive_array[ARRAYSIZE]; +uint8_t spi2_receive_array[ARRAYSIZE]; +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length); + +void rcu_config(void); +void gpio_config(void); +void spi_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* initialize the LEDs */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + /* peripheral clock enable */ + rcu_config(); + /* GPIO configure */ + gpio_config(); + /* SPI configure */ + spi_config(); + /* SPI enable */ + spi_enable(SPI2); + spi_enable(SPI0); + + /* wait for transmit complete */ + while(send_n < ARRAYSIZE){ + while(RESET == spi_i2s_flag_get(SPI2, SPI_FLAG_TBE)); + spi_i2s_data_transmit(SPI2, spi2_send_array[send_n]); + while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE)); + spi_i2s_data_transmit(SPI0, spi0_send_array[send_n++]); + while(RESET == spi_i2s_flag_get(SPI2, SPI_FLAG_RBNE)); + spi2_receive_array[receive_n] = spi_i2s_data_receive(SPI2); + while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE)); + spi0_receive_array[receive_n++] = spi_i2s_data_receive(SPI0); + } + + /* compare receive data with send data */ + if(ERROR != memory_compare(spi2_receive_array, spi0_send_array, ARRAYSIZE)){ + gd_eval_led_on(LED2); + }else{ + gd_eval_led_off(LED2); + } + + if(ERROR != memory_compare(spi0_receive_array, spi2_send_array, ARRAYSIZE)){ + gd_eval_led_on(LED3); + }else{ + gd_eval_led_off(LED3); + } + + while(1); +} + +/*! + \brief configure different peripheral clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOC); + rcu_periph_clock_enable(RCU_AF); + rcu_periph_clock_enable(RCU_SPI0); + rcu_periph_clock_enable(RCU_SPI2); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* SPI0 GPIO config:SCK/PA5, MISO/PA6, MOSI/PA7 */ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7); + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); + + /* SPI2 GPIO config:SCK/PC10, MISO/PC11, MOSI/PC12 */ + gpio_pin_remap_config(GPIO_SPI2_REMAP, ENABLE); + gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_12); + gpio_init(GPIOC, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11); +} + +/*! + \brief configure the SPI peripheral + \param[in] none + \param[out] none + \retval none +*/ +void spi_config(void) +{ + spi_parameter_struct spi_init_struct; + /* deinitilize SPI and the parameters */ + spi_i2s_deinit(SPI0); + spi_i2s_deinit(SPI2); + spi_struct_para_init(&spi_init_struct); + + /* SPI0 parameter config */ + spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; + spi_init_struct.device_mode = SPI_MASTER; + spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; + spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE; + spi_init_struct.nss = SPI_NSS_SOFT; + spi_init_struct.prescale = SPI_PSC_8; + spi_init_struct.endian = SPI_ENDIAN_MSB; + spi_init(SPI0, &spi_init_struct); + + /* SPI2 parameter config */ + spi_init_struct.device_mode = SPI_SLAVE; + spi_init_struct.nss = SPI_NSS_SOFT; + spi_init(SPI2, &spi_init_struct); + +} + +/*! + \brief memory compare function + \param[in] src: source data pointer + \param[in] dst: destination data pointer + \param[in] length: the compare data length + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length) +{ + while(length--){ + if(*src++ != *dst++) + return ERROR; + } + return SUCCESS; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_polling/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_polling/readme.txt new file mode 100644 index 0000000..4e38401 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_polling/readme.txt @@ -0,0 +1,41 @@ +/*! + \file readme.txt + \brief description of the master and slave fullduplex communication use polling demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows SPI0 and SPI2 fullduplex +communication use polling mode.After the communicate is complete,if receive data is equal +to send data, led2 and led3 turn on, if not led2 and led3 turn off. + + Connect SPI0 SCK PIN(PA5) TO SPI2 SCK PIN(PC10). + Connect SPI0 MISO PIN(PA6) TO SPI2 MISO PIN(PC11). + Connect SPI0 MOSI PIN(PA7) TO SPI2 MOSI PIN(PC12). \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_ti_mode/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_ti_mode/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_ti_mode/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_ti_mode/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_ti_mode/main.c new file mode 100644 index 0000000..5a2e629 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_ti_mode/main.c @@ -0,0 +1,257 @@ +/*! + \file main.c + \brief SPI master and slave fullduplex communication with ti mode + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#define ARRAYSIZE 10 + +uint8_t spi0_send_array[ARRAYSIZE] = {0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA}; +uint8_t spi1_send_array[ARRAYSIZE] = {0xB1, 0xB2, 0xB3, 0xB4, 0xB5, 0xB6, 0xB7, 0xB8, 0xB9, 0xBA}; +uint8_t spi0_receive_array[ARRAYSIZE]; +uint8_t spi1_receive_array[ARRAYSIZE]; +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length); +uint32_t send_n = 0, receive_n = 0; + +void rcu_config(void); +void gpio_config(void); +void dma_config(void); +void spi_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* initialize the LEDs */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + + /* peripheral clock enable */ + rcu_config(); + /* GPIO config */ + gpio_config(); + /* DMA config */ + dma_config(); + /* SPI config */ + spi_config(); + + /* SPI ti mode enable */ + spi_ti_mode_enable(SPI1); + spi_ti_mode_enable(SPI0); + + /* SPI enable */ + spi_enable(SPI1); + spi_enable(SPI0); + + /* DMA channel enable */ + dma_channel_enable(DMA0, DMA_CH1); + dma_channel_enable(DMA0, DMA_CH2); + dma_channel_enable(DMA0, DMA_CH3); + dma_channel_enable(DMA0, DMA_CH4); + + /* SPI DMA enable */ + spi_dma_enable(SPI1, SPI_DMA_TRANSMIT); + spi_dma_enable(SPI1, SPI_DMA_RECEIVE); + spi_dma_enable(SPI0, SPI_DMA_TRANSMIT); + spi_dma_enable(SPI0, SPI_DMA_RECEIVE); + + /* wait dma transmit complete */ + while(!dma_flag_get(DMA0,DMA_CH2,DMA_FLAG_FTF)); + while(!dma_flag_get(DMA0,DMA_CH4,DMA_FLAG_FTF)); + while(!dma_flag_get(DMA0,DMA_CH3,DMA_FLAG_FTF)); + while(!dma_flag_get(DMA0,DMA_CH1,DMA_FLAG_FTF)); + + /* compare receive data with send data */ + if(ERROR != memory_compare(spi1_receive_array, spi0_send_array, ARRAYSIZE)){ + gd_eval_led_on(LED2); + }else{ + gd_eval_led_off(LED2); + } + if(ERROR != memory_compare(spi0_receive_array, spi1_send_array, ARRAYSIZE)){ + gd_eval_led_on(LED3); + }else{ + gd_eval_led_off(LED3); + } + + while(1); +} + +/*! + \brief configure different peripheral clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_DMA0); + rcu_periph_clock_enable(RCU_SPI0); + rcu_periph_clock_enable(RCU_SPI1); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* SPI0 GPIO config: NSS/PA4, SCK/PA5, MOSI/PA7 */ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5 | GPIO_PIN_7); + /* SPI0 GPIO config: MISO/PA6 */ + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); + + /* SPI1 GPIO config: NSS/PB12, SCK/PB13, MOSI/PB15 */ + gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_12 | GPIO_PIN_13 |GPIO_PIN_15); + /* SPI1 GPIO config: MISO/PB14 */ + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14); +} + +/*! + \brief configure the DMA peripheral + \param[in] none + \param[out] none + \retval none +*/ +void dma_config(void) +{ + dma_parameter_struct dma_init_struct; + + /* SPI0 transmit dma config:DMA0,DMA_CH2 */ + dma_deinit(DMA0, DMA_CH2); + dma_struct_para_init(&dma_init_struct); + + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0); + dma_init_struct.memory_addr = (uint32_t)spi0_send_array; + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.priority = DMA_PRIORITY_LOW; + dma_init_struct.number = ARRAYSIZE; + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init(DMA0, DMA_CH2, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH2); + dma_memory_to_memory_disable(DMA0, DMA_CH2); + + /* SPI0 receive dma config:DMA0,DMA_CH1 */ + dma_deinit(DMA0, DMA_CH1); + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI0); + dma_init_struct.memory_addr = (uint32_t)spi0_receive_array; + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.priority = DMA_PRIORITY_HIGH; + dma_init(DMA0, DMA_CH1, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH1); + dma_memory_to_memory_disable(DMA0, DMA_CH1); + + /* SPI1 transmit dma config:DMA0,DMA_CH4 */ + dma_deinit(DMA0, DMA_CH4); + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI1); + dma_init_struct.memory_addr = (uint32_t)spi1_send_array; + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.priority = DMA_PRIORITY_MEDIUM; + dma_init(DMA0, DMA_CH4, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH4); + dma_memory_to_memory_disable(DMA0, DMA_CH4); + + /* SPI1 receive dma config:DMA0,DMA_CH3 */ + dma_deinit(DMA0, DMA_CH3); + dma_init_struct.periph_addr = (uint32_t)&SPI_DATA(SPI1); + dma_init_struct.memory_addr = (uint32_t)spi1_receive_array; + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA0, DMA_CH3, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH3); + dma_memory_to_memory_disable(DMA0, DMA_CH3); +} + +/*! + \brief configure the SPI peripheral + \param[in] none + \param[out] none + \retval none +*/ +void spi_config(void) +{ + spi_parameter_struct spi_init_struct; + /* deinitilize SPI and the parameters */ + spi_i2s_deinit(SPI0); + spi_i2s_deinit(SPI1); + spi_struct_para_init(&spi_init_struct); + + /* SPI0 parameter config */ + spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; + spi_init_struct.device_mode = SPI_MASTER; + spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; + spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE; + spi_init_struct.nss = SPI_NSS_HARD; + spi_init_struct.prescale = SPI_PSC_16; + spi_init_struct.endian = SPI_ENDIAN_MSB; + spi_init(SPI0, &spi_init_struct); + + /* SPI1 parameter config */ + spi_init_struct.trans_mode = SPI_TRANSMODE_FULLDUPLEX; + spi_init_struct.device_mode = SPI_SLAVE; + spi_init_struct.nss = SPI_NSS_HARD; + spi_init_struct.prescale = SPI_PSC_16; + spi_init(SPI1, &spi_init_struct); +} + +/*! + \brief memory compare function + \param[in] src: source data pointer + \param[in] dst: destination data pointer + \param[in] length: the compare data length + \param[out] none + \retval ErrStatus : ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length) +{ + while(length--){ + if(*src++ != *dst++) + return ERROR; + } + return SUCCESS; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_ti_mode/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_ti_mode/readme.txt new file mode 100644 index 0000000..8556320 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_slave_fullduplex_ti_mode/readme.txt @@ -0,0 +1,42 @@ +/*! + \file readme.txt + \brief description of the master and slave fullduplex communication with ti mode + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V, it shows SPI0 and SPI1 fullduplex +communication with ti mode. After the communication is complete, if the receive data +equals to the send data, LED1 and LED2 turn on, if not, LED1 and LED2 turn off. + + Connect SPI0 NSS PIN(PA4) to SPI1 NSS PIN(PB12) + Connect SPI0 SCK PIN(PA5) to SPI1 SCK PIN(PB13) + Connect SPI0 MISO PIN(PA6) to SPI1 MISO PIN(PB14) + Connect SPI0 MOSI PIN(PA7) to SPI1 MOSI PIN(PB15) \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/gd32vf103_it.c new file mode 100644 index 0000000..7e8241a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/gd32vf103_it.c @@ -0,0 +1,78 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" + +#define ARRAYSIZE 10 + +extern uint8_t spi0_send_array[]; +extern uint8_t spi2_receive_array[]; +extern uint32_t send_n , receive_n ; + +/*! + \brief this function handles SPI0 Handler exception + \param[in] none + \param[out] none + \retval none +*/ +void SPI0_IRQHandler(void) +{ + if(RESET != spi_i2s_interrupt_flag_get(SPI0, SPI_I2S_INT_FLAG_TBE)){ + /* send data */ + while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE)); + spi_i2s_data_transmit(SPI0, spi0_send_array[send_n++]); + + if(ARRAYSIZE == send_n){ + spi_i2s_interrupt_disable(SPI0, SPI_I2S_INT_TBE); + } + } +} + +/*! + \brief this function handles SPI2 Handler exception + \param[in] none + \param[out] none + \retval none +*/ +void SPI2_IRQHandler(void) +{ + /* receive data */ + if(RESET != spi_i2s_interrupt_flag_get(SPI2, SPI_I2S_INT_FLAG_RBNE)){ + spi2_receive_array[receive_n++] = spi_i2s_data_receive(SPI2); + } + + if(ARRAYSIZE == receive_n){ + spi_i2s_interrupt_disable(SPI2, SPI_I2S_INT_RBNE); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/gd32vf103_it.h new file mode 100644 index 0000000..4e7fee6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/gd32vf103_it.h @@ -0,0 +1,46 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* SPI0 handle function */ +void SPI0_IRQHandler(void); +/* SPI2 handle function */ +void SPI2_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/main.c new file mode 100644 index 0000000..71984ea --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/main.c @@ -0,0 +1,171 @@ +/*! + \file main.c + \brief master send and slave receive data use interrupt mode + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#define ARRAYSIZE 10 +__IO uint32_t send_n = 0, receive_n = 0; +uint8_t spi0_send_array[ARRAYSIZE] = {0xA1, 0xA2, 0xA3, 0xA4, 0xA5, 0xA6, 0xA7, 0xA8, 0xA9, 0xAA}; +uint8_t spi2_receive_array[ARRAYSIZE]; +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length); + +void rcu_config(void); +void gpio_config(void); +void spi_config(void); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* initialize the LED */ + gd_eval_led_init(LED2); + + /* ECLIC configure */ + eclic_global_interrupt_enable(); + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1); + eclic_irq_enable(SPI0_IRQn,1,0); + eclic_irq_enable(SPI2_IRQn,2,0); + + /* peripheral clock enable */ + rcu_config(); + /* GPIO configure */ + gpio_config(); + /* SPI configure */ + spi_config(); + /* SPI interrupt enable */ + spi_i2s_interrupt_enable(SPI0, SPI_I2S_INT_TBE); + spi_i2s_interrupt_enable(SPI2, SPI_I2S_INT_RBNE); + + /* SPI enable */ + spi_enable(SPI2); + spi_enable(SPI0); + + /* wait transmit complete */ + while(receive_n < ARRAYSIZE); + + /* compare receive data with send data */ + if(memory_compare(spi2_receive_array, spi0_send_array, ARRAYSIZE)){ + gd_eval_led_on(LED2); + }else{ + gd_eval_led_off(LED2); + } + + while(1); + +} + +/*! + \brief configure different peripheral clocks + \param[in] none + \param[out] none + \retval none +*/ +void rcu_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOC); + rcu_periph_clock_enable(RCU_AF); + rcu_periph_clock_enable(RCU_SPI0); + rcu_periph_clock_enable(RCU_SPI2); +} + +/*! + \brief configure the GPIO peripheral + \param[in] none + \param[out] none + \retval none +*/ +void gpio_config(void) +{ + /* SPI0 GPIO config:SCK/PA5, MOSI/PA7 */ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7); + + /* SPI2 GPIO config:SCK/PC10, MISO/PC11 */ + gpio_pin_remap_config(GPIO_SPI2_REMAP, ENABLE); + gpio_init(GPIOC, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10 | GPIO_PIN_11); +} + +/*! + \brief configure the SPI peripheral + \param[in] none + \param[out] none + \retval none +*/ +void spi_config(void) +{ + spi_parameter_struct spi_init_struct; + /* deinitilize SPI and the parameters */ + spi_i2s_deinit(SPI0); + spi_i2s_deinit(SPI2); + spi_struct_para_init(&spi_init_struct); + + /* configure SPI0 parameter */ + spi_init_struct.trans_mode = SPI_TRANSMODE_BDTRANSMIT; + spi_init_struct.device_mode = SPI_MASTER; + spi_init_struct.frame_size = SPI_FRAMESIZE_8BIT; + spi_init_struct.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE; + spi_init_struct.nss = SPI_NSS_SOFT; + spi_init_struct.prescale = SPI_PSC_8; + spi_init_struct.endian = SPI_ENDIAN_MSB; + spi_init(SPI0, &spi_init_struct); + + /* configure SPI2 parameter */ + spi_init_struct.trans_mode = SPI_TRANSMODE_BDRECEIVE; + spi_init_struct.device_mode = SPI_SLAVE; + spi_init_struct.nss = SPI_NSS_SOFT; + spi_init(SPI2, &spi_init_struct); + +} + +/*! + \brief memory compare function + \param[in] src: source data pointer + \param[in] dst: destination data pointer + \param[in] length: the compare data length + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint8_t length) +{ + while(length--){ + if(*src++ != *dst++) + return ERROR; + } + return SUCCESS; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/readme.txt new file mode 100644 index 0000000..f65a606 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/SPI/SPI_master_transmit_slave_receive_interrupt/readme.txt @@ -0,0 +1,41 @@ +/*! + \file readme.txt + \brief description of the master transmit and slave receive through interrupt demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it shows master send data and +slave receive data use intterupt mode. + After the communicate is complete,if receive data is equal to send data,led2 turns +on,if not led2 turns off. + + Connect SPI0 SCK PIN(PA5) to SPI2 SCK PIN(PC10). + Connect SPI0 MOSI PIN(PA7) to SPI2 MISO PIN(PC11). \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/gd32vf103_it.c new file mode 100644 index 0000000..1107826 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/gd32vf103_it.c @@ -0,0 +1,167 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" +#include "systick.h" + +__IO uint32_t step = 1; + + +/*! + \brief this function handles TIMER0 interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void TIMER0_TRG_CMT_IRQHandler(void) +{ + /* clear TIMER interrupt flag */ + timer_interrupt_flag_clear(TIMER0,TIMER_INT_CMT); + + switch(step){ + /* next step: step 2 configuration .A-C` breakover---------------------------- */ + case 1: + /* channel0 configuration */ + timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCX_ENABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCXN_DISABLE); + + /* channel1 configuration */ + timer_channel_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCXN_DISABLE); + + /* channel2 configuration */ + timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0); + timer_channel_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCXN_ENABLE); + + step++; + break; + + /* next step: step 3 configuration .B-C` breakover---------------------------- */ + case 2: + /* channel0 configuration */ + timer_channel_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCXN_DISABLE); + + /* channel1 configuration */ + timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0); + timer_channel_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCX_ENABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCXN_DISABLE); + + /* channel2 configuration */ + timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0); + timer_channel_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCXN_ENABLE); + + step++; + break; + + /* next step: step 4 configuration .B-A` breakover---------------------------- */ + case 3: + /* channel0 configuration */ + timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCXN_ENABLE); + + /* channel1 configuration */ + timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0); + timer_channel_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCX_ENABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCXN_DISABLE); + + /* channel2 configuration */ + timer_channel_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCXN_DISABLE); + + step++; + break; + + /* next step: step 5 configuration .C-A` breakover---------------------------- */ + case 4: + /* channel0 configuration */ + timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCXN_ENABLE); + + /* channel1 configuration */ + timer_channel_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCXN_DISABLE); + + /* channel2 configuration */ + timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0); + timer_channel_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCX_ENABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCXN_DISABLE); + + step++; + break; + + /* next step: step 6 configuration .C-B` breakover---------------------------- */ + case 5: + /* channel0 configuration */ + timer_channel_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCXN_DISABLE); + + /* channel1 configuration */ + timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0); + timer_channel_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCXN_ENABLE); + + /* channel2 configuration */ + timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0); + timer_channel_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCX_ENABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCXN_DISABLE); + + step++; + break; + + /* next step: step 1 configuration .A-B` breakover---------------------------- */ + case 6: + /* channel0 configuration */ + timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCX_ENABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_0, TIMER_CCXN_DISABLE); + + /* channel1 configuration */ + timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0); + timer_channel_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_1, TIMER_CCXN_ENABLE); + + /* channel2 configuration */ + timer_channel_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCX_DISABLE); + timer_channel_complementary_output_state_config(TIMER0, TIMER_CH_2, TIMER_CCXN_DISABLE); + + step = 1; + break; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/gd32vf103_it.h new file mode 100644 index 0000000..6cfa6cc --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/gd32vf103_it.h @@ -0,0 +1,45 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* Core Timer handle function */ +void clic_mtip_handler(void); +/*TIMER0 handle function*/ +void TIMER0_BRK_UP_TRG_COM_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/main.c new file mode 100644 index 0000000..6aac1a2 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/main.c @@ -0,0 +1,175 @@ +/*! + \file main.c + \brief TIMER0 6-steps demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include "systick.h" +#include + +/* configure the GPIO ports */ +void gpio_config(void); +/* configure the GPIO ports */ +void timer_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_AF); + + /*configure PA8/PA9/PA10(TIMER0/CH0/CH1/CH2) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8); + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10); + + /*configure PB13/PB14/PB15(TIMER0/CH0N/CH1N/CH2N) as alternate function*/ + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13); + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14); + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15); + + /*configure PB12(TIMER0 BKIN) as alternate function*/ + gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_12); +} + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* ----------------------------------------------------------------------- + TIMER0 configuration: + generate 3 complementary PWM signal. + TIMER0CLK is fixed to systemcoreclock, the TIMER0 prescaler is equal to 108 + so the TIMER0 counter clock used is 1MHz. + insert a dead time equal to (64 + 36) * 2 / systemcoreclock =1.85us + configure the break feature, active at low level, and using the automatic + output enable feature. + use the locking parameters level 0. + ----------------------------------------------------------------------- */ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + timer_break_parameter_struct timer_breakpara; + + rcu_periph_clock_enable(RCU_TIMER0); + + timer_deinit(TIMER0); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER0 configuration */ + timer_initpara.prescaler = 107; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 599; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER0, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH0/CH0N, CH1/CH1N and CH2/CH2N configuration in timing mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_ENABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_HIGH; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_HIGH; + + timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara); + timer_channel_output_config(TIMER0, TIMER_CH_1, &timer_ocinitpara); + timer_channel_output_config(TIMER0, TIMER_CH_2, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,299); + timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_ENABLE); + + timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_1,299); + timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_1, TIMER_OC_SHADOW_ENABLE); + + timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_2,299); + timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_2, TIMER_OC_SHADOW_ENABLE); + + /* initialize TIMER break parameter struct */ + timer_break_struct_para_init(&timer_breakpara); + /* automatic output enable, break, dead time and lock configuration*/ + timer_breakpara.runoffstate = TIMER_ROS_STATE_ENABLE; + timer_breakpara.ideloffstate = TIMER_IOS_STATE_ENABLE ; + timer_breakpara.deadtime = 1; + timer_breakpara.breakpolarity = TIMER_BREAK_POLARITY_LOW; + timer_breakpara.outputautostate = TIMER_OUTAUTO_ENABLE; + timer_breakpara.protectmode = TIMER_CCHP_PROT_OFF; + timer_breakpara.breakstate = TIMER_BREAK_ENABLE; + timer_break_config(TIMER0, &timer_breakpara); + + /* TIMER0 primary output function enable */ + timer_primary_output_config(TIMER0, ENABLE); + + /* TIMER0 channel control update interrupt enable */ + timer_interrupt_enable(TIMER0, TIMER_INT_CMT); + /* TIMER0 break interrupt disable */ + timer_interrupt_disable(TIMER0, TIMER_INT_BRK); + + /* TIMER0 counter enable */ + timer_enable(TIMER0); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_config(); + eclic_global_interrupt_enable(); + eclic_set_nlbits(ECLIC_GROUP_LEVEL3_PRIO1); + eclic_irq_enable(TIMER0_TRG_CMT_IRQn, 6,1); + timer_config(); + + while(1){ + delay_1ms(10); + timer_event_software_generate(TIMER0,TIMER_EVENT_SRC_CMTG); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/readme.txt new file mode 100644 index 0000000..389c8a5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/readme.txt @@ -0,0 +1,57 @@ +/*! + \file readme.txt + \brief description of the TIMER0 6-steps demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to configure the +TIMER0 peripheral to generate three complementary TIMER0 signals(for BLDC) with dead +time. + + TIMER0CLK is fixed to systemcoreclock, the TIMER0 prescaler is equal to 108 so the +TIMER0 counter clock used is 1MHz. + + Channel change sequence: + AB`->AC`->BC`->BA`->CA`->CB` +step1: 1-0 0-1 0-0 (CH0-CH0N CH1-CH1N CH2-CH2N) +step2: 1-0 0-0 0-1 (CH0-CH0N CH1-CH1N CH2-CH2N) +step3: 0-0 1-0 0-1 (CH0-CH0N CH1-CH1N CH2-CH2N) +step4: 0-1 1-0 0-0 (CH0-CH0N CH1-CH1N CH2-CH2N) +step5: 0-1 0-0 1-0 (CH0-CH0N CH1-CH1N CH2-CH2N) +step6: 0-0 0-1 1-0 (CH0-CH0N CH1-CH1N CH2-CH2N) + + Connect the TIMER0 pins to an oscilloscope to monitor the different waveforms: + - TIMER0_CH0 pin(PA8) + - TIMER0_CH0N pin(PB13) + - TIMER0_CH1 pin(PA9) + - TIMER0_CH1N pin(PB14) + - TIMER0_CH2 pin(PA10) + - TIMER0_CH2N pin(PB15) diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/systick.c new file mode 100644 index 0000000..7e217cd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/systick.c @@ -0,0 +1,58 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime < (SystemCoreClock/4000.0*count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/systick.h new file mode 100644 index 0000000..cb47e4e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_6-steps/systick.h @@ -0,0 +1,45 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYSTICK_H +#define SYSTICK_H + +#include + +/* configure systick */ +void systick_config(void); +/* delay a time in milliseconds */ +void delay_1ms(uint32_t count); + +#endif /* SYSTICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_complementarysignals/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_complementarysignals/main.c new file mode 100644 index 0000000..32afd2a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_complementarysignals/main.c @@ -0,0 +1,147 @@ +/*! + \file main.c + \brief TIMER0 complementary signals demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* configure the GPIO ports */ +void gpio_config(void); +/* configure the TIMER peripheral */ +void timer_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_AF); + + /*configure PA8/PA9/PA10(TIMER0/CH0/CH1/CH2) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8); + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10); + + /*configure PB13/PB14/PB15(TIMER0/CH0N/CH1N/CH2N) as alternate function*/ + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13); + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_14); + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_15); +} + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ +/* ----------------------------------------------------------------------- + TIMER0 configuration to: + generate 3 complementary PWM signals with 3 different duty cycles: + TIMER0CLK is fixed to systemcoreclock, the TIMER0 prescaler is equal to 5400 so the + TIMER0 counter clock used is 20KHz and the PWM frequency is 1.25Hz. + the three duty cycles are computed as the following description: + the channel 0 duty cycle is set to 25% so channel 1N is set to 75%. + the channel 1 duty cycle is set to 50% so channel 2N is set to 50%. + the channel 2 duty cycle is set to 75% so channel 3N is set to 25%. + ----------------------------------------------------------------------- */ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER0); + + timer_deinit(TIMER0); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER0 configuration */ + timer_initpara.prescaler = 5399; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 15999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER0, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH1, CH2 and CH3 configuration in PWM mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_ENABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + + timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara); + timer_channel_output_config(TIMER0, TIMER_CH_1, &timer_ocinitpara); + timer_channel_output_config(TIMER0, TIMER_CH_2, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,3999); + timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + + timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_1,7999); + timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE); + + timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_2,11999); + timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE); + + timer_primary_output_config(TIMER0, ENABLE); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER0); + timer_enable(TIMER0); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_config(); + timer_config(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_complementarysignals/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_complementarysignals/readme.txt new file mode 100644 index 0000000..9397113 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_complementarysignals/readme.txt @@ -0,0 +1,51 @@ +/*! + \file readme.txt + \brief description of the TIMER0 complementary signals demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to configure the +TIMER0 peripheral to generate three complementary TIMER0 signals. TIMER0CLK is fixed +to systemcoreclock, the TIMER0 prescaler is equal to 5400, so the TIMER0 counter clock +used is 20KHz and the PWM frequency is 1.25Hz. + + The Three duty cycles are computed as the following description: + The channel 0 duty cycle is set to 25% so channel 0N is set to 75%. + The channel 1 duty cycle is set to 50% so channel 1N is set to 50%. + The channel 2 duty cycle is set to 75% so channel 2N is set to 25%. + + Connect the TIMER0 pins to an oscilloscope to monitor the different waveforms: + - TIMER0_CH0 pin(PA8) + - TIMER0_CH0N pin(PB13) + - TIMER0_CH1 pin(PA9) + - TIMER0_CH1N pin(PB14) + - TIMER0_CH2 pin(PA10) + - TIMER0_CH2N pin(PB15) diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_deadtime_break/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_deadtime_break/main.c new file mode 100644 index 0000000..45e4e18 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_deadtime_break/main.c @@ -0,0 +1,157 @@ +/*! + \file main.c + \brief TIMER0 deadtime break demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* configure the GPIO ports */ +void gpio_config(void); +/* configure the TIMER peripheral */ +void timer_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_AF); + + /*configure PA8(TIMER0 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8); + + /*configure PB13(TIMER0 CH0N) as alternate function*/ + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13); + + /*configure PB12(TIMER0 BKIN) as alternate function*/ + gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_12); +} + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* ----------------------------------------------------------------------- + TIMER0 configuration: + generate 1 complementary PWM signal. + TIMER0CLK is fixed to systemcoreclock, the TIMER0 prescaler is equal to 108 so the + TIMER0 counter clock used is 1MHz. + the duty cycle is computed as the following description: + the channel 0 duty cycle is set to 25% so channel 0N is set to 75%. + + insert a dead time equal to ((32+31)*16*4)/systemcoreclock = 37.3us + + configure the break feature, active at high level, and using the automatic + output enable feature. + + use the locking parameters level1. + ----------------------------------------------------------------------- */ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + timer_break_parameter_struct timer_breakpara; + + rcu_periph_clock_enable(RCU_TIMER0); + + timer_deinit(TIMER0); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER0 configuration */ + timer_initpara.prescaler = 107; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 1599; + timer_initpara.clockdivision = TIMER_CKDIV_DIV4; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER0, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH0/CH0N configuration in PWM mode0 */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_ENABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_HIGH; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + + timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER0,TIMER_CH_0,399); + timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + + /* configure TIMER break function */ + timer_break_struct_para_init(&timer_breakpara); + /* automatic output enable, break, dead time and lock configuration*/ + timer_breakpara.runoffstate = TIMER_ROS_STATE_DISABLE; + timer_breakpara.ideloffstate = TIMER_IOS_STATE_DISABLE ; + timer_breakpara.deadtime = 255; + timer_breakpara.breakpolarity = TIMER_BREAK_POLARITY_LOW; + timer_breakpara.outputautostate = TIMER_OUTAUTO_ENABLE; + timer_breakpara.protectmode = TIMER_CCHP_PROT_0; + timer_breakpara.breakstate = TIMER_BREAK_ENABLE; + timer_break_config(TIMER0, &timer_breakpara); + + /* TIMER0 primary output function enable */ + timer_primary_output_config(TIMER0, ENABLE); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER0); + + /* TIMER0 counter enable */ + timer_enable(TIMER0); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_config(); + timer_config(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_deadtime_break/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_deadtime_break/readme.txt new file mode 100644 index 0000000..7889961 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_deadtime_break/readme.txt @@ -0,0 +1,58 @@ +/*! + \file readme.txt + \brief description of the TIMER0 deadtime break demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to configure the +TIMER0 peripheral to generate complementary signals, to insert a defined dead time +value, to use the break feature and to lock the desired parameters. + + TIMER0CLK is fixed to systemcoreclock, the TIMER0 prescaler is equal to 107 ,so +the TIMER0 counter clock used is 1MHz. + + The duty cycle is computed as the following description: +the channel 0(PA8) duty cycle is set to 25% so channel 0N(PB13) is set to 75%. + + Insert a dead time equal to ((32 + 31) * 16 * 4) / systemcoreclock = 37.3us + + Configure the break feature, active at Low level(with GND), and using the automatic +output enable feature. + + Use the Locking parameters level1. + + Connect the TIMER0 pins to an oscilloscope to monitor the different waveforms: + - TIMER0_CH0 pin (PA8) + - TIMER0_CH0N pin (PB13) + + Connect one key's pin (PB14 for example) and TIMER0_BRKIN pin PB12 with Dupont +line. Press the key (User Key for example), the break of the wave can be observed +through the oscilloscope. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma/main.c new file mode 100644 index 0000000..cb4badd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma/main.c @@ -0,0 +1,177 @@ +/*! + \file main.c + \brief TIMER0 dma demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +#define TIMER0_CH0CV_OFFSET (0x34) +#define TIMER0_CH0CV_ADDR (TIMER0 + TIMER0_CH0CV_OFFSET) +#define TRANSFER_NUM (3) +uint16_t buffer[TRANSFER_NUM] = {249,499,749}; + +/* configure the GPIO ports */ +void gpio_config(void); +/* configure the TIMER peripheral */ +void timer_config(void); +/* configure the DMA peripheral */ +void dma_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*configure PA8(TIMER0 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8); +} + +/** + \brief configure the DMA peripheral + \param[in] none + \param[out] none + \retval none + */ +void dma_config(void) +{ + dma_parameter_struct dma_init_struct; + + /* enable DMA clock */ + rcu_periph_clock_enable(RCU_DMA0); + + /* initialize DMA channel 4 */ + dma_deinit(DMA0, DMA_CH4); + + /* DMA channel 4 initialize */ + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.memory_addr = (uint32_t)buffer; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT; + dma_init_struct.number = TRANSFER_NUM; + dma_init_struct.periph_addr = (uint32_t)TIMER0_CH0CV_ADDR; + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA0, DMA_CH4, &dma_init_struct); + + /* DMA0 channel 4 mode configuration */ + dma_circulation_enable(DMA0, DMA_CH4); + dma_memory_to_memory_disable(DMA0, DMA_CH4); + + /* enable DMA channel5 */ + dma_channel_enable(DMA0, DMA_CH4); +} + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* TIMER0 DMA Transfer example ------------------------------------------------- + TIMER0CLK = 108 MHz, Prescaler = 108 + TIMER0 counter clock = systemcoreclock/108 = 1MHz. + + the objective is to configure TIMER0 channel 1 to generate PWM + signal with a frequency equal to 1KHz and a variable duty cycle(25%, 50%, 75%) that + is changed by the DMA after a specific number of update DMA request. + + the number of this repetitive requests is defined by the TIMER0 repetition counter, + each 2 update requests, the TIMER0 Channel 0 duty cycle changes to the next new + value defined by the buffer . + -----------------------------------------------------------------------------*/ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER0); + + timer_deinit(TIMER0); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER0 configuration */ + timer_initpara.prescaler = 107; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 1; + timer_init(TIMER0, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH0 configuration in PWM1 mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_HIGH; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, buffer[0]); + timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + + /* TIMER0 primary output enable */ + timer_primary_output_config(TIMER0, ENABLE); + /* TIMER0 update DMA request enable */ + timer_dma_enable(TIMER0, TIMER_DMA_UPD); + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER0); + + /* TIMER0 counter enable */ + timer_enable(TIMER0); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_config(); + dma_config(); + timer_config(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma/readme.txt new file mode 100644 index 0000000..21df2d9 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma/readme.txt @@ -0,0 +1,48 @@ +/*! + \file readme.txt + \brief description of the TIMER0 DMA demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to +use DMA with TIMER0 update request to transfer data from memory +to TIMER0 capture compare register 0. + + TIMER0CLK is fixed to systemcoreclock, the TIMER0 prescaler is equal to 108 +so the TIMER0 counter clock used is 1MHz. + + The objective is to configure TIMER0 channel 0(PA8) to generate PWM signal with +a frequency equal to 1KHz and a variable duty cycle(25%,50%,75%) that is changed +by the DMA after a specific number of Update DMA request. + + The number of this repetitive requests is defined by the TIMER0 repetition counter, +each 2 update requests, the TIMER0 Channel 0 duty cycle changes to the next new +value defined by the buffer. \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma_burst/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma_burst/main.c new file mode 100644 index 0000000..8de8ad5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma_burst/main.c @@ -0,0 +1,210 @@ +/*! + \file main.c + \brief TIMER0 dma burst demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +#define TIMER0_DMATB_OFFSET (0x4C) /* TIMER0_DMATB address offset */ +#define TIMER0_DMATB_ADDR (TIMER0 + TIMER0_DMATB_OFFSET) /* TIMER0_DMATB address */ +#define TRANSFER_NUM (8) + +uint16_t buffer[TRANSFER_NUM] = {99,199,299,399,499,599,699,799}; + +/* configure the GPIO ports */ +void gpio_config(void); +/* configure the TIMER peripheral */ +void timer_config(void); +/* configure the DMA peripheral */ +void dma_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*configure PA8(TIMER0 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8); + + /*configure PA9(TIMER0 CH1) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); + + /*configure PA10(TIMER0 CH2) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_10); + + /*configure PA11(TIMER0 CH3) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11); +} + +/** + \brief configure the DMA peripheral + \param[in] none + \param[out] none + \retval none + */ +void dma_config(void) +{ + dma_parameter_struct dma_init_struct; + + /* enable DMA clock */ + rcu_periph_clock_enable(RCU_DMA0); + + /* initialize DMA channel5 */ + dma_deinit(DMA0, DMA_CH4); + + /* DMA channel 4 initialize */ + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.memory_addr = (uint32_t)buffer; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_16BIT; + dma_init_struct.number = TRANSFER_NUM; + dma_init_struct.periph_addr = (uint32_t)TIMER0_DMATB_ADDR; + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA0, DMA_CH4, &dma_init_struct); + + /* DMA0 channel 4 mode configuration */ + dma_circulation_enable(DMA0, DMA_CH4); + dma_memory_to_memory_disable(DMA0, DMA_CH4); + + /* enable DMA channel4 */ + dma_channel_enable(DMA0, DMA_CH4); +} + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* TIMER0 DMA transfer example ------------------------------------------------- + TIMER0CLK = 108 MHz, prescaler = 108 + TIMER0 counter clock = systemcoreclock/108 = 1MHz. + + The objective is to configure TIMER0 channel 0~3(PA8~PA11) to generate PWM signal. + capture compare register 0~3 are to be updated twice per circle.On the first update + DMA request, data1 is transferred to CH0CV, data2 is transferred to CH1CV, data3 is + transferred to CH2CV, data4 is transferred to CH3CV and duty cycle(10%, 20%, 30%, 40%). + On the second update DMA request, data5 is transferred to CH0CV, data6 is transferred + to CH1CV, data7 is transferred to CH2CV, data8 is transferred to CH3CV and duty cycle + (50%, 60%, 70%, 80%). + -----------------------------------------------------------------------------*/ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER0); + + timer_deinit(TIMER0); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER0 configuration */ + timer_initpara.prescaler = 107; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER0, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_HIGH; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + + timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara); + timer_channel_output_config(TIMER0, TIMER_CH_1, &timer_ocinitpara); + timer_channel_output_config(TIMER0, TIMER_CH_2, &timer_ocinitpara); + timer_channel_output_config(TIMER0, TIMER_CH_3, &timer_ocinitpara); + + /* CH0 configuration in PWM0 mode */ + timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, buffer[0]); + timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + + /* CH1 configuration in PWM0 mode */ + timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_1, buffer[0]); + timer_channel_output_mode_config(TIMER0, TIMER_CH_1, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE); + + /* CH2 configuration in PWM0 mode */ + timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_2, buffer[0]); + timer_channel_output_mode_config(TIMER0, TIMER_CH_2, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE); + + /* CH3 configuration in PWM0 mode */ + timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_3, buffer[0]); + timer_channel_output_mode_config(TIMER0, TIMER_CH_3, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_3, TIMER_OC_SHADOW_DISABLE); + + /* TIMER0 primary output enable */ + timer_primary_output_config(TIMER0, ENABLE); + + /* TIMER0 update DMA request enable */ + timer_dma_transfer_config(TIMER0, TIMER_DMACFG_DMATA_CH0CV, TIMER_DMACFG_DMATC_4TRANSFER); + timer_dma_enable(TIMER0, TIMER_DMA_UPD); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER0); + + /* TIMER0 counter enable */ + timer_enable(TIMER0); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_config(); + dma_config(); + timer_config(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma_burst/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma_burst/readme.txt new file mode 100644 index 0000000..bc739aa --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER0_dma_burst/readme.txt @@ -0,0 +1,48 @@ +/*! + \file readme.txt + \brief description of the TIMER0 DMA burst demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use DMA with +TIMER0 update request to transfer data from memory to TIMER0 capture compare +register 0~3. + + TIMER0CLK is fixed to systemcoreclock, the TIMER0 prescaler is equal to 108 +so the TIMER0 counter clock used is 1MHz. + + The objective is to configure TIMER0 channel 0~3(PA8~PA11) to generate PWM signal. +capture compare register 0~3 are to be updated twice per circle. On the first update +DMA request, data1 is transferred to CH0CV, data2 is transferred to CH1CV, data3 is +transferred to CH2CV, data4 is transferred to CH3CV and duty cycle(10%, 20%, 30%, 40%). +On the second update DMA request, data5 is transferred to CH0CV, data6 is transferred +to CH1CV, data7 is transferred to CH2CV, data8 is transferred to CH3CV and duty cycle +(50%, 60%, 70%, 80%). diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_exttrigger/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_exttrigger/main.c new file mode 100644 index 0000000..c699c2b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_exttrigger/main.c @@ -0,0 +1,142 @@ +/*! + \file main.c + \brief TIMER1 external trigger demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* configure the GPIO ports */ +void gpio_config(void); +/* configure the TIMER peripheral */ +void timer_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*configure PA2(TIMER1 CH2) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); + + /*configure PA0(TIMER1 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0); +} + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* TIMER with an external trigger ------------------------------------- + TIMER1 is configured as slave timer for an external trigger connected + to TIMER1 CI0 pin : + - The TIMER1 CI0FE0 is used as trigger input + - rising edge is used to start the TIMER1: event mode. + - TIMER1 CH2 is used PWM Mode 0. + the starts of the TIMER1 counter are controlled by the + external trigger. + -------------------------------------------------------------------- */ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + timer_ic_parameter_struct timer_icinitpara; + + rcu_periph_clock_enable(RCU_TIMER1); + + timer_deinit(TIMER1); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER1 configuration */ + timer_initpara.prescaler = 239; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 7999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER1, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH2 configuration in OC PWM0 mode */ + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + timer_channel_output_config(TIMER1, TIMER_CH_2, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,3999); + timer_channel_output_mode_config(TIMER1, TIMER_CH_2, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE); + + /* initialize TIMER channel input parameter struct */ + timer_channel_input_struct_para_init(&timer_icinitpara); + /* TIMER1 CH0 input capture configuration */ + timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING; + timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI; + timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1; + timer_icinitpara.icfilter = 0x02; + timer_input_capture_config(TIMER1, TIMER_CH_0, &timer_icinitpara); + + /* slave mode selection: TIMER1 */ + /* TIMER1 input trigger: external trigger connected to CI0 */ + timer_input_trigger_source_select(TIMER1, TIMER_SMCFG_TRGSEL_CI0FE0); + timer_slave_mode_select(TIMER1, TIMER_SLAVE_MODE_EVENT); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER1); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_config(); + timer_config(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_exttrigger/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_exttrigger/readme.txt new file mode 100644 index 0000000..788212d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_exttrigger/readme.txt @@ -0,0 +1,46 @@ +/*! + \file readme.txt + \brief description of the TIMER1 external trigger demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to start TIMER +peripherals with an external trigger. + + TIMER1 is configured as slave timer for an external trigger connected to TIMER1 +CI0 pin: + - The TIMER1 CI0FE0 is used as trigger input. + - Rising edge is used to start the TIMER1: event mode. + - TIMER1 CH2(PA2) is used PWM Mode 0. + The starts of the TIMER1 counter are controlled by the external trigger. + + Connect the TIMER1 CH0(PA0) pin to +3V3 on the board as a external trigger with a +rising edge. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocactive/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocactive/main.c new file mode 100644 index 0000000..ccdf763 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocactive/main.c @@ -0,0 +1,135 @@ +/*! + \file main.c + \brief TIMER1 oc active demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +void gpio_config(void); +void timer_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*Configure PA0/PA1/PA2(TIMER1 CH0/CH1/CH2) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); +} + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* --------------------------------------------------------------- + TIMER1 Configuration: + TIMER1CLK = SystemCoreClock / 10800 = 10K, + And generate 3 signals with 3 different delays: + TIMER1_CH0 delay = 4000/10000 = 0.4s + TIMER1_CH1 delay = 8000/10000 = 0.8s + TIMER1_CH2 delay = 12000/10000 = 1.2s + --------------------------------------------------------------- */ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER1); + + timer_deinit(TIMER1); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER1 configuration */ + timer_initpara.prescaler = 10799; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 65535; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER1, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH0,CH1 and CH2 configuration in OC active mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + + timer_channel_output_config(TIMER1, TIMER_CH_0, &timer_ocinitpara); + timer_channel_output_config(TIMER1, TIMER_CH_1, &timer_ocinitpara); + timer_channel_output_config(TIMER1, TIMER_CH_2, &timer_ocinitpara); + + /* CH0 configuration in OC active mode */ + timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_0,3999); + timer_channel_output_mode_config(TIMER1, TIMER_CH_0, TIMER_OC_MODE_ACTIVE); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + + /* CH1 configuration in OC active mode */ + timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,7999); + timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_ACTIVE); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE); + + /* CH2 configuration in OC active mode */ + timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,11999); + timer_channel_output_mode_config(TIMER1, TIMER_CH_2, TIMER_OC_MODE_ACTIVE); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE); + + timer_enable(TIMER1); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_config(); + timer_config(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocactive/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocactive/readme.txt new file mode 100644 index 0000000..183226e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocactive/readme.txt @@ -0,0 +1,52 @@ +/*! + \file readme.txt + \brief description of the TIMER1 OC active demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to configure the +TIMER peripheral to generate three different signals with three different delays. + + The TIMxCLK frequency is set to systemcoreclock, the prescaler is 10800 +so the TIMER1 counter clock is 10KHz. + + And generate 3 signals with 3 different delays: + TIMER1_CH0 delay = 4000/10K = 0.4s + TIMER1_CH1 delay = 8000/10K = 0.8s + TIMER1_CH2 delay = 12000/10K = 1.2s + + Connect the TIMER1 pins to leds and reset the board to watch the signal: + - TIMER1_CH0 pin (PA0) + - TIMER1_CH1 pin (PA1) + - TIMER1_CH2 pin (PA2) + - LED3 pin (PC2) + - LED4 pin (PE0) + - LED5 pin (PE1) diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocinactive/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocinactive/gd32vf103_it.c new file mode 100644 index 0000000..8e11247 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocinactive/gd32vf103_it.c @@ -0,0 +1,60 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + + +/** + * @brief This function handles TIMER1 interrupt request. + * @param None + * @retval None + */ +void TIMER1_IRQHandler(void) +{ + if(SET == timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH0)){ + /* clear channel 0 interrupt bit */ + timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_CH0); + gd_eval_led_off(LED2); + }else if(SET == timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH1)){ + /* clear channel 1 interrupt bit */ + timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_CH1); + gd_eval_led_off(LED3); + }else if(SET == timer_interrupt_flag_get(TIMER1, TIMER_INT_FLAG_CH2)){ + /* clear channel 2 interrupt bit */ + timer_interrupt_flag_clear(TIMER1, TIMER_INT_FLAG_CH2); + gd_eval_led_off(LED4); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocinactive/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocinactive/main.c new file mode 100644 index 0000000..52a4083 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocinactive/main.c @@ -0,0 +1,152 @@ +/*! + \file main.c + \brief TIMER1 oc inactive demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* configure the GPIO ports */ +void gpio_config(void); +/* configure the TIMER peripheral */ +void timer_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*Configure PA0/PA1/PA2(TIMER1 CH0/CH1/CH2) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); +} + + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* --------------------------------------------------------------- + TIMER1 Configuration: + TIMER1CLK = SystemCoreClock / 54000 = 2KHz, + And generate 3 signals with 3 different delays: + TIMER1_CH0 delay = 2000/2000 = 1s + TIMER1_CH1 delay = 4000/2000 = 2s + TIMER1_CH2 delay = 6000/2000 = 3s + --------------------------------------------------------------- */ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER1); + + timer_deinit(TIMER1); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER1 configuration */ + timer_initpara.prescaler = 53999; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 10000; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER1, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH0,CH1 and CH2 configuration in OC inactive mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + + timer_channel_output_config(TIMER1, TIMER_CH_0, &timer_ocinitpara); + timer_channel_output_config(TIMER1, TIMER_CH_1, &timer_ocinitpara); + timer_channel_output_config(TIMER1, TIMER_CH_2, &timer_ocinitpara); + + /* CH0 configuration in OC inactive mode */ + timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_0, 2000); + timer_channel_output_mode_config(TIMER1, TIMER_CH_0, TIMER_OC_MODE_INACTIVE); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + + /* CH1 configuration in OC inactive mode */ + timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 4000); + timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_INACTIVE); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE); + + /* CH2 configuration in OC inactive mode */ + timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_2, 6000); + timer_channel_output_mode_config(TIMER1, TIMER_CH_2, TIMER_OC_MODE_INACTIVE); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_2, TIMER_OC_SHADOW_DISABLE); + + timer_interrupt_enable(TIMER1, TIMER_INT_CH0 | TIMER_INT_CH1 | TIMER_INT_CH2); + + gd_eval_led_on(LED2); + gd_eval_led_on(LED3); + gd_eval_led_on(LED4); + + timer_enable(TIMER1); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); + + gpio_config(); + eclic_global_interrupt_enable(); + eclic_set_nlbits(ECLIC_GROUP_LEVEL3_PRIO1); + eclic_irq_enable(TIMER1_IRQn,1,0); + timer_config(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocinactive/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocinactive/readme.txt new file mode 100644 index 0000000..bb8ea36 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_ocinactive/readme.txt @@ -0,0 +1,52 @@ +/*! + \file readme.txt + \brief description of the TIMER1 OC inactive demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to configure the +TIMER peripheral to generate three different signals with three different delays. + + The TIMxCLK frequency is set to systemcoreclock, the prescaler is 54000, so the +TIMER1 counter clock is 2KHz. + + And generate 3 signals with 3 different delays: + TIMER1_CH0 delay = 2000/2000 = 1s. + TIMER1_CH1 delay = 4000/2000 = 2s. + TIMER1_CH2 delay = 6000/2000 = 3s. + + So PA0 is reset after a delay equal to 1s, PA1 is reset after a delay equal to 2s, +and PA2 is reset after a delay equal to 3s. + + While the counter is lower than the TIMER_CHxCV registers values, which determines +the output delay, the LED2, LED3 and LED4 are turned on. When the counter value reaches +the TIMER_CHxCV registers values, the channel output compare interrupts are generated, +and in the handler routine, these LEDs are turned off. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_octoggle/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_octoggle/main.c new file mode 100644 index 0000000..4e44f1c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_octoggle/main.c @@ -0,0 +1,122 @@ +/*! + \file main.c + \brief TIMER1 oc toggle demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* configure the GPIO ports */ +void gpio_config(void); +/* configure the TIMER peripheral */ +void timer_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*configure PA1(TIMER1 CH1) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); +} + +/** + \brief configure the timer peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* --------------------------------------------------------------------------- + TIMER1 configuration: output compare toggle mode: + TIMER1CLK = systemcoreclock / 5400 = 20K, + CH1 update rate = TIMER1 counter clock / CH1VAL = 20000/4000 = 5 Hz + ----------------------------------------------------------------------------*/ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER1); + + timer_deinit(TIMER1); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER1 configuration */ + timer_initpara.prescaler = 5399; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 3999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER1,&timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH1 configuration in OC TOGGLE mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + + timer_channel_output_config(TIMER1, TIMER_CH_1, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 3999); + timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_TOGGLE); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER1); + timer_enable(TIMER1); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_config(); + timer_config(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_octoggle/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_octoggle/readme.txt new file mode 100644 index 0000000..4b6e94e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_octoggle/readme.txt @@ -0,0 +1,45 @@ +/*! + \file readme.txt + \brief description of the TIMER1 OC toggle demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to configure the +TIMER peripheral to generate the toggle signal. + + The TIMxCLK frequency is set to systemcoreclock, the prescaler is 5400 +so the TIMER1 counter clock is 20KHz. + + TIMER1 configuration: CH1 output compare toggle mode: +CH1 update rate = TIMER1 counter clock / CH1CC = 20000/4000 = 5 Hz. + + Connect the TIMER1 CH1(PA1) to an oscilloscope to monitor waveform. + \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_pwmout/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_pwmout/main.c new file mode 100644 index 0000000..4780d44 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_pwmout/main.c @@ -0,0 +1,139 @@ +/*! + \file main.c + \brief TIMER1 PWM output demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +void gpio_config(void); +void timer_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*Configure PA1 PA2 PA3(TIMER1 CH1 CH2 CH3) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_3); +} + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* ----------------------------------------------------------------------- + TIMER1 configuration: generate 3 PWM signals with 3 different duty cycles: + TIMER1CLK = SystemCoreClock / 108 = 1MHz + + TIMER1 channel1 duty cycle = (4000/ 16000)* 100 = 25% + TIMER1 channel2 duty cycle = (8000/ 16000)* 100 = 50% + TIMER1 channel3 duty cycle = (12000/ 16000)* 100 = 75% + ----------------------------------------------------------------------- */ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER1); + + timer_deinit(TIMER1); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER1 configuration */ + timer_initpara.prescaler = 107; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 15999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER1, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH0, CH1 and CH2 configuration in PWM mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + + timer_channel_output_config(TIMER1,TIMER_CH_1,&timer_ocinitpara); + timer_channel_output_config(TIMER1,TIMER_CH_2,&timer_ocinitpara); + timer_channel_output_config(TIMER1,TIMER_CH_3,&timer_ocinitpara); + + /* CH1 configuration in PWM mode1,duty cycle 25% */ + timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_1,3999); + timer_channel_output_mode_config(TIMER1,TIMER_CH_1,TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER1,TIMER_CH_1,TIMER_OC_SHADOW_DISABLE); + + /* CH2 configuration in PWM mode1,duty cycle 50% */ + timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_2,7999); + timer_channel_output_mode_config(TIMER1,TIMER_CH_2,TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER1,TIMER_CH_2,TIMER_OC_SHADOW_DISABLE); + + /* CH3 configuration in PWM mode1,duty cycle 75% */ + timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_3,11999); + timer_channel_output_mode_config(TIMER1,TIMER_CH_3,TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER1,TIMER_CH_3,TIMER_OC_SHADOW_DISABLE); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER1); + /* auto-reload preload enable */ + timer_enable(TIMER1); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_config(); + timer_config(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_pwmout/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_pwmout/readme.txt new file mode 100644 index 0000000..1783f26 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_pwmout/readme.txt @@ -0,0 +1,48 @@ +/*! + \file readme.txt + \brief description of the TIMER1 PWM output demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to configure the +TIMER peripheral in PWM (Pulse Width Modulation) mode. + + The TIMxCLK frequency is set to systemcoreclock, the prescaler is 108 so the +TIMER1 counter clock is 1MHz. + + TIMER1 Channel1 duty cycle = (4000/ 16000)* 100 = 25%. + TIMER1 Channel2 duty cycle = (8000/ 16000)* 100 = 50%. + TIMER1 Channel3 duty cycle = (12000/ 16000)* 100 = 75%. + + Connect the TIMER1 pins to an oscilloscope to monitor the different waveforms: + - TIMER1_CH1 pin (PA1) + - TIMER1_CH2 pin (PA2) + - TIMER1_CH3 pin (PA3) diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_singlepulse/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_singlepulse/main.c new file mode 100644 index 0000000..15dddf8 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_singlepulse/main.c @@ -0,0 +1,147 @@ +/*! + \file main.c + \brief TIMER1 single pulse demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* configure the GPIO ports */ +void gpio_config(void); +/* configure the TIMER peripheral */ +void timer_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*configure PA0/PA1(TIMER1 CH0/CH1) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_0); + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); +} + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* ----------------------------------------------------------------------- + TIMER1 configuration: single pulse mode + the external signal is connected to TIMER1 CH0 pin(PA0) and the falling + edge is used as active edge. + the single pulse signal is output on TIMER1 CH1 pin(PA1). + + the TIMER1CLK frequency is set to systemcoreclock,the prescaler is + 6,so the TIMER1 counter clock is 18MHz. + + single pulse value = (TIMER1_Period - TIMER1_Pulse) / TIMER1 counter clock + = (65535 - 11535) / 18MHz = 3 ms. + ----------------------------------------------------------------------- */ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + timer_ic_parameter_struct timer_icinitpara; + + rcu_periph_clock_enable(RCU_TIMER1); + + timer_deinit(TIMER1); + + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER1 configuration */ + timer_initpara.prescaler = 5; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 65535; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER1, &timer_initpara); + + /* auto-reload preload disable */ + timer_auto_reload_shadow_disable(TIMER1); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH1 configuration in OC PWM mode 1 */ + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + timer_channel_output_config(TIMER1, TIMER_CH_1, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_1, 11535); + timer_channel_output_mode_config(TIMER1, TIMER_CH_1, TIMER_OC_MODE_PWM1); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_1, TIMER_OC_SHADOW_DISABLE); + + /* initialize TIMER channel input parameter struct */ + timer_channel_input_struct_para_init(&timer_icinitpara); + /* TIMER1 CH0 input capture configuration */ + timer_icinitpara.icpolarity = TIMER_IC_POLARITY_FALLING; + timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI; + timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1; + timer_icinitpara.icfilter = 0x00; + timer_input_capture_config(TIMER1, TIMER_CH_0, &timer_icinitpara); + + /* single pulse mode selection */ + timer_single_pulse_mode_config(TIMER1, TIMER_SP_MODE_SINGLE); + + /* slave mode selection : TIMER1 */ + /* TIMER1 input trigger : external trigger connected to CI0 */ + timer_input_trigger_source_select(TIMER1, TIMER_SMCFG_TRGSEL_CI0FE0); + timer_slave_mode_select(TIMER1, TIMER_SLAVE_MODE_EVENT); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_config(); + timer_config(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_singlepulse/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_singlepulse/readme.txt new file mode 100644 index 0000000..19bec0a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_singlepulse/readme.txt @@ -0,0 +1,50 @@ +/*! + \file readme.txt + \brief description of the TIMER1 single pulse demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to configure +the TIMER1 peripheral in single pulse mode. + The external signal is connected to TIMER1 CH0 pin(PA0) and the falling edge is +used as active edge. + + The single pulse signal is output on TIMER1 CH1 pin(PA1). + + The TIMER1CLK frequency is set to systemcoreclock,the prescaler is 6,so the +TIMER1 counter clock is 18MHz. + + single pulse value = (TIMER1_period - TIMER1_pulse) / TIMER1 counter clock + = (65535 - 11535) / 18MHz = 3 ms. + + Connect the TIMER1 CH1 pin (PA1) to an oscilloscope to monitor the waveform. +Connect the TIMER1 CH0 pin (PA0) to KEY_TAMPER(PC13),When KEY_TAMPER is pressed, +a single pulse is generated on TIMER1 CH1 pin. \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_timebase/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_timebase/gd32vf103_it.c new file mode 100644 index 0000000..8246b29 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_timebase/gd32vf103_it.c @@ -0,0 +1,49 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +/** + * @brief This function handles TIMER1 interrupt request. + * @param None + * @retval None + */ +void TIMER1_IRQHandler(void) +{ + if(SET == timer_interrupt_flag_get(TIMER1, TIMER_INT_CH0)){ + /* clear channel 0 interrupt bit */ + timer_interrupt_flag_clear(TIMER1, TIMER_INT_CH0); + gd_eval_led_toggle(LED2); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_timebase/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_timebase/main.c new file mode 100644 index 0000000..7044ccf --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_timebase/main.c @@ -0,0 +1,124 @@ +/*! + \file main.c + \brief TIMER1 oc timebase demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* configure the GPIO ports */ +void gpio_config(void); +/* configure the TIMER peripheral */ +void timer_config(void); + + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*Configure PA0(TIMER1 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); +} + + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* ---------------------------------------------------------------------------- + TIMER1 Configuration: + TIMER1CLK = SystemCoreClock/5400 = 20KHz. + TIMER1 configuration is timing mode, and the timing is 0.2s(4000/20000 = 0.2s). + CH0 update rate = TIMER1 counter clock/CH0CV = 20000/4000 = 5Hz. + ---------------------------------------------------------------------------- */ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER1); + + timer_deinit(TIMER1); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER1 configuration */ + timer_initpara.prescaler = 5399; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 4000; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_init(TIMER1, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH0,CH1 and CH2 configuration in OC timing mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_channel_output_config(TIMER1, TIMER_CH_0, &timer_ocinitpara); + + /* CH0 configuration in OC timing mode */ + timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_0, 2000); + timer_channel_output_mode_config(TIMER1, TIMER_CH_0, TIMER_OC_MODE_TIMING); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + + timer_interrupt_enable(TIMER1, TIMER_INT_CH0); + timer_enable(TIMER1); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gd_eval_led_init(LED2); + + gpio_config(); + eclic_global_interrupt_enable(); + eclic_set_nlbits(ECLIC_GROUP_LEVEL3_PRIO1); + eclic_irq_enable(TIMER1_IRQn,1,0); + timer_config(); + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_timebase/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_timebase/readme.txt new file mode 100644 index 0000000..c8493a0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER1_timebase/readme.txt @@ -0,0 +1,47 @@ +/*! + \file readme.txt + \brief description of the TIMER1 timebase demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to configure the +TIMER peripheral in timing mode with the corresponding interrupt request for channel 0 +in order to generate a time base. + + The TIMxCLK frequency is set to systemcoreclock, the prescaler is 5400, so the TIMER1 +counter clock is 20KHz. + + TIMER1 configuration is timing mode, and the timing is 0.2s(4000/20000 = 0.2s), and +the CH0 update rate = TIMER1 counter clock/CH0CV = 20000/4000 = 5Hz. + + Enable the channel 0 interrupt, so the TIMER1 generates an interrupt each 0.2s, in +the handler routine, LED1 is toggled each 0.2s. + \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_inputcapture/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_inputcapture/gd32vf103_it.c new file mode 100644 index 0000000..3c8103a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_inputcapture/gd32vf103_it.c @@ -0,0 +1,74 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include + +uint16_t readvalue1 = 0, readvalue2 = 0; +uint16_t ccnumber = 0; +uint32_t count = 0; +float fre = 0; + +/** + * @brief This function handles TIMER2 interrupt request. + * @param None + * @retval None + */ +void TIMER2_IRQHandler(void) +{ + if(SET == timer_interrupt_flag_get(TIMER2,TIMER_INT_FLAG_CH0)){ + /* clear channel 0 interrupt bit */ + timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH0); + + if(0 == ccnumber){ + /* read channel 0 capture value */ + readvalue1 = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_0); + ccnumber = 1; + }else if(1 == ccnumber){ + /* read channel 0 capture value */ + readvalue2 = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_0); + + if(readvalue2 > readvalue1){ + count = (readvalue2 - readvalue1); + }else{ + count = ((0xFFFF - readvalue1) + readvalue2); + } + + fre = (float)1000000 / count; + printf("the frequence is %d\n\r",(uint16_t)fre); + + ccnumber = 0; + } + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_inputcapture/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_inputcapture/main.c new file mode 100644 index 0000000..d65db81 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_inputcapture/main.c @@ -0,0 +1,126 @@ +/*! + \file main.c + \brief TIMER2 input capture demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* configure the GPIO ports */ +void gpio_configuration(void); +/* configure the TIMER peripheral */ +void timer_configuration(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_configuration(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*configure PA6(TIMER2 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); +} + + + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_configuration(void) +{ + /* TIMER2 configuration: input capture mode ------------------- + the external signal is connected to TIMER2 CH0 pin(PA6) + the rising edge is used as active edge + the TIMER2 CH0CV is used to compute the frequency value + ------------------------------------------------------------ */ + timer_ic_parameter_struct timer_icinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER2); + + timer_deinit(TIMER2); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER2 configuration */ + timer_initpara.prescaler = 107; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 65535; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER2,&timer_initpara); + + /* TIMER2 configuration */ + /* initialize TIMER channel input parameter struct */ + timer_channel_input_struct_para_init(&timer_icinitpara); + /* TIMER2 CH0 input capture configuration */ + timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING; + timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI; + timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1; + timer_icinitpara.icfilter = 0x0; + timer_input_capture_config(TIMER2,TIMER_CH_0,&timer_icinitpara); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER2); + /* clear channel 0 interrupt bit */ + timer_interrupt_flag_clear(TIMER2,TIMER_INT_FLAG_CH0); + /* channel 0 interrupt enable */ + timer_interrupt_enable(TIMER2,TIMER_INT_CH0); + + /* TIMER2 counter enable */ + timer_enable(TIMER2); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_configuration(); + gd_eval_com_init(EVAL_COM0); + eclic_global_interrupt_enable(); + eclic_set_nlbits(ECLIC_GROUP_LEVEL3_PRIO1); + eclic_irq_enable(TIMER2_IRQn,1,0); + timer_configuration(); + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_inputcapture/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_inputcapture/readme.txt new file mode 100644 index 0000000..83451e0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_inputcapture/readme.txt @@ -0,0 +1,56 @@ +/*! + \file readme.txt + \brief description of the TIMER2 input capture demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows TIMER peripheral to +measure the frequency of an external signal. + + The TIMxCLK frequency is set to systemcoreclock,the prescaler is 108 so +the TIMER2 counter clock is 1MHz. + + The external signal is connected to TIMER2 CH0 pin (PA6). + The amplitude of the external signal is better to be set as 3.3V. + The rising edge is used as active edge. + The TIMER2 CH0CV is used to compute the frequency value. + + The available frequence of the input signal is ranging from 16Hz to 20KHz. +You can use USART to watch the frequency of the input signal.The USART is +configured as follow: + - BaudRate = 115200 baud + - Word Length = 8 Bits + - One Stop Bit + - No parity + - Hardware flow control disabled (RTS and CTS signals) + - Receive and transmit enabled + + JP4 must be jumpped to USART. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/gd32vf103_it.c new file mode 100644 index 0000000..bc5a317 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/gd32vf103_it.c @@ -0,0 +1,82 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" +#include + +uint32_t ic1value = 0,ic2value = 0; +uint16_t dutycycle = 0; +float frequency = 0; +bool data_valid = FALSE; + +/** + * @brief this function handles TIMER2 interrupt request + * @param None + * @retval None + */ +void TIMER2_IRQHandler(void) +{ + if(SET == timer_interrupt_flag_get(TIMER2,TIMER_INT_CH0)){ + /* clear channel 0 interrupt bit */ + timer_interrupt_flag_clear(TIMER2,TIMER_INT_CH0); + /* read channel 0 capture value */ + ic1value = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_0) + 1; + + if(0 != ic1value){ + /* read channel 1 capture value */ + ic2value = timer_channel_capture_value_register_read(TIMER2, TIMER_CH_1) + 1; + + /* calculate the duty cycle value */ + dutycycle = (ic2value * 100) / ic1value; + /* calculate the frequency value */ + frequency = (float)1000000U / ic1value; + + if(TRUE == data_valid) + { + /* print valid data */ + + printf("the dutycycle is %d\n",dutycycle); + printf("the frequence is %d\n",(uint16_t)frequency); + }else{ + /* discard the first data */ + /* the first number is inaccurate */ + data_valid = TRUE; + } + }else{ + /* reset the data */ + dutycycle = 0; + frequency = 0; + } + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/gd32vf103_it.h new file mode 100644 index 0000000..1adff88 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/gd32vf103_it.h @@ -0,0 +1,43 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef gd32vf103_IT_H +#define gd32vf103_IT_H + +#include "gd32vf103.h" + +/* TIMER2 handle function */ +void TIMER2_IRQHandler(void); + +#endif /* gd32vf103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/main.c new file mode 100644 index 0000000..6f00781 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/main.c @@ -0,0 +1,143 @@ +/*! + \file main.c + \brief TIMER2 PWM input capture demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* configure the GPIO ports */ +void gpio_configuration(void); +/* configure the TIMER peripheral */ +void timer_configuration(void); +/* retarget the C library printf function to the USART */ +int fputc(int ch, FILE *f); + +/* retarget the C library printf function to the USART */ +int fputc(int ch, FILE *f) +{ + usart_data_transmit(EVAL_COM1, (uint8_t)ch); + while(RESET == usart_flag_get(EVAL_COM1, USART_FLAG_TBE)); + return ch; +} + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_configuration(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*configure PA6(TIMER2 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_6); +} + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_configuration(void) +{ + /* TIMER2 configuration: PWM input mode ------------------------ + the external signal is connected to TIMER2 CH0 pin(PA6) + the rising edge is used as active edge + the TIMER2 CH0CV is used to compute the frequency value + the TIMER2 CH1CV is used to compute the duty cycle value + ------------------------------------------------------------ */ + timer_ic_parameter_struct timer_icinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER2); + + timer_deinit(TIMER2); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + /* TIMER2 configuration */ + timer_initpara.prescaler = 107; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 65535; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER2, &timer_initpara); + + /* TIMER2 configuration */ + /* initialize TIMER channel input parameter struct */ + timer_channel_input_struct_para_init(&timer_icinitpara); + /* TIMER2 CH0 PWM input capture configuration */ + timer_icinitpara.icpolarity = TIMER_IC_POLARITY_RISING; + timer_icinitpara.icselection = TIMER_IC_SELECTION_DIRECTTI; + timer_icinitpara.icprescaler = TIMER_IC_PSC_DIV1; + timer_icinitpara.icfilter = 0x0; + timer_input_pwm_capture_config(TIMER2, TIMER_CH_0, &timer_icinitpara); + + /* slave mode selection: TIMER2 */ + timer_input_trigger_source_select(TIMER2, TIMER_SMCFG_TRGSEL_CI0FE0); + timer_slave_mode_select(TIMER2, TIMER_SLAVE_MODE_RESTART); + + /* select the master slave mode */ + timer_master_slave_mode_config(TIMER2, TIMER_MASTER_SLAVE_MODE_ENABLE); + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER2); + /* clear channel 0 interrupt bit */ + timer_interrupt_flag_clear(TIMER2,TIMER_INT_CH0); + /* channel 0 interrupt enable */ + timer_interrupt_enable(TIMER2, TIMER_INT_CH0); + + /* TIMER2 counter enable */ + timer_enable(TIMER2); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_configuration(); + gd_eval_com_init(EVAL_COM0); + eclic_global_interrupt_enable(); + eclic_set_nlbits(ECLIC_GROUP_LEVEL3_PRIO1); + eclic_irq_enable(TIMER2_IRQn,1,0); + timer_configuration(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/readme.txt new file mode 100644 index 0000000..1a1b56c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMER2_pwminputcapture/readme.txt @@ -0,0 +1,56 @@ +/*! + \file readme.txt + \brief description of the TIMER2 PWM input capture demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use the TIMER +peripheral to measure the frequency and duty cycle of an external signal. + + The TIMxCLK frequency is set to systemcoreclock, the prescaler is 108 so the +TIMER2 counter clock is 1MHz. + + The external signal is connected to TIMER2 CH0 pin (PA6). + The rising edge is used as active edge. + The TIMER2 CH0CV is used to compute the frequency value. + The TIMER2 CH1CV is used to compute the duty cycle value. + + The available frequence of the input signal is ranging from 16Hz to 20KHz. +You can use USART to watch the frequency and duty cycle of the input signal. +The USART is configured as follow: + - BaudRate = 115200 baud + - Word Length = 8 Bits + - One Stop Bit + - No parity + - Hardware flow control disabled (RTS and CTS signals) + - Receive and transmit enabled + + JP4 must be jumpped to USART. \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_cascadesynchro/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_cascadesynchro/main.c new file mode 100644 index 0000000..33cfc33 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_cascadesynchro/main.c @@ -0,0 +1,222 @@ +/*! + \file main.c + \brief TIMERs cascade synchro demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* configure the GPIO ports */ +void gpio_config(void); +/* configure the TIMER peripheral */ +void timer_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*configure PA6(TIMER2 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6); + + /*configure PA0(TIMER1 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); + + /*configure PA8(TIMER0 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8); +} + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* timers synchronisation in cascade mode ---------------------------- + 1/TIMER1 is configured as master timer: + - PWM mode is used + - The TIMER1 update event is used as trigger output + + 2/TIMER2 is slave for TIMER1 and master for TIMER0, + - PWM mode is used + - The ITR1(TIMER1) is used as input trigger + - external clock mode is used,the counter counts on the rising edges of + the selected trigger. + - the TIMER2 update event is used as trigger output. + + 3/TIMER0 is slave for TIMER2, + - PWM mode is used + - The ITR2(TIMER2) is used as input trigger + - external clock mode is used,the counter counts on the rising edges of + the selected trigger. + -------------------------------------------------------------------- */ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER0); + rcu_periph_clock_enable(RCU_TIMER1); + rcu_periph_clock_enable(RCU_TIMER2); + + /* TIMER1 configuration */ + timer_deinit(TIMER1); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + timer_initpara.prescaler = 5399; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 3999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER1,&timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH1 configuration in PWM1 mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + timer_channel_output_config(TIMER1, TIMER_CH_0, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER1,TIMER_CH_0,1999); + timer_channel_output_mode_config(TIMER1,TIMER_CH_0,TIMER_OC_MODE_PWM1); + timer_channel_output_shadow_config(TIMER1,TIMER_CH_0,TIMER_OC_SHADOW_DISABLE); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER1); + /* select the master slave mode */ + timer_master_slave_mode_config(TIMER1, TIMER_MASTER_SLAVE_MODE_ENABLE); + /* TIMER1 update event is used as trigger output */ + timer_master_output_trigger_source_select(TIMER1, TIMER_TRI_OUT_SRC_UPDATE); + + /* TIMER2 configuration */ + timer_deinit(TIMER2); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + timer_initpara.prescaler = 0; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 1; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER2, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH0 configuration in PWM1 mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + timer_channel_output_config(TIMER2, TIMER_CH_0, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 1); + timer_channel_output_mode_config(TIMER2,TIMER_CH_0,TIMER_OC_MODE_PWM1); + timer_channel_output_shadow_config(TIMER2, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER2); + /* slave mode selection: TIMER2 */ + timer_slave_mode_select(TIMER2, TIMER_SLAVE_MODE_EXTERNAL0); + timer_input_trigger_source_select(TIMER2, TIMER_SMCFG_TRGSEL_ITI1); + /* select the master slave mode */ + timer_master_slave_mode_config(TIMER2, TIMER_MASTER_SLAVE_MODE_ENABLE); + /* TIMER2 update event is used as trigger output */ + timer_master_output_trigger_source_select(TIMER2, TIMER_TRI_OUT_SRC_UPDATE); + + /* TIMER0 configuration */ + timer_deinit(TIMER0); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + timer_initpara.prescaler = 0; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 1; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER0, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH0 configuration in PWM1 mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 1); + timer_channel_output_mode_config(TIMER0,TIMER_CH_0,TIMER_OC_MODE_PWM1); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER0); + /* TIMER0 output enable */ + timer_primary_output_config(TIMER0, ENABLE); + /* slave mode selection: TIMER0 */ + timer_slave_mode_select(TIMER0, TIMER_SLAVE_MODE_EXTERNAL0); + timer_input_trigger_source_select(TIMER0, TIMER_SMCFG_TRGSEL_ITI2); + + /* TIMER counter enable */ + timer_enable(TIMER1); + timer_enable(TIMER2); + timer_enable(TIMER0); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_config(); + timer_config(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_cascadesynchro/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_cascadesynchro/readme.txt new file mode 100644 index 0000000..f22da52 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_cascadesynchro/readme.txt @@ -0,0 +1,74 @@ +/*! + \file readme.txt + \brief description of the TIMERs cascade synchro demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to synchronize +TIMER peripherals in cascade mode. + + In this example three timers are used: + 1/TIMER1 is configured as master timer: + - PWM mode is used + - The TIMER1 update event is used as trigger output + + 2/TIMER2 is slave for TIMER1 and master for TIMER0, + - PWM mode is used + - The ITR0(TIMER1) is used as input trigger + - External clock mode is used,the counter counts on the rising edges of + the selected trigger. + - The TIMER2 update event is used as trigger output. + + 3/TIMER0 is slave for TIMER2, + - PWM mode is used + - The ITR1(TIMER2) is used as input trigger + - External clock mode is used,the counter counts on the rising edges of + the selected trigger. + + The TIMERxCLK is fixed to 108 MHz, the TIMER1 counter clock is : +108MHz/5400= 20 KHz. + + The master timer TIMER1 is running at TIMER1 frequency : + TIMER1 frequency = (TIMER1 counter clock)/ (TIMER1 period + 1) = 5 Hz +and the duty cycle = TIMER1_CH0CC/(TIMER1_CAR + 1) = 50% + + The TIMER2 is running: + - At (TIMER1 frequency)/ (TIMER2 period + 1) = 2.5 Hz and a duty cycle + equal to TIMER2_CH0CC/(TIMER2_CAR + 1) = 50% + + The TIMER0 is running: + - At (TIMER2 frequency)/ (TIMER0 period + 1) = 1.25 Hz and a duty cycle + equal to TIMER0_CH0CC/(TIMER0_CAR + 1) = 50% + + Connect the three pins to a logic analyzer to monitor the different waveforms: + - TIMER1_CH0 pin (PA0) + - TIMER2_CH0 pin (PA6) + - TIMER0_CH0 pin (PA8) diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_parallelsynchro/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_parallelsynchro/main.c new file mode 100644 index 0000000..55ee4b9 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_parallelsynchro/main.c @@ -0,0 +1,221 @@ +/*! + \file main.c + \brief TIMERs parallel synchro demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +/* configure the GPIO ports */ +void gpio_config(void); +/* configure the TIMER peripheral */ +void timer_config(void); + +/** + \brief configure the GPIO ports + \param[in] none + \param[out] none + \retval none + */ +void gpio_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_AF); + + /*configure PA0(TIMER1 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); + + /*configure PA6(TIMER2 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6); + + /*configure PA8(TIMER0 CH0) as alternate function*/ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_8); +} + +/** + \brief configure the TIMER peripheral + \param[in] none + \param[out] none + \retval none + */ +void timer_config(void) +{ + /* timers synchronisation in parallel mode ---------------------------- + 1/TIMER1 is configured as master timer: + - PWM mode is used. + - The TIMER1 update event is used as trigger output. + + 2/TIMER2 is slave for TIMER1, + - PWM mode is used. + - The ITR1(TIMER1) is used as input trigger. + - external clock mode is used, the counter counts on the rising edges of + the selected trigger. + + 3/TIMER0 is slave for TIMER1, + - PWM mode is used. + - The ITR1(TIMER1) is used as input trigger. + - external clock mode is used, the counter counts on the rising edges of + the selected trigger. + -------------------------------------------------------------------- */ + timer_oc_parameter_struct timer_ocinitpara; + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER0); + rcu_periph_clock_enable(RCU_TIMER1); + rcu_periph_clock_enable(RCU_TIMER2); + + /* TIMER1 configuration */ + timer_deinit(TIMER1); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + timer_initpara.prescaler = 5399; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 3999; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER1, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH1 configuration in PWM0 mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + timer_channel_output_config(TIMER1, TIMER_CH_0, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER1, TIMER_CH_0, 2000); + timer_channel_output_mode_config(TIMER1, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER1, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER1); + /* select the master slave mode */ + timer_master_slave_mode_config(TIMER1, TIMER_MASTER_SLAVE_MODE_ENABLE); + /* TIMER1 update event is used as trigger output */ + timer_master_output_trigger_source_select(TIMER1, TIMER_TRI_OUT_SRC_UPDATE); + + /* TIMER2 configuration */ + timer_deinit(TIMER2); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + timer_initpara.prescaler = 0; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 1; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER2, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH0 configuration in PWM mode 0 */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + timer_channel_output_config(TIMER2, TIMER_CH_0, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER2, TIMER_CH_0, 1); + timer_channel_output_mode_config(TIMER2, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER2, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER2); + /* slave mode selection: TIMER2 */ + timer_slave_mode_select(TIMER2, TIMER_SLAVE_MODE_EXTERNAL0); + timer_input_trigger_source_select(TIMER2, TIMER_SMCFG_TRGSEL_ITI1); + /* select the master slave mode */ + timer_master_slave_mode_config(TIMER2, TIMER_MASTER_SLAVE_MODE_ENABLE); + /* TIMER2 update event is used as trigger output */ + timer_master_output_trigger_source_select(TIMER2, TIMER_TRI_OUT_SRC_UPDATE); + + /* TIMER0 configuration */ + timer_deinit(TIMER0); + /* initialize TIMER init parameter struct */ + timer_struct_para_init(&timer_initpara); + timer_initpara.prescaler = 0; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 1; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER0, &timer_initpara); + + /* initialize TIMER channel output parameter struct */ + timer_channel_output_struct_para_init(&timer_ocinitpara); + /* CH0 configuration in PWM0 mode */ + timer_ocinitpara.outputstate = TIMER_CCX_ENABLE; + timer_ocinitpara.outputnstate = TIMER_CCXN_DISABLE; + timer_ocinitpara.ocpolarity = TIMER_OC_POLARITY_HIGH; + timer_ocinitpara.ocnpolarity = TIMER_OCN_POLARITY_HIGH; + timer_ocinitpara.ocidlestate = TIMER_OC_IDLE_STATE_LOW; + timer_ocinitpara.ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; + timer_channel_output_config(TIMER0, TIMER_CH_0, &timer_ocinitpara); + + timer_channel_output_pulse_value_config(TIMER0, TIMER_CH_0, 1); + timer_channel_output_mode_config(TIMER0, TIMER_CH_0, TIMER_OC_MODE_PWM0); + timer_channel_output_shadow_config(TIMER0, TIMER_CH_0, TIMER_OC_SHADOW_DISABLE); + + /* auto-reload preload enable */ + timer_auto_reload_shadow_enable(TIMER0); + /* TIMER0 output enable */ + timer_primary_output_config(TIMER0, ENABLE); + /* slave mode selection: TIMER0 */ + timer_slave_mode_select(TIMER0, TIMER_SLAVE_MODE_EXTERNAL0); + timer_input_trigger_source_select(TIMER0, TIMER_SMCFG_TRGSEL_ITI1); + + /* TIMER counter enable */ + timer_enable(TIMER1); + timer_enable(TIMER2); + timer_enable(TIMER0); +} + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gpio_config(); + timer_config(); + + while (1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_parallelsynchro/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_parallelsynchro/readme.txt new file mode 100644 index 0000000..3667f3d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/TIMER/TIMERs_parallelsynchro/readme.txt @@ -0,0 +1,69 @@ +/*! + \file readme.txt + \brief description of the TIMERs parallel synchro demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to synchronize +TIMER peripherals in parallel mode. + + In this example three timers are used: + 1/TIMER1 is configured as master timer: + - PWM mode is used. + - The TIMER1 update event is used as trigger output. + + 2/TIMER2 is slave for TIMER1, + - PWM mode is used. + - The ITR1(TIMER1) is used as input trigger. + - external clock mode is used, the counter counts on the rising edges of + the selected trigger. + + 3/TIMER0 is slave for TIMER1, + - PWM mode is used. + - The ITR1(TIMER1) is used as input trigger. + - external clock mode is used, the counter counts on the rising edges of + the selected trigger. + + The TIMERxCLK is fixed to 108 MHz, the TIMER1 counter clock is: +108MHz/5400= 20KHz. + + The master timer TIMER1 CH0(PA0) is running at TIMER1 frequency: + TIMER1 frequency = (TIMER1 counter clock)/ (TIMER1 period + 1) = 5 Hz +and the duty cycle = TIMER1_CH0CV/(TIMER1_CAR + 1) = 50% + + The TIMER2 CH0(PA6) is running: + - At (TIMER1 frequency)/ (TIMER2 period + 1) = 2.5 Hz and a duty cycle + equal to TIMER2_CH0CV/(TIMER2_CAR + 1) = 50% + + The TIMER0 CH0(PA8) is running: + - At (TIMER1 frequency)/ (TIMER0 period + 1) = 2.5 Hz and a duty cycle + equal to TIMER2_CH0CV/(TIMER2_CAR + 1) = 50% + \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver/main.c new file mode 100644 index 0000000..a370a01 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver/main.c @@ -0,0 +1,103 @@ +/*! + \file main.c + \brief USART DMA transmitter receiver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +uint8_t rxbuffer[10]; +uint8_t txbuffer[] = "\n\rUSART DMA receive and transmit example, please input 10 bytes:\n\r"; +#define ARRAYNUM(arr_name) (uint32_t)(sizeof(arr_name) / sizeof(*(arr_name))) + +/*! + \brief main function + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + dma_parameter_struct dma_init_struct; + /* enable DMA0 */ + rcu_periph_clock_enable(RCU_DMA0); + /* initialize USART */ + gd_eval_com_init(EVAL_COM0); + /* deinitialize DMA channel3(USART0 tx) */ + dma_deinit(DMA0, DMA_CH3); + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.memory_addr = (uint32_t)txbuffer; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.number = ARRAYNUM(txbuffer); + dma_init_struct.periph_addr = (uint32_t)&USART_DATA(USART0); + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA0, DMA_CH3, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH3); + /* enable DMA channel3 */ + dma_channel_enable(DMA0, DMA_CH3); + + /* USART DMA enable for transmission and reception */ + usart_dma_transmit_config(USART0, USART_DENT_ENABLE); + usart_dma_receive_config(USART0, USART_DENR_ENABLE); + + /* wait DMA Channel transfer complete */ + while(RESET == dma_flag_get(DMA0, DMA_CH3, DMA_FLAG_FTF)); + while(1){ + /* deinitialize DMA channel4 (USART0 rx) */ + dma_deinit(DMA0, DMA_CH4); + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.memory_addr = (uint32_t)rxbuffer; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.number = 10; + dma_init_struct.periph_addr = (uint32_t)&USART_DATA(USART0); + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA0, DMA_CH4, &dma_init_struct); + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH4); + /* enable DMA channel4 */ + dma_channel_enable(DMA0, DMA_CH4); + + /* wait DMA channel transfer complete */ + while(RESET == dma_flag_get(DMA0, DMA_CH4, DMA_FLAG_FTF)); + printf("\n\r%s\n\r", rxbuffer); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver/readme.txt new file mode 100644 index 0000000..94fb58d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver/readme.txt @@ -0,0 +1,43 @@ +/*! + \file readme.txt + \brief USART DMA transmitter receiver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use the USART +DMA transmit and receive. + + Firstly, the USART sends the strings to the hyperterminal and then loops waiting for +receiving max 10 bytes data from the hyperterminal.If the number of data you enter +equal with or more than 10 bytes, USART will send 10 bytes to the hyperterminal. + + JP5 and JP6 must be fitted. + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/gd32vf103_it.c new file mode 100644 index 0000000..b77d974 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/gd32vf103_it.c @@ -0,0 +1,66 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" +#include "gd32vf103v_eval.h" + +extern FlagStatus g_transfer_complete; + +/*! + \brief this function handles DMA0_Channel3_IRQHandler interrupt + \param[in] none + \param[out] none + \retval none +*/ +void DMA0_Channel3_IRQHandler(void) +{ + if(dma_interrupt_flag_get(DMA0, DMA_CH3, DMA_INT_FLAG_FTF)){ + dma_interrupt_flag_clear(DMA0, DMA_CH3, DMA_INT_FLAG_G); + g_transfer_complete = SET; + } +} + +/*! + \brief this function handles DMA0_Channel4_IRQHandler interrupt + \param[in] none + \param[out] none + \retval none +*/ +void DMA0_Channel4_IRQHandler(void) +{ + if(dma_interrupt_flag_get(DMA0, DMA_CH4, DMA_INT_FLAG_FTF)){ + dma_interrupt_flag_clear(DMA0, DMA_CH4, DMA_INT_FLAG_G); + g_transfer_complete = SET; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/gd32vf103_it.h new file mode 100644 index 0000000..24800b9 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/gd32vf103_it.h @@ -0,0 +1,46 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* this function handles DMA0_Channel3_IRQHandler interrupt */ +void DMA0_Channel3_IRQHandler(void); +/* this function handles DMA0_Channel4_IRQHandler interrupt */ +void DMA0_Channel4_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/main.c new file mode 100644 index 0000000..ae18029 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/main.c @@ -0,0 +1,125 @@ +/*! + \file main.c + \brief transmit/receive data using DMA interrupt + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#define ARRAYNUM(arr_nanme) (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme))) + +__IO FlagStatus g_transfer_complete = RESET; +uint8_t rxbuffer[10]; +uint8_t txbuffer[] = "\n\rUSART DMA interrupt receive and transmit example, please input 10 bytes:\n\r"; + +/*! + \brief main function + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + dma_parameter_struct dma_init_struct; + /* enable DMA0 clock */ + rcu_periph_clock_enable(RCU_DMA0); + /* initialize USART */ + gd_eval_com_init(EVAL_COM0); + /*configure DMA0 interrupt*/ + eclic_global_interrupt_enable(); + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1); + eclic_irq_enable(DMA0_Channel3_IRQn, 1, 0); + eclic_irq_enable(DMA0_Channel4_IRQn, 2, 0); + + /* deinitialize DMA channel3(USART0 tx) */ + dma_deinit(DMA0, DMA_CH3); + dma_struct_para_init(&dma_init_struct); + + dma_init_struct.direction = DMA_MEMORY_TO_PERIPHERAL; + dma_init_struct.memory_addr = (uint32_t)txbuffer; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.number = ARRAYNUM(txbuffer); + dma_init_struct.periph_addr = (uint32_t)&USART_DATA(USART0); + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.periph_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA0, DMA_CH3, &dma_init_struct); + + /* deinitialize DMA channel4 (USART0 rx) */ + dma_deinit(DMA0, DMA_CH4); + dma_struct_para_init(&dma_init_struct); + + dma_init_struct.direction = DMA_PERIPHERAL_TO_MEMORY; + dma_init_struct.memory_addr = (uint32_t)rxbuffer; + dma_init_struct.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + dma_init_struct.memory_width = DMA_MEMORY_WIDTH_8BIT; + dma_init_struct.number = 10; + dma_init_struct.periph_addr = (uint32_t)&USART_DATA(USART0); + dma_init_struct.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + dma_init_struct.memory_width = DMA_PERIPHERAL_WIDTH_8BIT; + dma_init_struct.priority = DMA_PRIORITY_ULTRA_HIGH; + dma_init(DMA0, DMA_CH4, &dma_init_struct); + + /* configure DMA mode */ + dma_circulation_disable(DMA0, DMA_CH3); + dma_memory_to_memory_disable(DMA0, DMA_CH3); + dma_circulation_disable(DMA0, DMA_CH4); + dma_memory_to_memory_disable(DMA0, DMA_CH4); + + /* USART DMA0 enable for reception */ + usart_dma_receive_config(USART0, USART_DENR_ENABLE); + /* enable DMA0 channel4 transfer complete interrupt */ + dma_interrupt_enable(DMA0, DMA_CH4, DMA_INT_FTF); + /* enable DMA0 channel4 */ + dma_channel_enable(DMA0, DMA_CH4); + /* USART DMA0 enable for transmission */ + usart_dma_transmit_config(USART0, USART_DENT_ENABLE); + /* enable DMA0 channel3 transfer complete interrupt */ + dma_interrupt_enable(DMA0, DMA_CH3, DMA_INT_FTF); + /* enable DMA0 channel3 */ + dma_channel_enable(DMA0, DMA_CH3); + + /* waiting for the transfer to complete*/ + while(RESET == g_transfer_complete); + + g_transfer_complete = RESET; + + /* waiting for the transfer to complete*/ + while(RESET == g_transfer_complete); + + printf("\n\r%s\n\r", rxbuffer); + while(1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/readme.txt new file mode 100644 index 0000000..dd061a7 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/DMA_transmitter&receiver_interrupt/readme.txt @@ -0,0 +1,44 @@ +/*! + \file readme.txt + \brief description of transmit/receive data using DMA interrupt + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it provides a description +of how to use DMA channel3 to transmit data from RAM memory to USART data +register and how to use DMA channel4 to receive data from USART data register +to RAM memory. + + Firstly, the USART sends the strings to the hyperterminal and then waiting for +receiving max 10 bytes data from the hyperterminal. If the number of data you enter +equal with or more than 10 bytes, USART will send 10 bytes to the hyperterminal. + + JP5 and JP6 must be fitted. \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Half_duplex_transmitter&receiver/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Half_duplex_transmitter&receiver/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Half_duplex_transmitter&receiver/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Half_duplex_transmitter&receiver/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Half_duplex_transmitter&receiver/main.c new file mode 100644 index 0000000..695c8d6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Half_duplex_transmitter&receiver/main.c @@ -0,0 +1,179 @@ +/*! + \file main.c + \brief USART half-duplex transmitter and receiver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +#define ARRAYNUM(arr_nanme) (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme))) +#define TRANSMIT_SIZE0 (ARRAYNUM(transmitter_buffer0)) +#define TRANSMIT_SIZE1 (ARRAYNUM(transmitter_buffer1)) + +uint8_t transmitter_buffer0[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F}; +uint8_t transmitter_buffer1[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F}; +uint8_t receiver_buffer0[TRANSMIT_SIZE1]; +uint8_t receiver_buffer1[TRANSMIT_SIZE0]; +uint8_t transfersize0 = TRANSMIT_SIZE0; +uint8_t transfersize1 = TRANSMIT_SIZE1; +__IO uint8_t txcount0 = 0; +__IO uint16_t rxcount0 = 0; +__IO uint8_t txcount1 = 0; +__IO uint16_t rxcount1 = 0; +ErrStatus state1 = ERROR; +ErrStatus state2 = ERROR; + +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + + /* enable USART and GPIOA clock */ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_USART0); + rcu_periph_clock_enable(RCU_USART1); + + /* configure USART0 Tx as alternate function push-pull */ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); + /* configure USART1 Tx as alternate function push-pull */ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); + /* configure the USART0 Tx pin and USART1 Tx pin */ + + /* USART0 and USART1 baudrate configuration */ + usart_baudrate_set(USART0, 115200); + usart_baudrate_set(USART1, 115200); + + /* enable USART0 half duplex mode*/ + usart_halfduplex_enable(USART0); + /* enable USART1 half duplex mode*/ + usart_halfduplex_enable(USART1); + + /* configure USART transmitter */ + usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); + usart_transmit_config(USART1, USART_TRANSMIT_ENABLE); + + /* configure USART receiver */ + usart_receive_config(USART0, USART_RECEIVE_ENABLE); + usart_receive_config(USART1, USART_RECEIVE_ENABLE); + + /* enable USART */ + usart_enable(USART0); + usart_enable(USART1); + + /* clear the USART1 data register */ + usart_data_receive(USART1); + /* USART0 transmit and USART1 receive */ + while(transfersize0--) + { + /* wait until end of transmit */ + while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)); + usart_data_transmit(USART0, transmitter_buffer0[txcount0++]); + + while(RESET == usart_flag_get(USART1, USART_FLAG_RBNE)); + /* store the received byte in the receiver_buffer1 */ + receiver_buffer1[rxcount0++] = usart_data_receive(USART1); + } + /* clear the USART0 data register */ + usart_data_receive(USART0); + /* USART1 transmit and USART0 receive */ + while(transfersize1--) + { + /* wait until end of transmit */ + while(RESET == usart_flag_get(USART1, USART_FLAG_TBE)); + usart_data_transmit(USART1, transmitter_buffer1[txcount1++]); + + while(RESET == usart_flag_get(USART0, USART_FLAG_RBNE)); + /* store the received byte in the receiver_buffer0 */ + receiver_buffer0[rxcount1++] = usart_data_receive(USART0); + } + + /* compare the received data with the send ones */ + state1 = memory_compare(transmitter_buffer0, receiver_buffer1, TRANSMIT_SIZE0); + state2 = memory_compare(transmitter_buffer1, receiver_buffer0, TRANSMIT_SIZE1); + if(SUCCESS == state1){ + /* if the data transmitted from USART0 and received by USART1 are the same */ + gd_eval_led_on(LED2); + }else{ + /* if the data transmitted from USART0 and received by USART1 are not the same */ + gd_eval_led_off(LED2); + } + if(SUCCESS == state2){ + /* if the data transmitted from USART1 and received by USART0 are the same */ + gd_eval_led_on(LED3); + }else{ + /* if the data transmitted from USART1 and received by USART0 are not the same */ + gd_eval_led_off(LED3); + } + while(1){ + } +} + +/*! + \brief memory compare function + \param[in] src: source data + \param[in] dst: destination data + \param[in] length: the compare data length + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length) +{ + while(length--){ + if(*src++ != *dst++){ + return ERROR; + } + } + return SUCCESS; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Half_duplex_transmitter&receiver/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Half_duplex_transmitter&receiver/readme.txt new file mode 100644 index 0000000..98d562f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Half_duplex_transmitter&receiver/readme.txt @@ -0,0 +1,43 @@ +/*! + \file readme.txt + \brief description of the USART HalfDuplex + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it provides a basic communication +USART0 whith USART1 in Half-Duplex mode. + + The transmitter_buffer0 and transmitter_buffer1 are sent by USART0 and USART1 respectively and +displayed in HyperTerminal. If the data received by USART0 is equal to transmitter_buffer1, LED2 +is turned on. If the data received by USART1 is equal to transmitter_buffer0, LED3 is turned on. + + connect USART0_Tx(PA9) to USART1_Tx(PA2) + JP5 and JP6 must be fitted. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Printf/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Printf/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Printf/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Printf/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Printf/main.c new file mode 100644 index 0000000..360f212 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Printf/main.c @@ -0,0 +1,82 @@ +/*! + \file main.c + \brief USART printf + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* enable GPIO clock */ + rcu_periph_clock_enable(RCU_GPIOA); + + /* enable USART clock */ + rcu_periph_clock_enable(RCU_USART0); + + /* connect port to USARTx_Tx */ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); + + /* connect port to USARTx_Rx */ + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10); + + /* USART configure */ + usart_deinit(USART0); + usart_baudrate_set(USART0, 115200U); + usart_word_length_set(USART0, USART_WL_8BIT); + usart_stop_bit_set(USART0, USART_STB_1BIT); + usart_parity_config(USART0, USART_PM_NONE); + usart_hardware_flow_rts_config(USART0, USART_RTS_DISABLE); + usart_hardware_flow_cts_config(USART0, USART_CTS_DISABLE); + usart_receive_config(USART0, USART_RECEIVE_ENABLE); + usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); + usart_enable(USART0); + + printf("a usart transmit test example!\n"); + while(1); +} + +/* retarget the C library printf function to the USART */ +int _put_char(int ch) +{ + usart_data_transmit(USART0, (uint8_t) ch ); + while ( usart_flag_get(USART0, USART_FLAG_TBE)== RESET){ + } + + return ch; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Printf/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Printf/readme.txt new file mode 100644 index 0000000..09116ba --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Printf/readme.txt @@ -0,0 +1,46 @@ +/*! + \file readme.txt + \brief description of the USART printf + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to retarget the C +library printf function to the USART. + + The USARTx is configured as follow: + - BaudRate = 115200 baud + - Word Length = 8 Bits + - One Stop Bit + - No parity + - Hardware flow control disabled (RTS and CTS signals) + - Receive and transmit enabled + + JP5 and JP6 must be fitted. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Synchronous/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Synchronous/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Synchronous/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Synchronous/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Synchronous/main.c new file mode 100644 index 0000000..da08d1e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Synchronous/main.c @@ -0,0 +1,250 @@ +/*! + \file main.c + \brief USART synchronous + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include + +#define txbuffer_size1 (countof(txbuffer1) - 1) +#define txbuffer_size2 (countof(txbuffer2) - 1) +#define DYMMY_BYTE 0x00000000 +#define countof(a) (sizeof(a) / sizeof(*(a))) + +uint8_t txbuffer1[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F}; +uint8_t txbuffer2[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 0x08, 0x09, 0x0A, 0x0B, 0x0C, 0x0D, 0x0E, 0x0F, + 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 0x18, 0x19, 0x1A, 0x1B, 0x1C, 0x1D, 0x1E, 0x1F, + 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 0x28, 0x29, 0x2A, 0x2B, 0x2C, 0x2D, 0x2E, 0x2F, + 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 0x38, 0x39, 0x3A, 0x3B, 0x3C, 0x3D, 0x3E, 0x3F, + 0x40, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x49, 0x4A, 0x4B, 0x4C, 0x4D, 0x4E, 0x4F, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x55, 0x56, 0x57, 0x58, 0x59, 0x5A, 0x5B, 0x5C, 0x5D, 0x5E, 0x5F, + 0x60, 0x61, 0x62, 0x63, 0x64, 0x65, 0x66, 0x67, 0x68, 0x69, 0x6A, 0x6B, 0x6C, 0x6D, 0x6E, 0x6F, + 0x70, 0x71, 0x72, 0x73, 0x74, 0x75, 0x76, 0x77, 0x78, 0x79, 0x7A, 0x7B, 0x7C, 0x7D, 0x7E, 0x7F}; +uint8_t rxbuffer1[txbuffer_size2]; +uint8_t rxbuffer2[txbuffer_size1]; +__IO uint8_t data_read1 = txbuffer_size2; +__IO uint8_t data_read2 = txbuffer_size1; +__IO uint8_t tx_counter1 = 0, rx_counter1 = 0; +__IO uint8_t tx_counter2 = 0, rx_counter2 = 0; +__IO ErrStatus state1 = ERROR; +__IO ErrStatus state2 = ERROR; + +void usart_config(void); +void spi_config(void); +void led_init(void); +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length); + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* initialize leds */ + led_init(); + /* turn off LED1~4 */ + gd_eval_led_off(LED1); + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + gd_eval_led_off(LED4); + + /* configure USART */ + usart_config(); + + /* configure SPI */ + spi_config(); + + while(data_read2--){ + while(RESET == usart_flag_get(USART0, USART_FLAG_TBE)){ + } + /* write one byte in the USART0 data register */ + usart_data_transmit(USART0, txbuffer1[tx_counter1++]); + /* wait until end of transmit */ + while(RESET == usart_flag_get(USART0, USART_FLAG_TC)){ + } + /* wait the byte is entirely received by SPI0 */ + while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_RBNE)){ + } + /* store the received byte in the rxbuffer2 */ + rxbuffer2[rx_counter2++] = spi_i2s_data_receive(SPI0); + } + + /* clear the USART0 data register */ + usart_data_receive(USART0); + + while(data_read1--){ + /* wait until end of transmit */ + while(RESET == spi_i2s_flag_get(SPI0, SPI_FLAG_TBE)){ + } + /* write one byte in the SPI0 transmit data register */ + spi_i2s_data_transmit(SPI0, txbuffer2[tx_counter2++]); + + /* send a dummy byte to generate clock to slave */ + usart_data_transmit(USART0, DYMMY_BYTE); + /* wait until end of transmit */ + while(RESET == usart_flag_get(USART0, USART_FLAG_TC)){ + } + /* wait the byte is entirely received by USART0 */ + while(RESET == usart_flag_get(USART0, USART_FLAG_RBNE)){ + } + /* store the received byte in the rxbuffer1 */ + rxbuffer1[rx_counter1++] = usart_data_receive(USART0); + } + + /* check the received data with the send ones */ + state1 = memory_compare(txbuffer1, rxbuffer2, txbuffer_size1); + state2 = memory_compare(txbuffer2, rxbuffer1, txbuffer_size2); + + if(SUCCESS == state1){ + /* if the data transmitted from USART0 and received by SPI0 are the same */ + gd_eval_led_on(LED1); + gd_eval_led_on(LED3); + }else{ + /* if the data transmitted from USART0 and received by SPI0 are not the same */ + gd_eval_led_off(LED1); + gd_eval_led_off(LED3); + } + if(SUCCESS == state2){ + /* if the data transmitted from SPI0 and received by USART0 are the same */ + gd_eval_led_on(LED2); + gd_eval_led_on(LED4); + }else{ + /* if the data transmitted from SPI0 and received by USART0 are not the same */ + gd_eval_led_off(LED2); + gd_eval_led_off(LED4); + } + while(1){ + } +} +/*! + \brief configure USART + \param[in] none + \param[out] none + \retval none +*/ +void usart_config(void) +{ + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_USART0); + rcu_periph_clock_enable(RCU_AF); + + /* configure USART Tx as alternate function push-pull */ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9|GPIO_PIN_8); + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_10); + + /* configure USART synchronous mode */ + usart_synchronous_clock_enable(USART0); + usart_synchronous_clock_config(USART0, USART_CLEN_EN, USART_CPH_2CK, USART_CPL_HIGH); + + usart_baudrate_set(USART0, 115200); + /* configure USART transmitter */ + usart_transmit_config(USART0, USART_TRANSMIT_ENABLE); + /* configure USART receiver */ + usart_receive_config(USART0, USART_RECEIVE_ENABLE); + /* enable USART */ + usart_enable(USART0); +} + +/*! + \brief configure SPI + \param[in] none + \param[out] none + \retval none +*/ +void spi_config(void) +{ + spi_parameter_struct spi_init_parameter; + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_SPI0); + rcu_periph_clock_enable(RCU_AF); + + spi_i2s_deinit(SPI0); + + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_10MHZ, GPIO_PIN_5 | GPIO_PIN_6); + gpio_init(GPIOA, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_10MHZ, GPIO_PIN_7); + + /* configure SPI0 */ + spi_init_parameter.device_mode = SPI_SLAVE; + spi_init_parameter.trans_mode = SPI_TRANSMODE_FULLDUPLEX; + spi_init_parameter.frame_size = SPI_FRAMESIZE_8BIT; + spi_init_parameter.nss = SPI_NSS_SOFT; + spi_init_parameter.endian = SPI_ENDIAN_LSB; + spi_init_parameter.clock_polarity_phase = SPI_CK_PL_HIGH_PH_2EDGE; + spi_init_parameter.prescale = SPI_PSC_32; + spi_init(SPI0, &spi_init_parameter); + + /* SPI0 enable */ + spi_enable(SPI0); +} + +/*! + \brief initialize leds + \param[in] none + \param[out] none + \retval none +*/ +void led_init(void) +{ + gd_eval_led_init(LED1); + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); + +} + +/*! + \brief memory compare function + \param[in] src: source data + \param[in] dst: destination data + \param[in] length: the compare data length + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus memory_compare(uint8_t* src, uint8_t* dst, uint16_t length) +{ + while(length--){ + if(*src++ != *dst++){ + return ERROR; + } + } + return SUCCESS; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Synchronous/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Synchronous/readme.txt new file mode 100644 index 0000000..8cc35cb --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Synchronous/readme.txt @@ -0,0 +1,47 @@ +/*! + \file readme.txt + \brief USART synchronous + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it provides a basic +communication between USART0 (Synchronous mode) and SPI0. First, USART0 +transmit a series of data to SPI0, then SPI0 transmit a series of data +to USART0. Compare the transmitted data and the received data. If the +data transmitted from USART0 and received by SPI0 are the same, LED1 and +LED3 will on, otherwise off. If the data transmitted from SPI0 and +received by USART0 are the same, LED2 and LED4 will on, otherwise off. + + connect SPI0 SCK pin(PA5) TO USART0_CK pin(PA8) + connect SPI0 MISO pin(PA6) TO USART0_RX pin(PA10) + connect SPI0 MOSI pin(PA7) TO USART0_TX pin(PA9) + JP5 and JP6 must be fitted. + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/gd32vf103_it.c new file mode 100644 index 0000000..ded0b43 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/gd32vf103_it.c @@ -0,0 +1,67 @@ +/*! + \file gd32vf103_it.c + \brief interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_it.h" +#include "gd32vf103v_eval.h" + +extern uint8_t tx_size; +extern uint8_t rx_size; +extern __IO uint8_t txcount; +extern __IO uint16_t rxcount; +extern uint8_t rxbuffer[32]; +extern uint8_t txbuffer[]; + +/*! + \brief this function handles USART RBNE interrupt request and TBE interrupt request + \param[in] none + \param[out] none + \retval none +*/ +void USART0_IRQHandler(void) +{ + if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_RBNE)){ + /* receive data */ + rxbuffer[rxcount++] = usart_data_receive(USART0); + if(rxcount == rx_size){ + usart_interrupt_disable(USART0, USART_INT_RBNE); + } + } + if(RESET != usart_interrupt_flag_get(USART0, USART_INT_FLAG_TBE)){ + /* transmit data */ + usart_data_transmit(USART0, txbuffer[txcount++]); + if(txcount == tx_size){ + usart_interrupt_disable(USART0, USART_INT_TBE); + } + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/gd32vf103_it.h new file mode 100644 index 0000000..0bec519 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/gd32vf103_it.h @@ -0,0 +1,44 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* this function handles USART RBNE interrupt request and TBE interrupt request */ +void USART0_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/main.c new file mode 100644 index 0000000..3e3b758 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/main.c @@ -0,0 +1,79 @@ +/*! + \file main.c + \brief USART transmit and receive interrupt + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include +#include "gd32vf103v_eval.h" + +#define ARRAYNUM(arr_nanme) (uint32_t)(sizeof(arr_nanme) / sizeof(*(arr_nanme))) +#define TRANSMIT_SIZE (ARRAYNUM(txbuffer) - 1) + +uint8_t txbuffer[] = "\n\rUSART interrupt test\n\r"; +uint8_t rxbuffer[32]; +uint8_t tx_size = TRANSMIT_SIZE; +uint8_t rx_size = 32; +__IO uint8_t txcount = 0; +__IO uint16_t rxcount = 0; + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* USART interrupt configuration */ + eclic_global_interrupt_enable(); + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL3_PRIO1); + eclic_irq_enable(USART0_IRQn, 1, 0); + /* configure COM0 */ + gd_eval_com_init(EVAL_COM0); + /* enable USART TBE interrupt */ + usart_interrupt_enable(USART0, USART_INT_TBE); + + /* wait until USART send the transmitter_buffer */ + while(txcount < tx_size); + + while(RESET == usart_flag_get(USART0, USART_FLAG_TC)); + + usart_interrupt_enable(USART0, USART_INT_RBNE); + + /* wait until USART receive the receiver_buffer */ + while(rxcount < rx_size); + if(rxcount == rx_size) + printf("\n\rUSART receive successfully!\n\r"); + while(1); +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/readme.txt new file mode 100644 index 0000000..6c04532 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USART/Transmitter&receiver_interrupt/readme.txt @@ -0,0 +1,43 @@ +/*! + \file readme.txt + \brief description of the USART transmit and receive interrupt + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows how to use the USART +transmit and receive interrupts to communicate with the hyperterminal. + + Firstly, the USART sends the strings to the hyperterminal and still waits for +receiving data from the hyperterminal. Only the number of data you enter is equal +to or more than 32 bytes, USART will send strings: "USART receive successfully!" +(the reception is stopped when this maximum receive value is reached). + JP5 and JP6 must be fitted. + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Eclipse/usbd_audio/.cproject b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Eclipse/usbd_audio/.cproject new file mode 100644 index 0000000..5177991 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Eclipse/usbd_audio/.cproject @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Eclipse/usbd_audio/.project b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Eclipse/usbd_audio/.project new file mode 100644 index 0000000..7cf1add --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Eclipse/usbd_audio/.project @@ -0,0 +1,608 @@ + + + usbd_audio + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + Examples + 2 + virtual:/virtual + + + Firmware + 2 + virtual:/virtual + + + Utilities + 2 + virtual:/virtual + + + Examples/USBFS + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver + 2 + virtual:/virtual + + + Firmware/RISCV + 2 + virtual:/virtual + + + Utilities/gd32vf103v_eval.c + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.c + + + Utilities/gd32vf103v_eval.h + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.h + + + Examples/USBFS/USB_Device + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Source + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/gd32vf103.h + + + Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + + + Firmware/GD32VF103_usbfs_driver/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver/Source + 2 + virtual:/virtual + + + Firmware/RISCV/drivers + 2 + virtual:/virtual + + + Firmware/RISCV/env_Eclipse + 2 + virtual:/virtual + + + Firmware/RISCV/stubs + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/Audio + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h + + + Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c + + + Firmware/RISCV/drivers/n200_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_eclic.h + + + Firmware/RISCV/drivers/n200_func.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.c + + + Firmware/RISCV/drivers/n200_func.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.h + + + Firmware/RISCV/drivers/n200_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_timer.h + + + Firmware/RISCV/drivers/riscv_bits.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_bits.h + + + Firmware/RISCV/drivers/riscv_const.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_const.h + + + Firmware/RISCV/drivers/riscv_encoding.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_encoding.h + + + Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + + + Firmware/RISCV/env_Eclipse/entry.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/entry.S + + + Firmware/RISCV/env_Eclipse/handlers.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/handlers.c + + + Firmware/RISCV/env_Eclipse/init.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/init.c + + + Firmware/RISCV/env_Eclipse/start.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/start.S + + + Firmware/RISCV/env_Eclipse/your_printf.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/your_printf.c + + + Firmware/RISCV/stubs/_exit.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/_exit.c + + + Firmware/RISCV/stubs/close.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/close.c + + + Firmware/RISCV/stubs/fstat.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/fstat.c + + + Firmware/RISCV/stubs/isatty.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/isatty.c + + + Firmware/RISCV/stubs/lseek.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/lseek.c + + + Firmware/RISCV/stubs/read.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/read.c + + + Firmware/RISCV/stubs/sbrk.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/sbrk.c + + + Firmware/RISCV/stubs/stub.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/stub.h + + + Firmware/RISCV/stubs/write.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write.c + + + Firmware/RISCV/stubs/write_hex.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write_hex.c + + + Examples/USBFS/USB_Device/Audio/Include + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/Audio/Source + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/Audio/Include/audio_core.h + 1 + PARENT-2-PROJECT_LOC/Include/audio_core.h + + + Examples/USBFS/USB_Device/Audio/Include/gd32vf103_audio_codec.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_audio_codec.h + + + Examples/USBFS/USB_Device/Audio/Include/gd32vf103_it.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_it.h + + + Examples/USBFS/USB_Device/Audio/Include/gd32vf103_libopt.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_libopt.h + + + Examples/USBFS/USB_Device/Audio/Include/usb_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usb_conf.h + + + Examples/USBFS/USB_Device/Audio/Include/usbd_audio_out_if.h + 1 + PARENT-2-PROJECT_LOC/Include/usbd_audio_out_if.h + + + Examples/USBFS/USB_Device/Audio/Include/usbd_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usbd_conf.h + + + Examples/USBFS/USB_Device/Audio/Source/app.c + 1 + PARENT-2-PROJECT_LOC/Source/app.c + + + Examples/USBFS/USB_Device/Audio/Source/audio_core.c + 1 + PARENT-2-PROJECT_LOC/Source/audio_core.c + + + Examples/USBFS/USB_Device/Audio/Source/gd32vf103_audio_codec.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_audio_codec.c + + + Examples/USBFS/USB_Device/Audio/Source/gd32vf103_hw.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_hw.c + + + Examples/USBFS/USB_Device/Audio/Source/gd32vf103_it.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_it.c + + + Examples/USBFS/USB_Device/Audio/Source/system_gd32vf103.c + 1 + PARENT-2-PROJECT_LOC/Source/system_gd32vf103.c + + + Examples/USBFS/USB_Device/Audio/Source/usbd_audio_out_if.c + 1 + PARENT-2-PROJECT_LOC/Source/usbd_audio_out_if.c + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Eclipse/usbd_audio/.settings/language.settings.xml b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Eclipse/usbd_audio/.settings/language.settings.xml new file mode 100644 index 0000000..69533d1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Eclipse/usbd_audio/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/audio_core.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/audio_core.h new file mode 100644 index 0000000..74d2a3b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/audio_core.h @@ -0,0 +1,262 @@ +/*! + \file audio_core.h + \brief the header file of USB audio device class core functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef AUDIO_CORE_H +#define AUDIO_CORE_H + +#include "usbd_enum.h" +#include "usb_ch9_std.h" +#include "usbd_transc.h" + +#define USB_SPEAKER_CONFIG_DESC_SIZE 109 +#define FORMAT_24BIT(X) (uint8_t)(X);(uint8_t)(X >> 8);(uint8_t)(X >> 16) + +/* AudioFreq * DataSize (2 bytes) * NumChannels (Stereo: 2) */ +#define AUDIO_OUT_PACKET (uint32_t)(((USBD_AUDIO_FREQ * 2 * 2) / 1000)) + +/* Number of sub-packets in the audio transfer buffer. You can modify this value but always make sure + that it is an even number and higher than 3 */ +#define OUT_PACKET_NUM 4 + +/* Total size of the audio transfer buffer */ +#define TOTAL_OUT_BUF_SIZE ((uint32_t)(AUDIO_OUT_PACKET * OUT_PACKET_NUM)) + +#define AUDIO_CONFIG_DESC_SIZE 109 +#define AUDIO_INTERFACE_DESC_SIZE 9 +#define USB_AUDIO_DESC_SIZ 0x09 +#define AUDIO_STANDARD_ENDPOINT_DESC_SIZE 0x09 +#define AUDIO_STREAMING_ENDPOINT_DESC_SIZE 0x07 + +#define AUDIO_DESCRIPTOR_TYPE 0x21 +#define USB_DEVICE_CLASS_AUDIO 0x01 +#define AUDIO_SUBCLASS_AUDIOCONTROL 0x01 +#define AUDIO_SUBCLASS_AUDIOSTREAMING 0x02 +#define AUDIO_PROTOCOL_UNDEFINED 0x00 +#define AUDIO_STREAMING_GENERAL 0x01 +#define AUDIO_STREAMING_FORMAT_TYPE 0x02 + +/* Audio Descriptor Types */ +#define AUDIO_INTERFACE_DESCRIPTOR_TYPE 0x24 +#define AUDIO_ENDPOINT_DESCRIPTOR_TYPE 0x25 + +/* Audio Control Interface Descriptor Subtypes */ +#define AUDIO_CONTROL_HEADER 0x01 +#define AUDIO_CONTROL_INPUT_TERMINAL 0x02 +#define AUDIO_CONTROL_OUTPUT_TERMINAL 0x03 +#define AUDIO_CONTROL_FEATURE_UNIT 0x06 + +#define AUDIO_INPUT_TERMINAL_DESC_SIZE 0x0C +#define AUDIO_OUTPUT_TERMINAL_DESC_SIZE 0x09 +#define AUDIO_STREAMING_INTERFACE_DESC_SIZE 0x07 + +#define AUDIO_CONTROL_MUTE 0x0001 + +#define AUDIO_FORMAT_TYPE_I 0x01 +#define AUDIO_FORMAT_TYPE_III 0x03 + +#define USB_ENDPOINT_TYPE_ISOCHRONOUS 0x01 +#define AUDIO_ENDPOINT_GENERAL 0x01 + +#define AUDIO_REQ_GET_CUR 0x81 +#define AUDIO_REQ_SET_CUR 0x01 +#define NO_CMD 0xFF + +#define AUDIO_OUT_STREAMING_CTRL 0x02 + +#define DEVICE_ID (0x40022100) + +#define PACKET_SIZE(freq) ((freq * 2) * 2 / 1000) + +#define AUDIO_PACKET_SIZE(frq) (uint8_t)(PACKET_SIZE(frq) & 0xFF), \ + (uint8_t)((PACKET_SIZE(frq) >> 8) & 0xFF) + +#define SAMPLE_FREQ(frq) (uint8_t)(frq), (uint8_t)((frq >> 8)), \ + (uint8_t)((frq >> 16)) + + +#pragma pack(1) + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint8_t bDescriptorSubtype; /*!< HEADER descriptor subtype */ + uint16_t bcdADC; /*!< Audio 1.0 */ + uint16_t wTotalLength; /*!< Total number of bytes returned */ + uint8_t bInCollection; /*!< One OUT AudioStreaming interface in the Collection */ + uint8_t baInterfaceNr; /*!< Interface number of the OUT AudioStreaming interface in the Collection */ +} usb_descriptor_AC_interface_struct; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint8_t bDescriptorSubtype; /*!< AS_GENERAL subtype */ + uint8_t bTerminalLink; /*!< Terminal ID of the Input Terminal, associated with this inetrface */ + uint8_t bDelay; /*!< Total interface delay, expressed in frames */ + uint16_t wFormatTag; /*!< PCM Format */ +} usb_descriptor_AS_interface_struct; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint8_t bDescriptorSubtype; /*!< INPUT_TERMINAL descriptor subtype */ + uint8_t bTerminalID; /*!< ID of this Input Terminal */ + uint16_t wTerminalType; /*!< Terminal Type */ + uint8_t bAssocTerminal; /*!< No association */ + uint8_t bNrChannels; /*!< Signal path */ + uint16_t wChannelConfig; /*!< The Front channel */ + uint8_t iChannelNames; /*!< Unused */ + uint8_t iTerminal; /*!< Index of a string descriptor,describing the Input Terminal */ +} usb_descriptor_input_terminal_struct; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint8_t bDescriptorSubtype; /*!< OUT_TERMINAL descriptor subtype */ + uint8_t bTerminalID; /*!< ID of this Input Terminal */ + uint16_t wTerminalType; /*!< Headphones Terminal Type */ + uint8_t bAssocTerminal; /*!< No association */ + uint8_t bSourceID; /*!< From Feature Unit ID2 */ + uint8_t iTerminal; /*!< Index of a string descriptor,describing the Output Terminal */ +} usb_descriptor_output_terminal_struct; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint8_t bDescriptorSubtype; /*!< FEATURE_UNIT descriptor subtype */ + uint8_t bUnitID; /*!< ID of this Feature Uint */ + uint8_t bSourceID; /*!< The ID of the Entity to which this Feature Unit is connected */ + uint8_t bControlSize; /*!< 2bytes for each element of the bmaControls array */ + uint8_t bmaControls0; /*!< Mute Control on Master Channel */ + uint8_t bmaControls1; /*!< Volume Control on Center Front channel */ + uint8_t iFeature; /*!< Index of a string descriptor, describing the Feature Unit */ +} usb_descriptor_mono_feature_unit_struct; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint8_t bDescriptorSubtype; /*!< FEATURE_UNIT descriptor subtype */ + uint8_t bUnitID; /*!< ID of this Feature Uint */ + uint8_t bSourceID; /*!< The ID of the Entity to which this Feature Unit is connected */ + uint8_t bControlSize; /*!< 2bytes for each element of the bmaControls array */ + uint16_t bmaControls0; /*!< Mute Control on Master Channel */ + uint16_t bmaControls1; /*!< Volume Control on Left Front channel */ + uint16_t bmaControls2; /*!< Volume Control on Right Front channel */ + uint8_t iFeature; /*!< Index of a string descriptor, describing the Feature Unit */ +} usb_descriptor_stereo_feature_unit_struct; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint8_t bDescriptorSubtype; /*!< FORMAT_TYPE subtype */ + uint8_t bFormatType; /*!< The index of FORMAT_TYPE */ + uint8_t bNrChannels; /*!< The number of channel */ + uint8_t bSubFrameSize; /*!< Two bytes per audio subframe */ + uint8_t bBitResolution; /*!< The bits number per sample */ + uint8_t bSamFreqType; /*!< One frequency supported */ + uint8_t bSamFreq[3]; /*!< The frequency of sampling */ +} usb_descriptor_format_type_struct; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint8_t bEndpointAddress; /*!< logical address of the endpoint */ + uint8_t bmAttributes; /*!< endpoint attributes */ + uint16_t wMaxPacketSize; /*!< size of the endpoint bank, in bytes */ + uint8_t bInterval; /*!< polling interval in milliseconds for the endpoint if it is an INTERRUPT or ISOCHRONOUS type */ + uint8_t bRefresh; /*!< Unused */ + uint8_t bSynchAddress; /*!< Unused */ +} usb_descriptor_std_endpoint_struct; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint8_t bDescriptorSubtype; /*!< AS_ENDPOINT subtype */ + uint8_t bmAttributes; /*!< endpoint attributes */ + uint8_t bLockDelayUnits; /*!< Unused */ + uint16_t wLockDelay; /*!< Unused */ +} usb_descriptor_AS_endpoint_struct; + +#pragma pack() + +/* USB configuration descriptor struct */ +typedef struct +{ + usb_desc_config Config; + usb_desc_itf Speaker_Std_Interface; + usb_descriptor_AC_interface_struct Speaker_AC_Interface; + usb_descriptor_input_terminal_struct Speaker_IN_Terminal; + usb_descriptor_mono_feature_unit_struct Speaker_Feature_Unit; + usb_descriptor_output_terminal_struct Speaker_OUT_Terminal; + usb_desc_itf Speaker_Std_AS_Interface_ZeroBand; + usb_desc_itf Speaker_Std_AS_Interface_Opera; + usb_descriptor_AS_interface_struct Speaker_AS_Interface; + usb_descriptor_format_type_struct Speaker_Format_TypeI; + usb_descriptor_std_endpoint_struct Speaker_Std_Endpoint; + usb_descriptor_AS_endpoint_struct Speaker_AS_Endpoint; +} usb_descriptor_configuration_set_struct; + +/* AUDIO_FOPS_TypeDef definitions */ +typedef struct _Audio_Fops +{ + uint8_t (*Init) (uint32_t AudioFreq, uint32_t Volume, uint32_t options); + uint8_t (*DeInit) (uint32_t options); + uint8_t (*AudioCmd) (uint8_t* pbuf, uint32_t size, uint8_t cmd); + uint8_t (*VolumeCtl) (uint8_t vol); + uint8_t (*MuteCtl) (uint8_t cmd); + uint8_t (*PeriodicTC) (uint8_t cmd); + uint8_t (*GetState) (void); +}AUDIO_FOPS_TypeDef; + +extern usb_class_core usbd_audio_cb; +extern uint8_t usbd_serial_string[USB_SERIAL_STRING_SIZE]; +extern void* const usbd_strings[USB_STRING_COUNT]; +extern const usb_desc_dev device_descripter; +extern const usb_descriptor_configuration_set_struct configuration_descriptor; + +uint8_t audio_init (usb_dev *pudev, uint8_t config_index); +uint8_t audio_deinit (usb_dev *pudev, uint8_t config_index); +uint8_t audio_req_handler (usb_dev *pudev, usb_req *req); +uint8_t audio_data_in_handler (usb_dev *pudev, uint8_t ep_id); +uint8_t audio_data_out_handler (usb_dev *pudev, uint8_t ep_id); + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/gd32vf103_audio_codec.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/gd32vf103_audio_codec.h new file mode 100644 index 0000000..251d08f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/gd32vf103_audio_codec.h @@ -0,0 +1,215 @@ +/*! + \file gd32vf103_audio_codec.h + \brief the audio codec low layer driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __GD32VF103_AUDIO_CODEC_H +#define __GD32VF103_AUDIO_CODEC_H + +#include "gd32vf103.h" + +/* CONFIGURATION: Audio Codec Driver Configuration parameters */ +//#define AUDIO_USE_MACROS + +/* Audio Transfer mode (DMA, Interrupt or Polling) */ +#define AUDIO_MAL_MODE_NORMAL /* Uncomment this line to enable the audio + Transfer using DMA */ +/* #define AUDIO_MAL_MODE_CIRCULAR */ /* Uncomment this line to enable the audio + Transfer using DMA */ + +/* For the DMA modes select the interrupt that will be used */ +/* #define AUDIO_MAL_DMA_IT_TC_EN */ /* Uncomment this line to enable DMA Transfer Complete interrupt */ +/* #define AUDIO_MAL_DMA_IT_HT_EN */ /* Uncomment this line to enable DMA Half Transfer Complete interrupt */ +/* #define AUDIO_MAL_DMA_IT_TE_EN */ /* Uncomment this line to enable DMA Transfer Error interrupt */ + +/* #define USE_DMA_PAUSE_FEATURE *//* Uncomment this line to enable the use of DMA Pause Feature + When this define is enabled, the Pause function will + just pause/resume the DMA without need to reinitialize the + DMA structure. In this case, the buffer pointer should remain + available after resume. */ + +/* Select the interrupt preemption priority and subpriority for the DMA interrupt */ +#define EVAL_AUDIO_IRQ_PREPRIO 0 /* Select the preemption priority level(0 is the highest) */ +#define EVAL_AUDIO_IRQ_SUBRIO 0 /* Select the sub-priority level (0 is the highest) */ + +/* Uncomment the following line to use the default Codec_TIMEOUT_UserCallback() + function implemented in gd3210c_audio_codec.c file. + Codec_TIMEOUT_UserCallback() function is called whenever a timeout condition + occurs during communication (waiting on an event that doesn't occur, bus + errors, busy devices ...). */ +/* #define USE_DEFAULT_TIMEOUT_CALLBACK */ + + +/* OPTIONAL Configuration defines parameters */ + +/* Uncomment defines below to select standard for audio communication between Codec and I2S peripheral */ +/* #define I2S_STANDARD_PHILLIPS */ +/* #define I2S_STANDARD_MSB */ +#define I2S_STANDARD_LSB + +/* Uncomment the defines below to select if the Master clock mode should be enabled or not */ +#define CODEC_MCLK_ENABLED +/* #deine CODEC_MCLK_DISABLED */ + +/* Uncomment this line to enable verifying data sent to codec after each write operation */ +/* #define VERIFY_WRITTENDATA */ + +/* Hardware Configuration defines parameters */ + +/* I2S peripheral configuration defines */ +#define CODEC_I2S SPI1 +#define CODEC_I2S_CLK RCU_SPI1 +#define CODEC_I2S_ADDRESS 0x4000380C +#define CODEC_I2S_IRQ SPI1_IRQn +#define CODEC_I2S_GPIO1_CLOCK RCU_GPIOB +#define CODEC_I2S_GPIO2_CLOCK RCU_GPIOC +#define CODEC_I2S_WS_PIN GPIO_PIN_12 +#define CODEC_I2S_SCK_PIN GPIO_PIN_13 +#define CODEC_I2S_SD_PIN GPIO_PIN_15 +#define CODEC_I2S_MCK_PIN GPIO_PIN_6 +#define CODEC_I2S_GPIO GPIOB +#define CODEC_I2S_MCK_GPIO GPIOC + +/* I2S DMA Stream definitions */ +#define AUDIO_MAL_DMA_CLOCK RCU_DMA0 +#define AUDIO_MAL_DMA_CHANNEL DMA_CH4 +#define AUDIO_MAL_DMA_IRQ DMA0_Channel4_IRQn +#define AUDIO_MAL_DMA_FLAG_ALL DMA_FLAG_G +#define AUDIO_MAL_DMA_PERIPH_DATA_SIZE DMA_PERIPHERALDATASIZE_HALFWORD +#define AUDIO_MAL_DMA_MEM_DATA_SIZE DMA_MEMORYDATASIZE_HALFWORD +#define DMA_MAX_SZE 0xFFFF +#define AUDIO_MAL_DMA DMA0 + +#define Audio_MAL_IRQHandler DMA0_Channel4_IRQHandler + +/* SPI peripheral configuration defines (control interface of the audio codec) */ +#define CODEC_SPI SPI0 +#define CODEC_SPI_CLK RCU_SPI0 +#define CODEC_SPI_GPIO_CLOCK RCU_GPIOA +#define CODEC_SPI_GPIO_AF GPIO_AF +#define CODEC_SPI_GPIO GPIOA +#define CODEC_SPI_SCL_PIN GPIO_PIN_5 +#define CODEC_SPI_SDA_PIN GPIO_PIN_7 +#define CODEC_SPI_SEL_PIN GPIO_PIN_4 + +/* Maximum Timeout values for flags and events waiting loops. These timeouts are + not based on accurate values, they just guarantee that the application will + not remain stuck if the I2C communication is corrupted. + You may modify these timeout values depending on CPU frequency and application + conditions (interrupts routines ...) */ +#define CODEC_FLAG_TIMEOUT ((uint32_t)0x1000) +#define CODEC_LONG_TIMEOUT ((uint32_t)(300 * CODEC_FLAG_TIMEOUT)) + +/* Audio Codec User defines */ + +/* Codec output DEVICE */ +#define OUTPUT_DEVICE_SPEAKER 1 +#define OUTPUT_DEVICE_HEADPHONE 2 +#define OUTPUT_DEVICE_BOTH 3 +#define OUTPUT_DEVICE_AUTO 4 + +/* Volume Levels values */ +#define DEFAULT_VOLMIN 0x00 +#define DEFAULT_VOLMAX 0xFF +#define DEFAULT_VOLSTEP 0x04 + +#define AUDIO_PAUSE 0 +#define AUDIO_RESUME 1 + +/* Codec POWER DOWN modes */ +#define CODEC_PDWN_HW 1 +#define CODEC_PDWN_SW 2 + +/* MUTE commands */ +#define AUDIO_MUTE_ON 1 +#define AUDIO_MUTE_OFF 0 + +#define VOLUME_CONVERT(x) ((Volume > 100)? 100:((uint8_t)((Volume * 255) / 100))) +#define DMA_MAX(x) (((x) <= DMA_MAX_SZE)? (x):DMA_MAX_SZE) + + +/* Generic functions */ +uint32_t EVAL_AUDIO_Init (uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq); +uint32_t EVAL_AUDIO_DeInit (void); +uint32_t EVAL_AUDIO_Play (uint16_t* pBuffer, uint32_t Size); +uint32_t EVAL_AUDIO_PauseResume (uint32_t Cmd, uint32_t Addr, uint32_t Size); +uint32_t EVAL_AUDIO_Stop (uint32_t CodecPowerDown_Mode); +uint32_t EVAL_AUDIO_VolumeCtl (uint8_t Volume); +uint32_t EVAL_AUDIO_Mute (uint32_t Command); + +/* Audio Codec functions */ + +/* High Layer codec functions */ +uint32_t Codec_Init (uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq); +uint32_t Codec_DeInit (void); +uint32_t Codec_Play (void); +uint32_t Codec_PauseResume (uint32_t Cmd); +uint32_t Codec_Stop (uint32_t Cmd); +uint32_t Codec_VolumeCtrl (uint8_t Volume); +uint32_t Codec_Mute (uint32_t Cmd); +uint32_t Codec_SwitchOutput (uint8_t Output); + +/* MAL (Media Access Layer) functions */ +void Audio_MAL_Init (void); +void Audio_MAL_DeInit (void); +void Audio_MAL_Play (uint32_t Addr, uint32_t Size); +void Audio_MAL_PauseResume (uint32_t Cmd, uint32_t Addr, uint32_t Size); +void Audio_MAL_Stop (void); + +/* User Callbacks: user has to implement these functions in his code if they are needed. */ + +/* This function is called when the requested data has been completely transferred. + In Normal mode (when the define AUDIO_MAL_MODE_NORMAL is enabled) this function + is called at the end of the whole audio file. + In circular mode (when the define AUDIO_MAL_MODE_CIRCULAR is enabled) this + function is called at the end of the current buffer transmission. */ +void EVAL_AUDIO_TransferComplete_CallBack(uint32_t pBuffer, uint32_t Size); + +/* This function is called when half of the requested buffer has been transferred + This callback is useful in Circular mode only (when AUDIO_MAL_MODE_CIRCULAR + define is enabled)*/ +void EVAL_AUDIO_HalfTransfer_CallBack(uint32_t pBuffer, uint32_t Size); + +/* This function is called when an Interrupt due to transfer error on or peripheral + error occurs. */ +void EVAL_AUDIO_Error_CallBack(void* pData); + +/* Codec_TIMEOUT_UserCallback() function is called whenever a timeout condition + occurs during communication (waiting on an event that doesn't occur, bus + errors, busy devices ...) on the Codec control interface (I2C). + You can use the default timeout callback implementation by uncommenting the + define USE_DEFAULT_TIMEOUT_CALLBACK in audio_codec.h file. + Typically the user implementation of this callback should reset I2C peripheral + and re-initialize communication or in worst case reset all the application. */ +uint32_t Codec_TIMEOUT_UserCallback(void); + +#endif /* __GD32VF103_USB_AUDIOCODEC_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/gd32vf103_it.h new file mode 100644 index 0000000..cc50acf --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/gd32vf103_it.h @@ -0,0 +1,54 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_core.h" + +/* function declarations */ +/* this function handles USB wakeup interrupt handler */ +void USBFS_WKUP_IRQHandler(void); +/* this function handles USBFS IRQ Handler */ +void USBFS_IRQHandler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/gd32vf103_libopt.h new file mode 100644 index 0000000..60680cf --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/usb_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/usb_conf.h new file mode 100644 index 0000000..b7e6ac6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/usb_conf.h @@ -0,0 +1,121 @@ +/*! + \file usb_ch9_std.h + \brief USBFS driver basic configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_CONF_H +#define __USB_CONF_H + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#include + +#ifdef USE_USB_FS + #define USB_FS_CORE +#endif + +#ifdef USE_USB_HS + #define USB_HS_CORE +#endif + +#ifdef USB_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 64 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 0 + #define TX3_FIFO_FS_SIZE 0 +#endif /* USB_FS_CORE */ + +#ifdef USB_HS_CORE + #define RX_FIFO_HS_SIZE 512 + #define TX0_FIFO_HS_SIZE 128 + #define TX1_FIFO_HS_SIZE 372 + #define TX2_FIFO_HS_SIZE 0 + #define TX3_FIFO_HS_SIZE 0 + #define TX4_FIFO_HS_SIZE 0 + #define TX5_FIFO_HS_SIZE 0 + + #ifdef USE_ULPI_PHY + #define USB_OTG_ULPI_PHY_ENABLED + #endif + + #ifdef USE_EMBEDDED_PHY + #define USB_OTG_EMBEDDED_PHY_ENABLED + #endif + + #define USB_OTG_HS_INTERNAL_DMA_ENABLED + #define USB_OTG_HS_DEDICATED_EP1_ENABLED +#endif /* USB_HS_CORE */ + +#define USB_SOF_OUTPUT 1 +#define USB_LOW_POWER 1 + +//#define VBUS_SENSING_ENABLED + +//#define USE_HOST_MODE +#define USE_DEVICE_MODE +//#define USE_OTG_MODE + +#ifndef USB_FS_CORE + #ifndef USB_HS_CORE + #error "USB_HS_CORE or USB_FS_CORE should be defined" + #endif +#endif + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_HS + #ifndef USE_USB_FS + #error "USE_USB_HS or USE_USB_FS should be defined" + #endif +#endif + +/****************** C Compilers dependant keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned(4))) + #define __ALIGN_BEGIN + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + + +#endif /* __USB_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/usbd_audio_out_if.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/usbd_audio_out_if.h new file mode 100644 index 0000000..8fd93b2 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/usbd_audio_out_if.h @@ -0,0 +1,93 @@ +/*! + \file usbd_audio_out_if.h + \brief header file for the usbd_audio_out_if.c file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* Define to prevent recursive inclusion -------------------------------------*/ +#ifndef __GD32VF103_USBD_AUDIO_OUT_IF_H +#define __GD32VF103_USBD_AUDIO_OUT_IF_H + +/* Includes ------------------------------------------------------------------*/ +#include "gd32vf103_audio_codec.h" +#include "audio_core.h" + +/** @addtogroup GD32VF103_Firmware + * @{ + */ + +/** @addtogroup USB_OTG_FS + * @{ + */ + +/** @addtogroup USB_OTG_FS_Device_Class_Library + * @{ + */ + +/** @defgroup USBD_AUDIO + * @{ + */ + +/** @defgroup USBD_AUDIO_Core_Exported_Defines + * @{ + */ + +/* Audio Commands enmueration */ +typedef enum +{ + AUDIO_CMD_PLAY = 1, + AUDIO_CMD_PAUSE, + AUDIO_CMD_STOP, +}AUDIO_CMD_TypeDef; + +/* Mute commands */ +#define AUDIO_MUTE 0x01 +#define AUDIO_UNMUTE 0x00 + +/* Functions return value */ +#define AUDIO_OK 0x00 +#define AUDIO_FAIL 0xFF + +/* Audio Machine States */ +#define AUDIO_STATE_INACTIVE 0x00 +#define AUDIO_STATE_ACTIVE 0x01 +#define AUDIO_STATE_PLAYING 0x02 +#define AUDIO_STATE_PAUSED 0x03 +#define AUDIO_STATE_STOPPED 0x04 +#define AUDIO_STATE_ERROR 0x05 + + +/** @defgroup USBD_AUDIO_CORE_Exported_Variables + * @{ + */ +extern AUDIO_FOPS_TypeDef AUDIO_OUT_fops; + +#endif /* __GD32VF103_USBD_AUDIO_OUT_IF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/usbd_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/usbd_conf.h new file mode 100644 index 0000000..f7ff9b9 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Include/usbd_conf.h @@ -0,0 +1,74 @@ +/*! + \file usbd_conf.h + \brief the header file of USBHS device-mode configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBD_CONF_H +#define USBD_CONF_H + +#include "usb_conf.h" + +#define USBD_CFG_MAX_NUM 1 +#define USBD_ITF_MAX_NUM 1 +#define USB_STR_DESC_MAX_SIZE 64 + +/* USB feature -- Self Powered */ +//#define USBD_SELF_POWERED + +/* USB user string supported */ +/* #define USB_SUPPORT_USER_STRING_DESC */ + +//#define USBD_DYNAMIC_DESCRIPTOR_CHANGE_ENABLED + + #define USBD_AUDIO_FREQ 16000 /* Audio frequency in Hz for GD32VF103 devices family when 25MHz HSE value + is used. */ + +/* Maximum number of supported media (Flash) */ +#define MAX_USED_MEMORY_MEDIA 1 + +#define USB_STRING_COUNT 6 + +/* Audio endpoint define */ +#define AUDIO_TOTAL_IF_NUM 0x02 +#define AUDIO_OUT_EP EP1_OUT +#define AUDIO_IN_EP EP2_IN + +#define USB_SERIAL_STRING_SIZE 0x06 +#define DEVICE_ID (0x40022100) + +#define DEFAULT_VOLUME 65 /* Default volume in % (Mute=0%, Max = 100%) in Logarithmic values. + To get accurate volume variations, it is possible to use a logarithmic + coversion table to convert from percentage to logarithmic law. + In order to keep this example code simple, this conversion is not used.*/ + + +#endif /* USBD_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/app.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/app.c new file mode 100644 index 0000000..cb7fad5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/app.c @@ -0,0 +1,82 @@ +/*! + \file app.c + \brief USB main routine for Audio device + + \version 2019-6-5, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "audio_core.h" +#include +#include +#include + +usb_core_driver USB_OTG_dev = +{ + .dev = { + .desc = { + .dev_desc = (uint8_t *)&device_descripter, + .config_desc = (uint8_t *)&configuration_descriptor, + .strings = usbd_strings, + } + } +}; + +/*! + \brief main routine will construct a USB keyboard + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + eclic_global_interrupt_enable(); + + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); + + /* configure USB clock */ + usb_rcu_config(); + + /* timer nvic initialization */ + usb_timer_init(); + + /* USB device stack configure */ + usbd_init (&USB_OTG_dev, USB_CORE_ENUM_FS, &usbd_audio_cb); + + /* USB interrupt configure */ + usb_intr_config(); + + /* check if USB device is enumerated successfully */ + while (USB_OTG_dev.dev.cur_status != USBD_CONFIGURED) { + } + + while (1) { + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/audio_core.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/audio_core.c new file mode 100644 index 0000000..7e41311 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/audio_core.c @@ -0,0 +1,621 @@ +/*! + \file audio_core.c + \brief USB audio device class core functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_audio_out_if.h" +#include "audio_core.h" + +#define USBD_VID 0x0483 +#define USBD_PID 0x5730 + +/* Main Buffer for Audio Data Out transfers and its relative pointers */ +uint8_t IsocOutBuff [TOTAL_OUT_BUF_SIZE * 2]; +uint8_t* IsocOutWrPtr = IsocOutBuff; +uint8_t* IsocOutRdPtr = IsocOutBuff; + +/* AUDIO Requests management functions */ +static void AUDIO_Req_GetCurrent (usb_dev *pudev, usb_req *req); +static void AUDIO_Req_SetCurrent (usb_dev *pudev, usb_req *req); +static uint8_t USBD_AUDIO_DataOut (usb_dev *pudev, uint8_t EpID); +static uint8_t USBD_AUDIO_EP0_RxReady (usb_dev *pudev); +static uint8_t USBD_AUDIO_SOF (usb_dev *pudev); +static void USBD_AUDIO_SetInterface(usb_dev *pudev, usb_req *req); +static void USBD_AUDIO_GetInterface(usb_dev *pudev, usb_req *req); + +/* Main Buffer for Audio Control Rrequests transfers and its relative variables */ +uint8_t AudioCtl[64]; +uint8_t AudioCtlCmd = 0; +uint8_t AudioCtlUnit = 0; +uint32_t AudioCtlLen = 0; + +static uint32_t PlayFlag = 0; + +static __IO uint32_t USBD_AUDIO_AltSet = 0; + +/* note:it should use the c99 standard when compiling the below codes */ +/* USB standard device descriptor */ +const usb_desc_dev device_descripter = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200, + .bDeviceClass = 0x00, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +const usb_descriptor_configuration_set_struct configuration_descriptor = +{ + .Config = + { + .header = + { + .bLength = USB_CFG_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_SPEAKER_CONFIG_DESC_SIZE, + .bNumInterfaces = 0x02, + .bConfigurationValue = 0x01, + .iConfiguration = 0x00, + .bmAttributes = 0xC0, + .bMaxPower = 0x32 + }, + + .Speaker_Std_Interface = + { + .header = + { + .bLength = USB_ITF_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x00, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x01, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00 + }, + + .Speaker_AC_Interface = + { + .header = + { + .bLength = sizeof(usb_descriptor_AC_interface_struct), + .bDescriptorType = 0x24 + }, + .bDescriptorSubtype = 0x01, + .bcdADC = 0x0100, + .wTotalLength = 0x0027, + .bInCollection = 0x01, + .baInterfaceNr = 0x01 + }, + + .Speaker_IN_Terminal = + { + .header = + { + .bLength = sizeof(usb_descriptor_input_terminal_struct), + .bDescriptorType = 0x24 + }, + .bDescriptorSubtype = 0x02, + .bTerminalID = 0x01, + .wTerminalType = 0x0101, + .bAssocTerminal = 0x00, + .bNrChannels = 0x01, + .wChannelConfig = 0x0000, + .iChannelNames = 0x00, + .iTerminal = 0x00 + }, + + .Speaker_Feature_Unit = + { + .header = + { + .bLength = sizeof(usb_descriptor_mono_feature_unit_struct), + .bDescriptorType = 0x24 + }, + .bDescriptorSubtype = AUDIO_CONTROL_FEATURE_UNIT, + .bUnitID = AUDIO_OUT_STREAMING_CTRL, + .bSourceID = 0x01, + .bControlSize = 0x01, + .bmaControls0 = AUDIO_CONTROL_MUTE, + .bmaControls1 = 0x00, + .iFeature = 0x00 + }, + + .Speaker_OUT_Terminal = + { + .header = + { + .bLength = sizeof(usb_descriptor_output_terminal_struct), + .bDescriptorType = AUDIO_INTERFACE_DESCRIPTOR_TYPE + }, + .bDescriptorSubtype = AUDIO_CONTROL_OUTPUT_TERMINAL, + .bTerminalID = 0x03, + .wTerminalType = 0x0301, + .bAssocTerminal = 0x00, + .bSourceID = 0x02, + .iTerminal = 0x00 + }, + + .Speaker_Std_AS_Interface_ZeroBand = + { + .header = + { + .bLength = USB_ITF_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x01, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x00, + .bInterfaceClass = USB_DEVICE_CLASS_AUDIO, + .bInterfaceSubClass = AUDIO_SUBCLASS_AUDIOSTREAMING, + .bInterfaceProtocol = AUDIO_PROTOCOL_UNDEFINED, + .iInterface = 0x00 + }, + + .Speaker_Std_AS_Interface_Opera = + { + .header = + { + .bLength = USB_ITF_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x01, + .bAlternateSetting = 0x01, + .bNumEndpoints = 0x01, + .bInterfaceClass = USB_DEVICE_CLASS_AUDIO, + .bInterfaceSubClass = AUDIO_SUBCLASS_AUDIOSTREAMING, + .bInterfaceProtocol = AUDIO_PROTOCOL_UNDEFINED, + .iInterface = 0x00 + }, + + .Speaker_AS_Interface = + { + .header = + { + .bLength = sizeof(usb_descriptor_AS_interface_struct), + .bDescriptorType = AUDIO_INTERFACE_DESCRIPTOR_TYPE + }, + .bDescriptorSubtype = AUDIO_STREAMING_GENERAL, + .bTerminalLink = 0x01, + .bDelay = 0x01, + .wFormatTag = 0x0001, + }, + + .Speaker_Format_TypeI = + { + .header = + { + .bLength = sizeof(usb_descriptor_format_type_struct), + .bDescriptorType = AUDIO_INTERFACE_DESCRIPTOR_TYPE + }, + .bDescriptorSubtype = AUDIO_STREAMING_FORMAT_TYPE, + .bFormatType = AUDIO_FORMAT_TYPE_III, + .bNrChannels = 0x02, + .bSubFrameSize = 0x02, + .bBitResolution = 0x10, + .bSamFreqType = 0x01, + .bSamFreq[0]= (uint8_t)USBD_AUDIO_FREQ, + .bSamFreq[1]= USBD_AUDIO_FREQ >> 8, + .bSamFreq[2]= USBD_AUDIO_FREQ >> 16 + }, + + .Speaker_Std_Endpoint = + { + .header = + { + .bLength = sizeof(usb_descriptor_std_endpoint_struct), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = AUDIO_OUT_EP, + .bmAttributes = USB_ENDPOINT_TYPE_ISOCHRONOUS, + .wMaxPacketSize = PACKET_SIZE(USBD_AUDIO_FREQ), + .bInterval = 0x01, + .bRefresh = 0x00, + .bSynchAddress = 0x00 + }, + + .Speaker_AS_Endpoint = + { + .header = + { + .bLength = sizeof(usb_descriptor_AS_endpoint_struct), + .bDescriptorType = AUDIO_ENDPOINT_DESCRIPTOR_TYPE + }, + .bDescriptorSubtype = AUDIO_ENDPOINT_GENERAL, + .bmAttributes = 0x00, + .bLockDelayUnits = 0x00, + .wLockDelay = 0x0000, + } +}; + +/* USB language ID Descriptor */ +const usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB serial string */ +uint8_t usbd_serial_string[USB_SERIAL_STRING_SIZE] = +{ + USB_SERIAL_STRING_SIZE, + USB_DESCTYPE_STR, +}; + +__ALIGN_BEGIN void* const usbd_strings[] __ALIGN_END = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = USBD_STRING_DESC("GD32_Microelectronics"), + [STR_IDX_PRODUCT] = USBD_STRING_DESC("GD32 Audio in FS Mode"), + [STR_IDX_SERIAL] = USBD_STRING_DESC("GD32VF103-1.0.0-6f7e8dma"), +}; + +/*! + \brief initialize the AUDIO device + \param[in] pudev: pointer to usb device instance + \param[in] config_index: configuration index + \param[out] none + \retval usb device operation status +*/ +uint8_t audio_init (usb_dev *pudev, uint8_t config_index) +{ + /* initialize Rx endpoint */ + usbd_ep_setup(pudev, (const usb_desc_ep *)&(configuration_descriptor.Speaker_Std_Endpoint)); + + /* Initialize the Audio output Hardware layer */ + if (AUDIO_OUT_fops.Init(USBD_AUDIO_FREQ, DEFAULT_VOLUME, 0) != USBD_OK) + { + return USBD_FAIL; + } + + /* Prepare Out endpoint to receive audio data */ + usbd_ep_recev (pudev, AUDIO_OUT_EP, (uint8_t*)IsocOutBuff, AUDIO_OUT_PACKET); + + return USBD_OK; +} + +/*! + \brief de-initialize the AUDIO device + \param[in] pudev: pointer to usb device instance + \param[in] config_index: configuration index + \param[out] none + \retval usb device operation status +*/ +uint8_t audio_deinit (usb_dev *pudev, uint8_t config_index) +{ + /* deinitialize AUDIO endpoints */ + usbd_ep_clear(pudev, AUDIO_OUT_EP); + + /* DeInitialize the Audio output Hardware layer */ + if (AUDIO_OUT_fops.DeInit(0) != USBD_OK) + { + return USBD_FAIL; + } + + return USBD_OK; +} + +/*! + \brief handle the AUDIO class-specific requests + \param[in] pudev: pointer to usb device instance + \param[in] req: device class-specific request + \param[out] none + \retval usb device operation status +*/ +uint8_t audio_req_handler (usb_dev *pudev, usb_req *req) +{ + switch (req->bmRequestType & USB_REQTYPE_MASK) { + case USB_REQTYPE_CLASS: + switch (req->bRequest) { + case AUDIO_REQ_GET_CUR: + AUDIO_Req_GetCurrent(pudev, req); + break; + + case AUDIO_REQ_SET_CUR: + AUDIO_Req_SetCurrent(pudev, req); + break; + + default: + usbd_enum_error (pudev, req); + return USBD_FAIL; + } + + case USB_REQTYPE_STRD: + /* standard device request */ + switch(req->bRequest) { + case USB_GET_INTERFACE: + USBD_AUDIO_GetInterface(pudev, req); + break; + + case USB_SET_INTERFACE: + USBD_AUDIO_SetInterface(pudev, req); + break; + + default: + break; + } + break; + + default: + break; + } + + return USBD_OK; +} + +/*! + \brief handle data stage + \param[in] pudev: pointer to usb device instance + \param[in] rx_tx: the flag of Rx or Tx + \param[in] ep_id: the endpoint ID + \param[out] none + \retval usb device operation status +*/ +uint8_t audio_data_in_handler (usb_dev *pudev, uint8_t ep_id) +{ + if ((AUDIO_IN_EP & 0x7F) == ep_id) { + return USBD_OK; + } + return USBD_FAIL; +} + +uint8_t audio_data_out_handler (usb_dev *pudev, uint8_t ep_id) +{ + if ((EP0_OUT & 0x7F) == ep_id) { + + USBD_AUDIO_EP0_RxReady(pudev); + return USBD_OK; + } else if ((AUDIO_OUT_EP & 0x7F) == ep_id) { + + USBD_AUDIO_DataOut(pudev, ep_id); + return USBD_OK; + } + return USBD_FAIL; +} + +/** + * @brief Handles the Audio Out data stage. + * @param pudev: pointer to usb device instance + * @param EpID: endpoint identifer + * @retval usb device operation status + */ +static uint8_t USBD_AUDIO_DataOut (usb_dev *pudev, uint8_t EpID) +{ + if (EpID == AUDIO_OUT_EP) + { + /* Increment the Buffer pointer or roll it back when all buffers are full */ + if (IsocOutWrPtr >= (IsocOutBuff + (AUDIO_OUT_PACKET * OUT_PACKET_NUM))) + { + /* All buffers are full: roll back */ + IsocOutWrPtr = IsocOutBuff; + } + else + { + /* Increment the buffer pointer */ + IsocOutWrPtr += AUDIO_OUT_PACKET; + } + + /* Toggle the frame index */ + pudev->dev.transc_out[EpID].frame_num = + (pudev->dev.transc_out[EpID].frame_num)? 0:1; + + /* Prepare Out endpoint to receive next audio packet */ + usbd_ep_recev (pudev, AUDIO_OUT_EP, (uint8_t*)(IsocOutWrPtr), AUDIO_OUT_PACKET); + + /* Trigger the start of streaming only when half buffer is full */ + if ((PlayFlag == 0) && (IsocOutWrPtr >= (IsocOutBuff + ((AUDIO_OUT_PACKET * OUT_PACKET_NUM) / 2)))) + { + /* Enable start of Streaming */ + PlayFlag = 1; + } + } + + return USBD_OK; +} + +/** + * @brief Handles audio control requests data. + * @param pudev: pointer to usb device instance + * @retval usb device operation status + */ +static uint8_t USBD_AUDIO_EP0_RxReady (usb_dev *pudev) +{ + /* Check if an AudioControl request has been issued */ + if (AudioCtlCmd == AUDIO_REQ_SET_CUR) + {/* In this driver, to simplify code, only SET_CUR request is managed */ + + /* Check for which addressed unit the AudioControl request has been issued */ + if (AudioCtlUnit == AUDIO_OUT_STREAMING_CTRL) + {/* In this driver, to simplify code, only one unit is manage */ + + /* Call the audio interface mute function */ + AUDIO_OUT_fops.MuteCtl(AudioCtl[0]); + + /* Reset the AudioCtlCmd variable to prevent re-entering this function */ + AudioCtlCmd = 0; + AudioCtlLen = 0; + } + } + + return USBD_OK; +} + +/** + * @brief Handles the SOF event (data buffer update and synchronization). + * @param pudev: pointer to usb device instance + * @retval usb device operation status + */ +static uint8_t USBD_AUDIO_SOF (usb_dev *pudev) +{ + /* Check if there are available data in stream buffer. + In this function, a single variable (PlayFlag) is used to avoid software delays. + The play operation must be executed as soon as possible after the SOF detection. */ + if (PlayFlag) + { + /* Start playing received packet */ + AUDIO_OUT_fops.AudioCmd((uint8_t*)(IsocOutRdPtr), /* Samples buffer pointer */ + AUDIO_OUT_PACKET, /* Number of samples in Bytes */ + AUDIO_CMD_PLAY); /* Command to be processed */ + + /* Increment the Buffer pointer or roll it back when all buffers all full */ + if (IsocOutRdPtr >= (IsocOutBuff + (AUDIO_OUT_PACKET * OUT_PACKET_NUM))) + { + /* Roll back to the start of buffer */ + IsocOutRdPtr = IsocOutBuff; + } + else + { + /* Increment to the next sub-buffer */ + IsocOutRdPtr += AUDIO_OUT_PACKET; + } + + /* If all available buffers have been consumed, stop playing */ + if (IsocOutRdPtr == IsocOutWrPtr) + { + /* Pause the audio stream */ + AUDIO_OUT_fops.AudioCmd((uint8_t*)(IsocOutBuff), /* Samples buffer pointer */ + AUDIO_OUT_PACKET, /* Number of samples in Bytes */ + AUDIO_CMD_PAUSE); /* Command to be processed */ + + /* Stop entering play loop */ + PlayFlag = 0; + + /* Reset buffer pointers */ + IsocOutRdPtr = IsocOutBuff; + IsocOutWrPtr = IsocOutBuff; + } + } + + return USBD_OK; +} + +/** + * @brief Handle standard device request--Get Interface + * @param pudev: pointer to usb device instance + * @param req: standard device request + * @retval usb device operation status + */ +static void USBD_AUDIO_GetInterface (usb_dev *pudev, usb_req *req) +{ + pudev->dev.transc_in[0].xfer_buf = (uint8_t *)&USBD_AUDIO_AltSet; + pudev->dev.transc_in[0].remain_len = 1; + usbd_ctl_send(pudev); +} + +/** + * @brief Handle standard device request--Set Interface + * @param pudev: pointer to usb device instance + * @param req: standard device request + * @retval usb device operation status + */ +static void USBD_AUDIO_SetInterface (usb_dev *pudev, usb_req *req) +{ + if ((uint8_t)(req->wValue) < AUDIO_TOTAL_IF_NUM) + { + USBD_AUDIO_AltSet = (uint8_t)(req->wValue); + } + else + { + usbd_ep_stall(pudev,0x80); + usbd_ep_stall(pudev,0x00); + usb_ctlep_startout(pudev); + } +} + +/** + * @brief Handles the GET_CUR Audio control request. + * @param pudev: pointer to usb device instance + * @param req: setup class request + * @retval usb device operation status + */ +static void AUDIO_Req_GetCurrent(usb_dev *pudev, usb_req *req) +{ + /* Send the current mute state */ + pudev->dev.transc_in[0].xfer_buf = AudioCtl; + pudev->dev.transc_in[0].remain_len = req->wLength; + usbd_ctl_send(pudev); +} + +/** + * @brief Handles the SET_CUR Audio control request. + * @param pudev: pointer to usb device instance + * @param req: setup class request + * @retval usb device operation status + */ +static void AUDIO_Req_SetCurrent(usb_dev *pudev, usb_req *req) +{ + if (req->wLength) + { + /* Prepare the reception of the buffer over EP0 */ + pudev->dev.transc_out[0].xfer_buf = AudioCtl; + pudev->dev.transc_out[0].remain_len = req->wLength; + usbd_ctl_recev(pudev); + + /* Set the global variables indicating current request and its length + to the function usbd_audio_EP0_RxReady() which will process the request */ + AudioCtlCmd = AUDIO_REQ_SET_CUR; /* Set the request value */ + AudioCtlLen = req->wLength; /* Set the request data length */ + AudioCtlUnit = BYTE_HIGH(req->wIndex); /* Set the request target unit */ + } +} + +usb_class_core usbd_audio_cb = { + .command = NO_CMD, + .alter_set = 0, + + .init = audio_init, + .deinit = audio_deinit, + .req_proc = audio_req_handler, + .data_in = audio_data_in_handler, + .data_out = audio_data_out_handler, + .SOF = USBD_AUDIO_SOF +}; diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/gd32vf103_audio_codec.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/gd32vf103_audio_codec.c new file mode 100644 index 0000000..f1ef163 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/gd32vf103_audio_codec.c @@ -0,0 +1,935 @@ +/*! + \file gd3210c_audio_codec.c + \brief This file includes the low layer driver for CS43L22 Audio Codec + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* Includes ------------------------------------------------------------------*/ +#include "gd32vf103_audio_codec.h" +/* Private define ------------------------------------------------------------*/ + +/* Mask for the bit EN of the I2S CFGR register */ +#define I2S_ENABLE_MASK (0x0400) + +/* Delay for the Codec to be correctly reset */ +#define CODEC_RESET_DELAY (0x4FFF) + +/* Codec audio Standards */ +#ifdef I2S_STANDARD_PHILLIPS + #define CODEC_STANDARD 0x04 + #define I2S_STANDARD I2S_STD_PHILLIPS +#elif defined(I2S_STANDARD_MSB) + #define CODEC_STANDARD 0x00 + #define I2S_STANDARD I2S_STD_MSB +#elif defined(I2S_STANDARD_LSB) + #define CODEC_STANDARD 0x08 + #define I2S_STANDARD I2S_STD_LSB +#else + #error "Error: No audio communication standard selected !" +#endif /* I2S_STANDARD */ + +/* The 7 bits Codec adress (sent through I2C interface) */ +#define CODEC_ADDRESS 0x94 /* b00100111 */ + +/* Private variables ---------------------------------------------------------*/ +/* This structure is declared glabal because it is handled by two different functions */ +static dma_parameter_struct DMA_InitStructure; +static uint8_t OutputDev = 0; + +uint32_t AudioTotalSize = 0xFFFF; /* This variable holds the total size of the audio file */ +uint32_t AudioRemSize = 0xFFFF; /* This variable holds the remaining data in audio file */ +uint16_t *CurrentPos; /* This variable holds the current poisition of audio pointer */ +uint32_t I2S_AudioFreq = 0; + + +/* Private functions ---------------------------------------------------------*/ + +/* Audio Codec functions */ + +/* Low layer codec functions */ +static void Codec_CtrlInterface_Init (void); +static void Codec_CtrlInterface_DeInit (void); +static void Codec_AudioInterface_Init (uint32_t AudioFreq); +static void Codec_AudioInterface_DeInit (void); +static void Codec_Reset (void); +static uint32_t Codec_WriteRegister (uint32_t RegisterAddr, uint32_t RegisterValue); +static void Codec_GPIO_Init (void); +static void Codec_GPIO_DeInit (void); +static void Delay (__IO uint32_t nCount); + + +/** + * @brief Configure the audio peripherals. + * @param OutputDevice: + * This parameter can be any one of the following values: + * @arg OUTPUT_DEVICE_SPEAKER + * @arg OUTPUT_DEVICE_HEADPHONE + * @arg OUTPUT_DEVICE_BOTH + * @arg OUTPUT_DEVICE_AUTO + * @param Volume: Initial volume level (from 0 (Mute) to 100 (Max)) + * @param AudioFreq: Audio frequency used to paly the audio stream. + * @retval 0 if correct communication, else wrong communication + */ +uint32_t EVAL_AUDIO_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq) +{ + /* Perform low layer Codec initialization */ + if (Codec_Init(OutputDevice, VOLUME_CONVERT(Volume), AudioFreq) != 0) + { + return 1; + } + else + { + /* I2S data transfer preparation: + Prepare the Media to be used for the audio transfer from memory to I2S peripheral */ + Audio_MAL_Init(); + + /* Return 0 when all operations are OK */ + return 0; + } +} + +/** + * @brief Dinitializes all the resources used by the codec (those initialized + * by EVAL_AUDIO_Init() function) EXCEPT the I2C resources since they are + * used by the IOExpander as well (and eventually other modules). + * @param None. + * @retval 0 if correct communication, else wrong communication + */ +uint32_t EVAL_AUDIO_DeInit(void) +{ + /* DeInitialize the Media layer */ + Audio_MAL_DeInit(); + + /* DeInitialize Codec */ + Codec_DeInit(); + + return 0; +} + +/** + * @brief Starts playing audio stream from a data buffer for a determined size. + * @param pBuffer: Pointer to the buffer + * @param Size: Number of audio data BYTES. + * @retval OK if correct communication, else wrong communication + */ +uint32_t EVAL_AUDIO_Play(uint16_t* pBuffer, uint32_t Size) +{ + /* Set the total number of data to be played (count in half-word) */ + AudioTotalSize = Size/2; + + /* Call the audio Codec Play function */ + Codec_Play(); + + /* Update the Media layer and enable it for play */ + Audio_MAL_Play((uint32_t)pBuffer, (uint32_t)(DMA_MAX(AudioTotalSize / 2))); + + /* Update the remaining number of data to be played */ + AudioRemSize = (Size/2) - DMA_MAX(AudioTotalSize); + + /* Update the current audio pointer position */ + CurrentPos = pBuffer + DMA_MAX(AudioTotalSize); + + return 0; +} + +/** + * @brief This function Pauses or Resumes the audio file stream. In case + * of using DMA, the DMA Pause feature is used. In all cases the I2S + * peripheral is disabled. + * @WARNING When calling EVAL_AUDIO_PauseResume() function for pause, only + * this function should be called for resume (use of EVAL_AUDIO_Play() + * function for resume could lead to unexpected behaviour). + * @param Cmd: AUDIO_PAUSE (or 0) to pause, AUDIO_RESUME (or any value different + * from 0) to resume. + * @param Addr: Address from/at which the audio stream should resume/pause. + * @param Size: Number of data to be configured for next resume. + * @retval o if correct communication, else wrong communication + */ +uint32_t EVAL_AUDIO_PauseResume(uint32_t Cmd, uint32_t Addr, uint32_t Size) +{ + if (Cmd != AUDIO_PAUSE) + { + /* Call the Media layer pause/resume function */ + Audio_MAL_PauseResume(Cmd, Addr, Size); + + /* Call the Audio Codec Pause/Resume function */ + if (Codec_PauseResume(Cmd) != 0) + { + return 1; + } + else + { + return 0; + } + } + else + { + /* Call the Audio Codec Pause/Resume function */ + if (Codec_PauseResume(Cmd) != 0) + { + return 1; + } + else + { + /* Call the Media layer pause/resume function */ + Audio_MAL_PauseResume(Cmd, Addr, Size); + + /* Return 0 if all operations are OK */ + return 0; + } + } +} + +/** + * @brief Stops audio playing and Power down the Audio Codec. + * @param Option: + * This parameter can be any one of the following values: + * @arg CODEC_PDWN_SW for software power off (by writing registers) + Then no need to reconfigure the Codec after power on. + * @arg CODEC_PDWN_HW completely shut down the codec (physically). Then need + * to reconfigure the Codec after power on. + * @retval 0 if correct communication, else wrong communication + */ +uint32_t EVAL_AUDIO_Stop(uint32_t Option) +{ + /* Call Audio Codec Stop function */ + if (Codec_Stop(Option) != 0) + { + return 1; + } + else + { + /* Call Media layer Stop function */ + Audio_MAL_Stop(); + + /* Update the remaining data number */ + AudioRemSize = AudioTotalSize; + + /* Return 0 when all operations are correctly done */ + return 0; + } +} + +/** + * @brief Controls the current audio volume level. + * @param Volume: Volume level to be set in percentage from 0% to 100% (0 for + * Mute and 100 for Max volume level). + * @retval 0 if correct communication, else wrong communication + */ +uint32_t EVAL_AUDIO_VolumeCtl(uint8_t Volume) +{ + /* Call the codec volume control function with converted volume value */ + return (Codec_VolumeCtrl(VOLUME_CONVERT(Volume))); +} + +/** + * @brief Enable or disable the MUTE mode by software + * @param Cmd: could be AUDIO_MUTE_ON to mute sound or AUDIO_MUTE_OFF to + * unmute the codec and restore previous volume level. + * @retval o if correct communication, else wrong communication + */ +uint32_t EVAL_AUDIO_Mute(uint32_t Cmd) +{ + /* Call the Codec Mute function */ + return (Codec_Mute(Cmd)); +} + +/** + * @brief This function handles main Media layer interrupt. + * @param None. + * @retval 0 if correct communication, else wrong communication + */ +void Audio_MAL_IRQHandler(void) +{ +#ifndef AUDIO_MAL_MODE_NORMAL + uint16_t *pAddr = (uint16_t *)CurrentPos; + uint32_t Size = AudioRemSize; +#endif /* AUDIO_MAL_MODE_NORMAL */ +} + +/* CS43L22 Audio Codec Control Functions */ + +/** + * @brief Initializes the audio codec and all related interfaces (control + * interface: I2C and audio interface: I2S) + * @param OutputDevice: + * This parameter can be any one of the following values: + * @arg OUTPUT_DEVICE_SPEAKER + * @arg OUTPUT_DEVICE_HEADPHONE + * @arg OUTPUT_DEVICE_BOTH + * @arg OUTPUT_DEVICE_AUTO + * @param Volume: Initial volume level (from 0 (Mute) to 100 (Max)) + * @param AudioFreq: Audio frequency used to paly the audio stream. + * @retval 0 if correct communication, else wrong communication + */ +uint32_t Codec_Init(uint16_t OutputDevice, uint8_t Volume, uint32_t AudioFreq) +{ + uint32_t counter = 0; + + /* Configure the Codec related IOs */ + Codec_GPIO_Init(); + + /* Reset the Codec Registers */ + Codec_Reset(); + + /* Initialize the Control interface of the Audio Codec */ + Codec_CtrlInterface_Init(); + + /* Keep Codec powered OFF */ + counter += Codec_WriteRegister(0x02, 0x01); + + switch (OutputDevice) + { + case OUTPUT_DEVICE_SPEAKER: + counter += Codec_WriteRegister(0x04, 0xFA); /* SPK always ON & HP always OFF */ + OutputDev = 0xFA; + break; + + case OUTPUT_DEVICE_HEADPHONE: + counter += Codec_WriteRegister(0x04, 0xAF); /* SPK always OFF & HP always ON */ + OutputDev = 0xAF; + break; + + case OUTPUT_DEVICE_BOTH: + counter += Codec_WriteRegister(0x04, 0xAA); /* SPK always ON & HP always ON */ + OutputDev = 0xAA; + break; + + case OUTPUT_DEVICE_AUTO: + counter += Codec_WriteRegister(0x04, 0x05); /* Detect the HP or the SPK automatically */ + OutputDev = 0x05; + break; + + default: + counter += Codec_WriteRegister(0x04, 0x05); /* Detect the HP or the SPK automatically */ + OutputDev = 0x05; + break; + } + + /* Clock configuration: Auto detection */ + counter += Codec_WriteRegister(0x05, 0x81); + + /* Set the Slave Mode and the audio Standard */ + counter += Codec_WriteRegister(0x06, CODEC_STANDARD); + + /* Set the Master volume */ + Codec_VolumeCtrl(Volume); + + /* If the Speaker is enabled, set the Mono mode and volume attenuation level */ + if (OutputDevice != OUTPUT_DEVICE_HEADPHONE) + { + /* Set the Speaker Mono mode */ + counter += Codec_WriteRegister(0x0F , 0x06); + + /* Set the Speaker attenuation level */ + counter += Codec_WriteRegister(0x24, 0x00); + counter += Codec_WriteRegister(0x25, 0x00); + } + + /* Power on the Codec */ + counter += Codec_WriteRegister(0x02, 0x9E); + + /* Additional configuration for the CODEC. These configurations are done to reduce + the time needed for the Codec to power off. If these configurations are removed, + then a long delay should be added between powering off the Codec and switching + off the I2S peripheral MCLK clock (which is the operating clock for Codec). + If this delay is not inserted, then the codec will not shut down propoerly and + it results in high noise after shut down. */ + + /* Disable the analog soft ramp */ + counter += Codec_WriteRegister(0x0A, 0x00); + + /* Disable the digital soft ramp */ + counter += Codec_WriteRegister(0x0E, 0x04); + + /* Disable the limiter attack level */ + counter += Codec_WriteRegister(0x27, 0x00); + + /* Adjust Bass and Treble levels */ + counter += Codec_WriteRegister(0x1F, 0x0F); + + /* Adjust PCM volume level */ + counter += Codec_WriteRegister(0x1A, 0x0A); + counter += Codec_WriteRegister(0x1B, 0x0A); + + /* Configure the I2S peripheral */ + Codec_AudioInterface_Init(AudioFreq); + + /* Return communication control value */ + return counter; +} + +/** + * @brief Restore the audio codec state to default state and free all used + * resources. + * @param None. + * @retval 0 if correct communication, else wrong communication + */ +uint32_t Codec_DeInit(void) +{ + uint32_t counter = 0; + + /* Reset the Codec Registers */ + Codec_Reset(); + + /* Keep Codec powered OFF */ + counter += Codec_WriteRegister(0x02, 0x01); + + /* Deinitialize all use GPIOs */ + Codec_GPIO_DeInit(); + + /* Disable the Codec control interface */ + Codec_CtrlInterface_DeInit(); + + /* Deinitialize the Codec audio interface (I2S) */ + Codec_AudioInterface_DeInit(); + + /* Return communication control value */ + return counter; +} + +/** + * @brief Start the audio Codec play feature. + * For this codec no Play options are required. + * @param None. + * @retval 0 if correct communication, else wrong communication + */ +uint32_t Codec_Play(void) +{ + /* No actions required on Codec level for play command */ + + /* Return communication control value */ + return 0; +} + +/** + * @brief Pauses and resumes playing on the audio codec. + * @param Cmd: AUDIO_PAUSE (or 0) to pause, AUDIO_RESUME (or any value different + * from 0) to resume. + * @retval 0 if correct communication, else wrong communication + */ +uint32_t Codec_PauseResume(uint32_t Cmd) +{ + uint32_t counter = 0; + + /* Pause the audio file playing */ + if (Cmd == AUDIO_PAUSE) + { + /* Mute the output first */ + counter += Codec_Mute(AUDIO_MUTE_ON); + + /* Put the Codec in Power save mode */ + counter += Codec_WriteRegister(0x02, 0x01); + } + else /* AUDIO_RESUME */ + { + /* Unmute the output first */ + counter += Codec_Mute(AUDIO_MUTE_OFF); + + counter += Codec_WriteRegister(0x04, OutputDev); + + /* Exit the Power save mode */ + counter += Codec_WriteRegister(0x02, 0x9E); + } + + return counter; +} + +/** + * @brief Stops audio Codec playing. It powers down the codec. + * @param CodecPdwnMode: + * This parameter can be any one of the following values: + * @arg CODEC_PDWN_SW: only mutes the audio codec. When resuming from this + * mode the codec keeps the prvious initialization (no need to re-Initialize + * the codec registers) + * @arg CODEC_PDWN_HW: Physically power down the codec. When resuming from this + * mode, the codec is set to default configuration (user should re-Initialize + * the codec in order to play again the audio stream). + * @retval 0 if correct communication, else wrong communication + */ +uint32_t Codec_Stop(uint32_t CodecPdwnMode) +{ + uint32_t counter = 0; + + /* Mute the output first */ + Codec_Mute(AUDIO_MUTE_ON); + + if (CodecPdwnMode == CODEC_PDWN_SW) + { + /* Power down the DAC and the speaker (PMDAC and PMSPK bits)*/ + counter += Codec_WriteRegister(0x02, 0x9F); + } + else /* CODEC_PDWN_HW */ + { + /* Power down the DAC components */ + counter += Codec_WriteRegister(0x02, 0x9F); + + /* Wait at least 100ms */ + Delay(0xFFF); + + /* Reset The pin */ + //IOE_WriteIOPin(AUDIO_RESET_PIN, BitReset); + } + + return counter; +} + +/** + * @brief Highers or Lowers the codec volume level. + * @param Volume: a byte value from 0 to 255 (refer to codec registers + * description for more details). + * @retval 0 if correct communication, else wrong communication + */ +uint32_t Codec_VolumeCtrl(uint8_t Volume) +{ + uint32_t counter = 0; + + if (Volume > 0xE6) + { + /* Set the Master volume */ + counter += Codec_WriteRegister(0x20, Volume - 0xE7); + counter += Codec_WriteRegister(0x21, Volume - 0xE7); + } + else + { + /* Set the Master volume */ + counter += Codec_WriteRegister(0x20, Volume + 0x19); + counter += Codec_WriteRegister(0x21, Volume + 0x19); + } + + return counter; +} + +/** + * @brief Enables or disables the mute feature on the audio codec. + * @param Cmd: AUDIO_MUTE_ON to enable the mute or AUDIO_MUTE_OFF to disable the + * mute mode. + * @retval 0 if correct communication, else wrong communication + */ +uint32_t Codec_Mute(uint32_t Cmd) +{ + uint32_t counter = 0; + + /* Set the Mute mode */ + if (Cmd == AUDIO_MUTE_ON) + { + counter += Codec_WriteRegister(0x04, 0xFF); + + //counter += Codec_WriteRegister(0x0D, 0x63); + //counter += Codec_WriteRegister(0x0F, 0xF6); + } + else /* AUDIO_MUTE_OFF Disable the Mute */ + { + counter += Codec_WriteRegister(0x04, OutputDev); + + //counter += Codec_WriteRegister(0x0D, 0x60); + //counter += Codec_WriteRegister(0x0F, 0x06); + } + + return counter; +} + +/** + * @brief Resets the audio codec. It restores the default configuration of the + * codec (this function shall be called before initializing the codec). + * @note This function calls an external driver function: The IO Expander driver. + * @param None. + * @retval 0 if correct communication, else wrong communication + */ +static void Codec_Reset(void) +{ + /* Configure the IO Expander (to use the Codec Reset pin mapped on the IOExpander) */ + //IOE_Config(); + + /* Power Down the codec */ + //IOE_WriteIOPin(AUDIO_RESET_PIN, BitReset); + + /* wait for a delay to insure registers erasing */ + //Delay(CODEC_RESET_DELAY); + + /* Power on the codec */ + //IOE_WriteIOPin(AUDIO_RESET_PIN, BitSet); +} + +/** + * @brief Switch dynamically (while audio file is played) the output target (speaker or headphone). + * @note This function modifies a global variable of the audio codec driver: OutputDev. + * @param None. + * @retval 0 if correct communication, else wrong communication + */ +uint32_t Codec_SwitchOutput(uint8_t Output) +{ + uint8_t counter = 0; + + switch (Output) + { + case OUTPUT_DEVICE_SPEAKER: + counter += Codec_WriteRegister(0x04, 0xFA); /* SPK always ON & HP always OFF */ + OutputDev = 0xFA; + break; + + case OUTPUT_DEVICE_HEADPHONE: + counter += Codec_WriteRegister(0x04, 0xAF); /* SPK always OFF & HP always ON */ + OutputDev = 0xAF; + break; + + case OUTPUT_DEVICE_BOTH: + counter += Codec_WriteRegister(0x04, 0xAA); /* SPK always ON & HP always ON */ + OutputDev = 0xAA; + break; + + case OUTPUT_DEVICE_AUTO: + counter += Codec_WriteRegister(0x04, 0x05); /* Detect the HP or the SPK automatically */ + OutputDev = 0x05; + break; + + default: + counter += Codec_WriteRegister(0x04, 0x05); /* Detect the HP or the SPK automatically */ + OutputDev = 0x05; + break; + } + + return counter; +} + +/** + * @brief Writes a Byte to a given register into the audio codec through the + control interface (I2C) + * @param RegisterAddr: The address (location) of the register to be written. + * @param RegisterValue: the Byte value to be written into destination register. + * @retval 0 if correct communication, else wrong communication + */ +static uint32_t Codec_WriteRegister(uint32_t RegisterAddr, uint32_t RegisterValue) +{ + uint32_t result = 0; + + /* Return the verifying value: 0 (Passed) or 1 (Failed) */ + return result; +} + +/** + * @brief Initializes the Audio Codec control interface (I2C). + * @param None. + * @retval None. + */ +static void Codec_CtrlInterface_Init(void) +{ + +} + +/** + * @brief Restore the Audio Codec control interface to its default state. + * This function doesn't de-initialize the I2C because the I2C peripheral + * may be used by other modules. + * @param None. + * @retval None. + */ +static void Codec_CtrlInterface_DeInit(void) +{ + /* Disable the I2C peripheral */ + /* This step is not done here because the I2C interface can be used by other modules */ + /* I2C_DeInit(CODEC_I2C); */ +} + +/** + * @brief Initializes the Audio Codec audio interface (I2S) + * @note This function assumes that the I2S input clock (through PLL_R in + * Devices RevA/Z and through dedicated PLLI2S_R in Devices RevB/Y) + * is already configured and ready to be used. + * @param AudioFreq: Audio frequency to be configured for the I2S peripheral. + * @retval None. + */ +static void Codec_AudioInterface_Init(uint32_t AudioFreq) +{ + I2S_AudioFreq = AudioFreq; + + /* Enable the CODEC_I2S peripheral clock */ + rcu_periph_clock_enable(CODEC_I2S_CLK); + + /* CODEC_I2S peripheral configuration */ + spi_i2s_deinit(CODEC_I2S); + + /* CODEC_I2S peripheral configuration */ + i2s_psc_config(CODEC_I2S, AudioFreq, I2S_FRAMEFORMAT_DT16B_CH16B, +#ifdef CODEC_MCLK_ENABLED + I2S_MCKOUT_ENABLE +#elif defined(CODEC_MCLK_DISABLED) + I2S_MCKOUT_DISABLE +#endif + ); + + i2s_init(CODEC_I2S, I2S_MODE_MASTERTX, I2S_STD_LSB, I2S_CKPL_LOW); + + /* Enable the I2S DMA TX request */ + spi_dma_enable(CODEC_I2S, SPI_DMA_TRANSMIT); + /* The I2S peripheral will be enabled only in the EVAL_AUDIO_Play() function + or by user functions if DMA mode not enabled */ +} + +/** + * @brief Restores the Audio Codec audio interface to its default state. + * @param None. + * @retval None. + */ +static void Codec_AudioInterface_DeInit(void) +{ + /* Disable the CODEC_I2S peripheral (in case it hasn't already been disabled) */ + i2s_disable(CODEC_I2S); + + /* Deinitialize the CODEC_I2S peripheral */ + spi_i2s_deinit(CODEC_I2S); + + /* Disable the CODEC_I2S peripheral clock */ + rcu_periph_clock_disable(CODEC_I2S_CLK); +} + +/** + * @brief Initializes IOs used by the Audio Codec (on the control and audio + * interfaces). + * @param None. + * @retval None. + */ +static void Codec_GPIO_Init(void) +{ + /* enable the clock */ + rcu_periph_clock_enable(RCU_AF); + rcu_periph_clock_enable(CODEC_I2S_GPIO1_CLOCK); + rcu_periph_clock_enable(CODEC_I2S_GPIO2_CLOCK); + rcu_periph_clock_enable(CODEC_SPI_CLK); + + /* CODEC_I2C SCL and SDA pins configuration */ + gpio_init(CODEC_SPI_GPIO, GPIO_MODE_AF_OD, GPIO_OSPEED_50MHZ, CODEC_SPI_SCL_PIN | CODEC_SPI_SDA_PIN); + + /* CODEC_I2S pins configuraiton: WS, SCK and SD pins */ + gpio_init(CODEC_I2S_GPIO, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, CODEC_I2S_WS_PIN | CODEC_I2S_SCK_PIN | CODEC_I2S_SD_PIN); + +#ifdef CODEC_MCLK_ENABLED + /* CODEC_I2S pins configuraiton: MCK pin */ + gpio_init(CODEC_I2S_MCK_GPIO, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, CODEC_I2S_MCK_PIN); +#endif /* CODEC_MCLK_ENABLED */ +} + +/** + * @brief Restores the IOs used by the Audio Codec interface to their default + * state + * @param None. + * @retval None. + */ +static void Codec_GPIO_DeInit(void) +{ + /* Deinitialize all the GPIOs used by the driver (EXCEPT the I2C IOs since + they are used by the IOExpander as well) */ + gpio_init(CODEC_I2S_GPIO, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, CODEC_I2S_WS_PIN | CODEC_I2S_SCK_PIN | CODEC_I2S_SD_PIN); + +#ifdef CODEC_MCLK_ENABLED + /* CODEC_I2S pins deinitialization: MCK pin */ + gpio_init(CODEC_I2S_MCK_GPIO, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, CODEC_I2S_MCK_PIN); +#endif /* CODEC_MCLK_ENABLED */ +} + +/** + * @brief Inserts a delay time (not accurate timing). + * @param nCount: specifies the delay time length. + * @retval None. + */ +static void Delay( __IO uint32_t nCount) +{ + for (; nCount != 0; nCount--); +} + +#ifdef USE_DEFAULT_TIMEOUT_CALLBACK +/** + * @brief Basic management of the timeout situation. + * @param None. + * @retval None. + */ +uint32_t Codec_TIMEOUT_UserCallback(void) +{ + /* Block communication and all processes */ + while (1) + { + } +} +#endif /* USE_DEFAULT_TIMEOUT_CALLBACK */ + +/* Audio MAL Interface Control Functions */ + +/** + * @brief Initializes and prepares the Media to perform audio data transfer + * from Media to the I2S peripheral. + * @param None. + * @retval None. + */ +void Audio_MAL_Init(void) +{ + /* Enable the DMA clock */ + rcu_periph_clock_enable(AUDIO_MAL_DMA_CLOCK); + + /* Configure the DMA Stream */ + dma_channel_enable(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL); + dma_deinit(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL); + + /* Set the parameters to be configured */ + DMA_InitStructure.periph_addr = CODEC_I2S_ADDRESS; + DMA_InitStructure.memory_addr = (uint32_t)0;/* This field will be configured in play function */ + DMA_InitStructure.direction = DMA_MEMORY_TO_PERIPHERAL; + DMA_InitStructure.number = (uint32_t)0xFFFE;/* This field will be configured in play function */ + DMA_InitStructure.periph_inc = DMA_PERIPH_INCREASE_DISABLE; + DMA_InitStructure.memory_inc = DMA_MEMORY_INCREASE_ENABLE; + DMA_InitStructure.periph_width = DMA_PERIPHERAL_WIDTH_16BIT; + DMA_InitStructure.memory_width = DMA_MEMORY_WIDTH_16BIT; + +#ifdef AUDIO_MAL_MODE_NORMAL + dma_circulation_disable(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL); +#elif defined(AUDIO_MAL_MODE_CIRCULAR) + dma_circulation_enable(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL); +#else + #error "AUDIO_MAL_MODE_NORMAL or AUDIO_MAL_MODE_CIRCULAR should be selected !!" +#endif /* AUDIO_MAL_MODE_NORMAL */ + + DMA_InitStructure.priority = DMA_PRIORITY_HIGH; + dma_init(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL, &DMA_InitStructure); + + /* Enable the I2S DMA request */ + spi_dma_enable(CODEC_I2S, SPI_DMA_TRANSMIT); +} + +/** + * @brief Restore default state of the used Media. + * @param None. + * @retval None. + */ +void Audio_MAL_DeInit(void) +{ + /* Disable the DMA Channel before the deinit */ + dma_channel_disable(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL); + + /* Dinitialize the DMA Channel */ + dma_deinit(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL); + + /* The DMA clock is not disabled, since it can be used by other streams */ +} + +/** + * @brief Starts playing audio stream from the audio Media. + * @param Addr: Pointer to the audio stream buffer + * @param Size: Number of data in the audio stream buffer + * @retval None. + */ +void Audio_MAL_Play(uint32_t Addr, uint32_t Size) +{ + /* Enable the I2S DMA Stream*/ + dma_channel_disable(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL); + + /* Clear the Interrupt flag */ + dma_interrupt_flag_clear(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL, DMA_INT_FLAG_FTF); + + /* Configure the buffer address and size */ + DMA_InitStructure.memory_addr = (uint32_t)Addr; + DMA_InitStructure.number = (uint32_t)(Size*2); + + /* Configure the DMA Stream with the new parameters */ + dma_init(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL, &DMA_InitStructure); + + /* Enable the I2S DMA Stream*/ + dma_channel_enable(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL); + + /* If the I2S peripheral is still not enabled, enable it */ + if ((SPI_I2SCTL(CODEC_I2S) & I2S_ENABLE_MASK) == 0) + { + i2s_enable(CODEC_I2S); + } +} + +/** + * @brief Pauses or Resumes the audio stream playing from the Media. + * @param Cmd: AUDIO_PAUSE (or 0) to pause, AUDIO_RESUME (or any value different + * from 0) to resume. + * @param Addr: Address from/at which the audio stream should resume/pause. + * @param Size: Number of data to be configured for next resume. + * @retval None. + */ +void Audio_MAL_PauseResume(uint32_t Cmd, uint32_t Addr, uint32_t Size) +{ + /* Pause the audio file playing */ + if (Cmd == AUDIO_PAUSE) + { + /* Stop the current DMA request by resetting the I2S cell */ + Codec_AudioInterface_DeInit(); + + /* Re-configure the I2S interface for the next resume operation */ + Codec_AudioInterface_Init(I2S_AudioFreq); + + /* Disable the DMA Stream */ + dma_channel_disable(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL); + + /* Clear the Interrupt flag */ + dma_flag_clear(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL, AUDIO_MAL_DMA_FLAG_ALL); + } + else /* AUDIO_RESUME */ + { + /* Configure the buffer address and size */ + DMA_InitStructure.memory_addr = (uint32_t)Addr; + DMA_InitStructure.number = (uint32_t)(Size*2); + + /* Configure the DMA Stream with the new parameters */ + dma_init(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL, &DMA_InitStructure); + + /* Enable the I2S DMA Stream*/ + dma_channel_enable(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL); + + /* If the I2S peripheral is still not enabled, enable it */ + if ((SPI_I2SCTL(CODEC_I2S) & I2S_ENABLE_MASK) == 0) + { + i2s_enable(CODEC_I2S); + } + } +} + +/** + * @brief Stops audio stream playing on the used Media. + * @param None. + * @retval None. + */ +void Audio_MAL_Stop(void) +{ + /* Stop the Transfer on the I2S side: Stop and disable the DMA stream */ + dma_channel_disable(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL); + + /* Clear all the DMA flags for the next transfer */ + dma_flag_clear(AUDIO_MAL_DMA, AUDIO_MAL_DMA_CHANNEL, AUDIO_MAL_DMA_FLAG_ALL); + + /* Stop the current DMA request by resetting the I2S cell */ + Codec_AudioInterface_DeInit(); + + /* Re-configure the I2S interface for the next paly operation */ + Codec_AudioInterface_Init(I2S_AudioFreq); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/gd32vf103_hw.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/gd32vf103_hw.c new file mode 100644 index 0000000..204c678 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/gd32vf103_hw.c @@ -0,0 +1,206 @@ +/*! + \file gd32vf103_hw.c + \brief USB hardware configuration for GD32VF103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include +#include +#include + + +#define TIM_MSEC_DELAY 0x01 +#define TIM_USEC_DELAY 0x02 + +__IO uint32_t delay_time = 0; +__IO uint32_t timer_prescaler; +__IO uint32_t usbfs_prescaler = 0; + +static void hw_time_set (uint8_t unit); +static void hw_delay (uint32_t ntime, uint8_t unit); + + +/*! + \brief configure USB clock + \param[in] none + \param[out] none + \retval none +*/ +void usb_rcu_config(void) +{ + uint32_t system_clock = rcu_clock_freq_get(CK_SYS); + + if (system_clock == 48000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1; + timer_prescaler = 3; + } else if (system_clock == 72000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1_5; + timer_prescaler = 5; + } else if (system_clock == 96000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV2; + timer_prescaler = 7; + } else { + /* reserved */ + } + + rcu_usb_clock_config(usbfs_prescaler); + rcu_periph_clock_enable(RCU_USBFS); +} + +/*! + \brief configure USB interrupt + \param[in] none + \param[out] none + \retval none +*/ +void usb_intr_config(void) +{ + eclic_irq_enable((uint8_t)USBFS_IRQn, 1, 0); + + /* enable the power module clock */ + rcu_periph_clock_enable(RCU_PMU); + + /* USB wakeup EXTI line configuration */ + exti_interrupt_flag_clear(EXTI_18); + exti_init(EXTI_18, EXTI_INTERRUPT, EXTI_TRIG_RISING); + exti_interrupt_enable(EXTI_18); + + eclic_irq_enable((uint8_t)USBFS_WKUP_IRQn, 3, 0); +} + +/*! + \brief initializes delay unit using Timer2 + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_init (void) +{ + rcu_periph_clock_enable(RCU_TIMER2); + + eclic_irq_enable(TIMER2_IRQn, 2, 0); +} + +/*! + \brief delay in micro seconds + \param[in] usec: value of delay required in micro seconds + \param[out] none + \retval none +*/ +void usb_udelay (const uint32_t usec) +{ + hw_delay(usec, TIM_USEC_DELAY); +} + +/*! + \brief delay in milli seconds + \param[in] msec: value of delay required in milli seconds + \param[out] none + \retval none +*/ +void usb_mdelay (const uint32_t msec) +{ + hw_delay(msec, TIM_MSEC_DELAY); +} + +/*! + \brief time base IRQ + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_irq (void) +{ + if (RESET != timer_flag_get(TIMER2, TIMER_FLAG_UP)){ + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + + if (delay_time > 0x00U){ + delay_time--; + } else { + timer_disable(TIMER2); + } + } +} + +/*! + \brief delay routine based on TIM0 + \param[in] nTime: delay Time + \param[in] unit: delay Time unit = mili sec / micro sec + \param[out] none + \retval none +*/ +static void hw_delay(uint32_t ntime, uint8_t unit) +{ + delay_time = ntime; + + hw_time_set(unit); + + while (0U != delay_time) { + } + + timer_disable(TIMER2); +} + +/*! + \brief configures TIM0 for delay routine based on TIM0 + \param[in] unit: msec /usec + \param[out] none + \retval none +*/ +static void hw_time_set(uint8_t unit) +{ + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER2); + timer_deinit(TIMER2); + + if(TIM_USEC_DELAY == unit) { + timer_initpara.period = 11; + } else if(TIM_MSEC_DELAY == unit) { + timer_initpara.period = 11999; + } + + timer_initpara.prescaler = timer_prescaler; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER2, &timer_initpara); + + timer_update_event_enable(TIMER2); + timer_interrupt_enable(TIMER2,TIMER_INT_UP); + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + timer_update_source_config(TIMER2, TIMER_UPDATE_SRC_GLOBAL); + + /* TIMER2 counter enable */ + timer_enable(TIMER2); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/gd32vf103_it.c new file mode 100644 index 0000000..f46e7c3 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/gd32vf103_it.c @@ -0,0 +1,96 @@ +/*! + \file gd32vf103_it.c + \brief main interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usbd_int.h" +#include "drv_usb_hw.h" +#include "gd32vf103_it.h" + +extern usb_core_driver USB_OTG_dev; +extern uint32_t usbfs_prescaler; + +extern void usb_timer_irq (void); + +/*! + \brief this function handles USBD interrupt + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_IRQHandler (void) +{ + usbd_isr (&USB_OTG_dev); +} + +/*! + \brief this function handles EXTI0_IRQ Handler + \param[in] none + \param[out] none + \retval none +*/ +void EXTI0_IRQHandler(void) +{ + +} + +/*! + \brief this function handles USBD wakeup interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_WKUP_IRQHandler(void) +{ + if (USB_OTG_dev.bp.low_power) { + SystemInit(); + + rcu_usb_clock_config(usbfs_prescaler); + + rcu_periph_clock_enable(RCU_USBFS); + + usb_clock_active(&USB_OTG_dev); + } + + exti_interrupt_flag_clear(EXTI_18); +} + +/*! + \brief this function handles Timer0 updata interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void TIMER2_IRQHandler(void) +{ + usb_timer_irq(); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/system_gd32vf103.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/system_gd32vf103.c new file mode 100644 index 0000000..05e5205 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/system_gd32vf103.c @@ -0,0 +1,998 @@ +/*! + \file system_gd32vf103.h + \brief RISC-V Device Peripheral Access Layer Source File for + GD32VF103 Device Series + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* This file refers the RISC-V standard, some adjustments are made according to GigaDevice chips */ + +#include "gd32vf103.h" + +/* system frequency define */ +#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */ + +/* select a system clock by uncommenting the following line */ +/* use IRC8M */ +//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000) + +/********************************************************************/ +//#define __SYSTEM_CLOCK_HXTAL (HXTAL_VALUE) +//#define __SYSTEM_CLOCK_24M_PLL_HXTAL (uint32_t)(24000000) +/********************************************************************/ + +//#define __SYSTEM_CLOCK_36M_PLL_HXTAL (uint32_t)(36000000) +//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_56M_PLL_HXTAL (uint32_t)(56000000) +//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000) +#define __SYSTEM_CLOCK_96M_PLL_HXTAL (uint32_t)(96000000) +//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000) + +#define SEL_IRC8M 0x00U +#define SEL_HXTAL 0x01U +#define SEL_PLL 0x02U + +/* set the system clock frequency and declare the system clock configuration function */ +#ifdef __SYSTEM_CLOCK_48M_PLL_IRC8M +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_IRC8M; +static void system_clock_48m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M; +static void system_clock_72m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_IRC8M; +static void system_clock_108m_irc8m(void); + +#elif defined (__SYSTEM_CLOCK_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; +static void system_clock_hxtal(void); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_24M_PLL_HXTAL; +static void system_clock_24m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_36M_PLL_HXTAL; +static void system_clock_36m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_HXTAL; +static void system_clock_48m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_56M_PLL_HXTAL; +static void system_clock_56m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL; +static void system_clock_72m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_HXTAL; +static void system_clock_96m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL; +static void system_clock_108m_hxtal(void); +#else +uint32_t SystemCoreClock = IRC8M_VALUE; +#endif /* __SYSTEM_CLOCK_48M_PLL_IRC8M */ + +/* configure the system clock */ +static void system_clock_config(void); + +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ +#ifdef __SYSTEM_CLOCK_HXTAL + system_clock_hxtal(); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) + system_clock_24m_hxtal(); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) + system_clock_36m_hxtal(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) + system_clock_48m_hxtal(); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) + system_clock_56m_hxtal(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) + system_clock_72m_hxtal(); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) + system_clock_96m_hxtal(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) + system_clock_108m_hxtal(); + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) + system_clock_48m_irc8m(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) + system_clock_72m_irc8m(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) + system_clock_108m_irc8m(); +#endif /* __SYSTEM_CLOCK_HXTAL */ +} + +/*! + \brief setup the microcontroller system, initialize the system + \param[in] none + \param[out] none + \retval none +*/ +void SystemInit(void) +{ + /* reset the RCC clock configuration to the default reset state */ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* reset SCS, AHBPSC, APB1PSC, APB2PSC, ADCPSC, CKOUT0SEL bits */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_ADCPSC_2 | RCU_CFG0_CKOUT0SEL); + + /* reset HXTALEN, CKMEN, PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + + /* Reset HXTALBPS bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* reset PLLSEL, PREDV0_LSB, PLLMF, USBFSPSC bits */ + + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_PLLMF_4); + RCU_CFG1 = 0x00000000U; + + /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x00FF0000U; + + /* Configure the System clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */ + system_clock_config(); +} + +/*! + \brief update the SystemCoreClock with current core clock retrieved from cpu registers + \param[in] none + \param[out] none + \retval none +*/ +void SystemCoreClockUpdate(void) +{ + uint32_t scss; + uint32_t pllsel, predv0sel, pllmf, ck_src; + uint32_t predv0, predv1, pll1mf; + + scss = GET_BITS(RCU_CFG0, 2, 3); + + switch (scss) + { + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + SystemCoreClock = IRC8M_VALUE; + break; + + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + + if(RCU_PLLSRC_IRC8M_DIV2 == pllsel){ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE / 2U; + }else{ + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + + if(pllmf >= 15U){ + pllmf += 1U; + }else{ + pllmf += 2U; + } + + SystemCoreClock = ck_src * pllmf; + + if(15U == pllmf){ + /* PLL source clock multiply by 6.5 */ + SystemCoreClock = ck_src * 6U + ck_src / 2U; + } + + break; + + /* IRC8M is selected as CK_SYS */ + default: + SystemCoreClock = IRC8M_VALUE; + break; + } +} + +#ifdef __SYSTEM_CLOCK_HXTAL +/*! + \brief configure the system clock to HXTAL + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select HXTAL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; + + /* wait until HXTAL is selected as system clock */ + while(0 == (RCU_CFG0 & RCU_SCSS_HXTAL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +/*! + \brief configure the system clock to 24M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_24m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 6 = 24 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +/*! + \brief configure the system clock to 36M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_36m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 9 = 36 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +/*! + \brief configure the system clock to 48M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL12); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +/*! + \brief configure the system clock to 56M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_56m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 14 = 56 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL14); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +/*! + \brief configure the system clock to 72M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL18); + + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +/*! + \brief configure the system clock to 96M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_96m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + if(HXTAL_VALUE==25000000){ + + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +/*! + \brief configure the system clock to 108M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ + +static void system_clock_108m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL27); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PREDV1_DIV5 | RCU_PLL1_MUL8 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 | RCU_PREDV1_DIV2 | RCU_PLL1_MUL20 | RCU_PLL2_MUL20); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL2 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + + } + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +/*! + \brief configure the system clock to 48M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL12; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +/*! + \brief configure the system clock to 72M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL18; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +/*! + \brief configure the system clock to 108M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL27; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/usbd_audio_out_if.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/usbd_audio_out_if.c new file mode 100644 index 0000000..8739f73 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/Source/usbd_audio_out_if.c @@ -0,0 +1,288 @@ +/*! + \file usbd_audio_out_if.c + \brief This file provides the Audio Out (palyback) interface API + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* Includes ------------------------------------------------------------------*/ +#include "audio_core.h" +#include "usbd_audio_out_if.h" + +/** @addtogroup GD32VF103_Firmware + * @{ + */ + +/** @addtogroup USB_OTG_FS + * @{ + */ + +/** @addtogroup USB_OTG_FS_Device_Class_Library + * @{ + */ + +/** @defgroup USBD_AUDIO + * @{ + */ +static uint8_t Init (uint32_t AudioFreq, uint32_t Volume, uint32_t Options); +static uint8_t DeInit (uint32_t Options); +static uint8_t AudioCmd (uint8_t* pbuf, uint32_t Size, uint8_t Cmd); +static uint8_t VolumeCtl (uint8_t Vol); +static uint8_t MuteCtl (uint8_t Cmd); +static uint8_t PeriodicTC (uint8_t Cmd); +static uint8_t GetState (void); + +/** @defgroup USBD_AUDIO_out_if_Private_Variables + * @{ + */ +AUDIO_FOPS_TypeDef AUDIO_OUT_fops = +{ + Init, + DeInit, + AudioCmd, + VolumeCtl, + MuteCtl, + PeriodicTC, + GetState +}; + +static uint8_t AudioState = AUDIO_STATE_INACTIVE; + +/** + * @} + */ + +/** @defgroup USBD_AUDIO_out_if_Private_Functions + * @{ + */ + +/** + * @brief Initialize and configures all required resources for audio play function. + * @param AudioFreq: Statrtup audio frequency. + * @param Volume: Startup volume to be set. + * @param options: specific options passed to low layer function. + * @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else. + */ +static uint8_t Init (uint32_t AudioFreq, uint32_t Volume, uint32_t options) +{ + static uint32_t Initialized = 0; + + /* Check if the low layer has already been initialized */ + if (Initialized == 0) + { + /* Call low layer function */ + if (EVAL_AUDIO_Init(OUTPUT_DEVICE_AUTO, Volume, AudioFreq) != 0) + { + AudioState = AUDIO_STATE_ERROR; + return AUDIO_FAIL; + } + + /* Set the Initialization flag to prevent reinitializing the interface again */ + Initialized = 1; + } + + /* Update the Audio state machine */ + AudioState = AUDIO_STATE_ACTIVE; + + return AUDIO_OK; +} + +/** + * @brief Free all resources used by low layer and stops audio-play function. + * @param Options: options passed to low layer function. + * @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else. + */ +static uint8_t DeInit (uint32_t Options) +{ + /* Update the Audio state machine */ + AudioState = AUDIO_STATE_INACTIVE; + + return AUDIO_OK; +} + +/** + * @brief Play, Stop, Pause or Resume current file. + * @param pbuf: address from which file shoud be played. + * @param Size: size of the current buffer/file. + * @param Cmd: command to be executed, can be: + AUDIO_CMD_PLAY + AUDIO_CMD_PAUSE + AUDIO_CMD_RESUME + AUDIO_CMD_STOP. + * @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else. + */ +static uint8_t AudioCmd (uint8_t* pbuf, uint32_t Size, uint8_t Cmd) +{ + /* Check the current state */ + if ((AudioState == AUDIO_STATE_INACTIVE) || (AudioState == AUDIO_STATE_ERROR)) + { + AudioState = AUDIO_STATE_ERROR; + + return AUDIO_FAIL; + } + + switch (Cmd) + { + /* Process the PLAY command ----------------------------*/ + case AUDIO_CMD_PLAY: + /* If current state is Active or Stopped */ + if ((AudioState == AUDIO_STATE_ACTIVE) || \ + (AudioState == AUDIO_STATE_STOPPED) || \ + (AudioState == AUDIO_STATE_PLAYING)) + { + Audio_MAL_Play((uint32_t)pbuf, (Size/2)); + AudioState = AUDIO_STATE_PLAYING; + + return AUDIO_OK; + } + /* If current state is Paused */ + else if (AudioState == AUDIO_STATE_PAUSED) + { + if (EVAL_AUDIO_PauseResume(AUDIO_RESUME, (uint32_t)pbuf, (Size/2)) != 0) + { + AudioState = AUDIO_STATE_ERROR; + + return AUDIO_FAIL; + } + else + { + AudioState = AUDIO_STATE_PLAYING; + + return AUDIO_OK; + } + } + else /* Not allowed command */ + { + return AUDIO_FAIL; + } + + /* Process the STOP command ----------------------------*/ + case AUDIO_CMD_STOP: + if (AudioState != AUDIO_STATE_PLAYING) + { + /* Unsupported command */ + + return AUDIO_FAIL; + } + else if (EVAL_AUDIO_Stop(CODEC_PDWN_SW) != 0) + { + AudioState = AUDIO_STATE_ERROR; + + return AUDIO_FAIL; + } + else + { + AudioState = AUDIO_STATE_STOPPED; + + return AUDIO_OK; + } + + /* Process the PAUSE command ---------------------------*/ + case AUDIO_CMD_PAUSE: + if (AudioState != AUDIO_STATE_PLAYING) + { + /* Unsupported command */ + return AUDIO_FAIL; + } + else if (EVAL_AUDIO_PauseResume(AUDIO_PAUSE, (uint32_t)pbuf, (Size/2)) != 0) + { + AudioState = AUDIO_STATE_ERROR; + + return AUDIO_FAIL; + } + else + { + AudioState = AUDIO_STATE_PAUSED; + + return AUDIO_OK; + } + + /* Unsupported command ---------------------------------*/ + default: + return AUDIO_FAIL; + } +} + +/** + * @brief Set the volume level in % + * @param Vol: volume level to be set in % (from 0% to 100%) + * @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else. + */ +static uint8_t VolumeCtl (uint8_t Vol) +{ + /* Call low layer volume setting function */ + if (EVAL_AUDIO_VolumeCtl(Vol) != 0) + { + AudioState = AUDIO_STATE_ERROR; + + return AUDIO_FAIL; + } + + return AUDIO_OK; +} + +/** + * @brief Mute or Unmute the audio current output + * @param Cmd: can be 0 to unmute, or 1 to mute. + * @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else. + */ +static uint8_t MuteCtl (uint8_t Cmd) +{ + /* Call low layer mute setting function */ + if (EVAL_AUDIO_Mute(Cmd) != 0) + { + AudioState = AUDIO_STATE_ERROR; + + return AUDIO_FAIL; + } + + return AUDIO_OK; +} + +/** + * @brief + * @param Cmd + * @param + * @retval AUDIO_OK if all operations succeed, AUDIO_FAIL else. + */ +static uint8_t PeriodicTC (uint8_t Cmd) +{ + return AUDIO_OK; +} + +/** + * @brief Return the current state of the audio machine + * @param None + * @retval Current State. + */ +static uint8_t GetState (void) +{ + return AudioState; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/readme.txt new file mode 100644 index 0000000..c90a696 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/Audio/readme.txt @@ -0,0 +1,65 @@ +/*! + \file readme.txt + \brief This file provides the Audio Out (palyback) interface API + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + @brief + The Audio device example allows device to communicate with host (PC) as USB headphone + using isochronous pipe for audio data transfer along with some control commands (i.e. + Mute). + It follows the "Universal Serial Bus Device Class Definition for Audio Devices + Release 1.0 March 18, 1998" defined by the USB Implementers Forum for reprogramming + an application through USB-FS-Device. + Following this specification, it is possible to manage only Full Speed USB mode + (High Speed is not supported). + + This class is natively supported by most Operating Systems (no need for specific + driver setup). + + This example uses the I2S interface to stream audio data from USB Host to the audio + codec implemented on the evaluation board. Then audio stream is output to the Headphone. + + For the GD32VF103V-EVAL-V1.0 board, it possible to use one of the two quartz belwo: + - 14.7456MHz which provides best audio quality + - Standard 25MHz which provides lesser quality. + + The device supports one audio frequency (the host driver manages the sampling rate + conversion from original audio file sampling rate to the sampling rate supported + by the device). It is possible to configure this audio frequency by modifying the + usbd_conf.h file (define USBD_AUDIO_FREQ). It is advised to set high frequencies + to guarantee a high audio quality. + It is also possible to modify the default volume through define DEFAULT_VOLUME in file + usbd_conf.h. + +@note: The audio frequencies leading to non integer number of data (44.1KHz, 22.05KHz, + 11.025KHz...) will not allow an optimum audio quality since one data will be lost + every two/more frames. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Eclipse/cdc_acm/.cproject b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Eclipse/cdc_acm/.cproject new file mode 100644 index 0000000..15589a0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Eclipse/cdc_acm/.cproject @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Eclipse/cdc_acm/.project b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Eclipse/cdc_acm/.project new file mode 100644 index 0000000..25a36f7 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Eclipse/cdc_acm/.project @@ -0,0 +1,618 @@ + + + cdc_acm + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + Examples + 2 + virtual:/virtual + + + Firmware + 2 + virtual:/virtual + + + Utilities + 2 + virtual:/virtual + + + Examples/USBFS + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver + 2 + virtual:/virtual + + + Firmware/RISCV + 2 + virtual:/virtual + + + Utilities/gd32vf103v_eval.c + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.c + + + Utilities/gd32vf103v_eval.h + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.h + + + Examples/USBFS/USB_Device + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Source + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/gd32vf103.h + + + Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + + + Firmware/GD32VF103_usbfs_driver/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver/Source + 2 + virtual:/virtual + + + Firmware/RISCV/drivers + 2 + virtual:/virtual + + + Firmware/RISCV/env_Eclipse + 2 + virtual:/virtual + + + Firmware/RISCV/stubs + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/CDC_ACM + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_host.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_host.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usbh_int.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usbh_int.h + + + Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbh_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbh_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbh_enum.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbh_enum.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbh_pipe.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbh_pipe.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbh_transc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbh_transc.h + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c + + + Firmware/RISCV/drivers/n200_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_eclic.h + + + Firmware/RISCV/drivers/n200_func.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.c + + + Firmware/RISCV/drivers/n200_func.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.h + + + Firmware/RISCV/drivers/n200_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_timer.h + + + Firmware/RISCV/drivers/riscv_bits.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_bits.h + + + Firmware/RISCV/drivers/riscv_const.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_const.h + + + Firmware/RISCV/drivers/riscv_encoding.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_encoding.h + + + Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + + + Firmware/RISCV/env_Eclipse/entry.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/entry.S + + + Firmware/RISCV/env_Eclipse/handlers.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/handlers.c + + + Firmware/RISCV/env_Eclipse/init.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/init.c + + + Firmware/RISCV/env_Eclipse/start.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/start.S + + + Firmware/RISCV/env_Eclipse/your_printf.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/your_printf.c + + + Firmware/RISCV/stubs/_exit.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/_exit.c + + + Firmware/RISCV/stubs/close.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/close.c + + + Firmware/RISCV/stubs/fstat.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/fstat.c + + + Firmware/RISCV/stubs/isatty.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/isatty.c + + + Firmware/RISCV/stubs/lseek.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/lseek.c + + + Firmware/RISCV/stubs/read.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/read.c + + + Firmware/RISCV/stubs/sbrk.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/sbrk.c + + + Firmware/RISCV/stubs/stub.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/stub.h + + + Firmware/RISCV/stubs/write.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write.c + + + Firmware/RISCV/stubs/write_hex.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write_hex.c + + + Examples/USBFS/USB_Device/CDC_ACM/Include + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/CDC_ACM/Source + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/CDC_ACM/Include/cdc_acm_core.h + 1 + PARENT-2-PROJECT_LOC/Include/cdc_acm_core.h + + + Examples/USBFS/USB_Device/CDC_ACM/Include/gd32vf103_it.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_it.h + + + Examples/USBFS/USB_Device/CDC_ACM/Include/gd32vf103_libopt.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_libopt.h + + + Examples/USBFS/USB_Device/CDC_ACM/Include/usb_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usb_conf.h + + + Examples/USBFS/USB_Device/CDC_ACM/Include/usbd_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usbd_conf.h + + + Examples/USBFS/USB_Device/CDC_ACM/Source/app.c + 1 + PARENT-2-PROJECT_LOC/Source/app.c + + + Examples/USBFS/USB_Device/CDC_ACM/Source/cdc_acm_core.c + 1 + PARENT-2-PROJECT_LOC/Source/cdc_acm_core.c + + + Examples/USBFS/USB_Device/CDC_ACM/Source/gd32vf103_hw.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_hw.c + + + Examples/USBFS/USB_Device/CDC_ACM/Source/gd32vf103_it.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_it.c + + + Examples/USBFS/USB_Device/CDC_ACM/Source/system_gd32vf103.c + 1 + PARENT-2-PROJECT_LOC/Source/system_gd32vf103.c + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Eclipse/cdc_acm/.settings/language.settings.xml b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Eclipse/cdc_acm/.settings/language.settings.xml new file mode 100644 index 0000000..d2e02ec --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Eclipse/cdc_acm/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/cdc_acm_core.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/cdc_acm_core.h new file mode 100644 index 0000000..96c2111 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/cdc_acm_core.h @@ -0,0 +1,133 @@ +/*! + \file cdc_acm_core.h + \brief the header file of IAP driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef CDC_ACM_CORE_H +#define CDC_ACM_CORE_H + +#include "usbd_enum.h" +#include "usb_ch9_std.h" +#include "usbd_transc.h" + + +#define USB_DESCTYPE_CS_INTERFACE 0x24 +#define USB_CDC_ACM_CONFIG_DESC_SIZE 0x43 + +#define CDC_ACM_DESC_SIZE 0x3A + +#define CDC_ACM_DESC_TYPE 0x21 + +#define SEND_ENCAPSULATED_COMMAND 0x00 +#define GET_ENCAPSULATED_RESPONSE 0x01 +#define SET_COMM_FEATURE 0x02 +#define GET_COMM_FEATURE 0x03 +#define CLEAR_COMM_FEATURE 0x04 +#define SET_LINE_CODING 0x20 +#define GET_LINE_CODING 0x21 +#define SET_CONTROL_LINE_STATE 0x22 +#define SEND_BREAK 0x23 +#define NO_CMD 0xFF + +#pragma pack(1) + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: header function descriptor */ + uint16_t bcdCDC; /*!< bcdCDC: low byte of spec release number (CDC1.10) */ +} usb_descriptor_header_function_struct; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: call management function descriptor */ + uint8_t bmCapabilities; /*!< bmCapabilities: D0 is reset, D1 is ignored */ + uint8_t bDataInterface; /*!< bDataInterface: 1 interface used for call management */ +} usb_descriptor_call_managment_function_struct; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: abstract control management desc */ + uint8_t bmCapabilities; /*!< bmCapabilities: D1 */ +} usb_descriptor_acm_function_struct; + +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint8_t bDescriptorSubtype; /*!< bDescriptorSubtype: union func desc */ + uint8_t bMasterInterface; /*!< bMasterInterface: communication class interface */ + uint8_t bSlaveInterface0; /*!< bSlaveInterface0: data class interface */ +} usb_descriptor_union_function_struct; + +#pragma pack() + +typedef struct +{ + usb_desc_config config; + usb_desc_itf cdc_loopback_interface; + usb_descriptor_header_function_struct cdc_loopback_header; + usb_descriptor_call_managment_function_struct cdc_loopback_call_managment; + usb_descriptor_acm_function_struct cdc_loopback_acm; + usb_descriptor_union_function_struct cdc_loopback_union; + usb_desc_ep cdc_loopback_cmd_endpoint; + usb_desc_itf cdc_loopback_data_interface; + usb_desc_ep cdc_loopback_out_endpoint; + usb_desc_ep cdc_loopback_in_endpoint; +} usb_descriptor_configuration_set_struct; + +extern void* const usbd_strings[USB_STRING_COUNT]; +extern const usb_desc_dev device_descriptor; +extern usb_descriptor_configuration_set_struct configuration_descriptor; + +extern usb_class_core usbd_cdc_cb; + +/* function declarations */ +/* initialize the CDC ACM device */ +uint8_t cdc_acm_init(usb_dev *pudev, uint8_t config_index); +/* de-initialize the CDC ACM device */ +uint8_t cdc_acm_deinit(usb_dev *pudev, uint8_t config_index); +/* handle the CDC ACM class-specific requests */ +uint8_t cdc_acm_req_handler(usb_dev *pudev, usb_req *req); +/* handle CDC ACM data */ +uint8_t cdc_acm_data_in_handler(usb_dev *pudev, uint8_t ep_id); +uint8_t cdc_acm_data_out_handler(usb_dev *pudev, uint8_t ep_id); + +/* receive CDC ACM data */ +void cdc_acm_data_receive(usb_dev *pudev); +/* send CDC ACM data */ +void cdc_acm_data_send(usb_dev *pudev, uint32_t data_len); +/* command data received on control endpoint */ +uint8_t cdc_acm_EP0_RxReady(usb_dev *pudev); + +#endif /* CDC_ACM_CORE_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/gd32vf103_it.h new file mode 100644 index 0000000..cc50acf --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/gd32vf103_it.h @@ -0,0 +1,54 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_core.h" + +/* function declarations */ +/* this function handles USB wakeup interrupt handler */ +void USBFS_WKUP_IRQHandler(void); +/* this function handles USBFS IRQ Handler */ +void USBFS_IRQHandler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/gd32vf103_libopt.h new file mode 100644 index 0000000..60680cf --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/usb_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/usb_conf.h new file mode 100644 index 0000000..b36f0be --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/usb_conf.h @@ -0,0 +1,121 @@ +/*! + \file usb_conf.h + \brief USBFS driver basic configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_CONF_H +#define __USB_CONF_H + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#include + +#ifdef USE_USB_FS + #define USB_FS_CORE +#endif + +#ifdef USE_USB_HS + #define USB_HS_CORE +#endif + +#ifdef USB_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 64 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 0 + #define TX3_FIFO_FS_SIZE 0 +#endif /* USB_FS_CORE */ + +#ifdef USB_HS_CORE + #define RX_FIFO_HS_SIZE 512 + #define TX0_FIFO_HS_SIZE 128 + #define TX1_FIFO_HS_SIZE 372 + #define TX2_FIFO_HS_SIZE 0 + #define TX3_FIFO_HS_SIZE 0 + #define TX4_FIFO_HS_SIZE 0 + #define TX5_FIFO_HS_SIZE 0 + + #ifdef USE_ULPI_PHY + #define USB_OTG_ULPI_PHY_ENABLED + #endif + + #ifdef USE_EMBEDDED_PHY + #define USB_OTG_EMBEDDED_PHY_ENABLED + #endif + + #define USB_OTG_HS_INTERNAL_DMA_ENABLED + #define USB_OTG_HS_DEDICATED_EP1_ENABLED +#endif /* USB_HS_CORE */ + +#define USB_SOF_OUTPUT 1 +#define USB_LOW_POWER 1 + +//#define VBUS_SENSING_ENABLED + +//#define USE_HOST_MODE +#define USE_DEVICE_MODE +//#define USE_OTG_MODE + +#ifndef USB_FS_CORE + #ifndef USB_HS_CORE + #error "USB_HS_CORE or USB_FS_CORE should be defined" + #endif +#endif + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_HS + #ifndef USE_USB_FS + #error "USE_USB_HS or USE_USB_FS should be defined" + #endif +#endif + +/****************** C Compilers dependant keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned(4))) + #define __ALIGN_BEGIN + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + + +#endif /* __USB_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/usbd_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/usbd_conf.h new file mode 100644 index 0000000..087f5a4 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Include/usbd_conf.h @@ -0,0 +1,55 @@ +/*! + \file usbd_conf.h + \brief the header file of USB device-mode configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_CONF_H +#define __USBD_CONF_H + +#include "usb_conf.h" + +#define USBD_CFG_MAX_NUM 1 +#define USBD_ITF_MAX_NUM 1 + +#define USB_STR_DESC_MAX_SIZE 64 + +#define USB_STRING_COUNT 4U + +/* endpoint count used by the CDC ACM device */ +#define CDC_ACM_CMD_EP EP2_IN +#define CDC_ACM_DATA_IN_EP EP1_IN +#define CDC_ACM_DATA_OUT_EP EP3_OUT + +#define CDC_ACM_CMD_PACKET_SIZE 8 +#define CDC_ACM_DATA_PACKET_SIZE 64 + +#endif /* __USBD_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/app.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/app.c new file mode 100644 index 0000000..4b9ff25 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/app.c @@ -0,0 +1,98 @@ +/*! + \file main.c + \brief USB CDC ACM device + + \version 2019-6-5, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + +#include "drv_usb_hw.h" +#include "cdc_acm_core.h" +#include +#include +#include + + +extern uint8_t packet_sent, packet_receive; +extern uint32_t receive_length; + +usb_core_driver USB_OTG_dev = +{ + .dev = { + .desc = { + .dev_desc = (uint8_t *)&device_descriptor, + .config_desc = (uint8_t *)&configuration_descriptor, + .strings = usbd_strings, + } + } +}; + + +/*! + \brief main routine will construct a USB keyboard + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + eclic_global_interrupt_enable(); + + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); + + usb_rcu_config(); + + usb_timer_init(); + + usb_intr_config(); + + usbd_init (&USB_OTG_dev, USB_CORE_ENUM_FS, &usbd_cdc_cb); + + /* check if USB device is enumerated successfully */ + while (USBD_CONFIGURED != USB_OTG_dev.dev.cur_status) { + } + + while (1) { + if (USBD_CONFIGURED == USB_OTG_dev.dev.cur_status) { + if (1 == packet_receive && 1 == packet_sent) { + packet_sent = 0; + /* receive datas from the host when the last packet datas have sent to the host */ + cdc_acm_data_receive(&USB_OTG_dev); + } else { + if (0 != receive_length) { + /* send receive datas */ + cdc_acm_data_send(&USB_OTG_dev, receive_length); + receive_length = 0; + } + } + } + } +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/cdc_acm_core.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/cdc_acm_core.c new file mode 100644 index 0000000..4a3b59a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/cdc_acm_core.c @@ -0,0 +1,441 @@ +/*! + \file cdc_acm_core.c + \brief CDC ACM driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "cdc_acm_core.h" + + +#define USBD_VID 0x28e9 +#define USBD_PID 0x018a + +static uint32_t cdc_cmd = 0xFFU; + +uint8_t usb_data_buffer[CDC_ACM_DATA_PACKET_SIZE]; +uint8_t usb_cmd_buffer[CDC_ACM_CMD_PACKET_SIZE]; + +__IO uint8_t packet_sent = 1U; +__IO uint8_t packet_receive = 1U; +__IO uint32_t receive_length = 0U; + +//usbd_int_cb_struct *usbd_int_fops = NULL; + +typedef struct +{ + uint32_t dwDTERate; /* data terminal rate */ + uint8_t bCharFormat; /* stop bits */ + uint8_t bParityType; /* parity */ + uint8_t bDataBits; /* data bits */ +}line_coding_struct; + +line_coding_struct linecoding = +{ + 115200, /* baud rate */ + 0x00, /* stop bits - 1 */ + 0x00, /* parity - none */ + 0x08 /* num of bits 8 */ +}; + +/* note:it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +const usb_desc_dev device_descriptor = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200, + .bDeviceClass = 0x02, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +usb_descriptor_configuration_set_struct configuration_descriptor = +{ + .config = + { + .header = + { + .bLength = USB_CFG_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_CDC_ACM_CONFIG_DESC_SIZE, + .bNumInterfaces = 0x02, + .bConfigurationValue = 0x01, + .iConfiguration = 0x00, + .bmAttributes = 0x80, + .bMaxPower = 0x32 + }, + + .cdc_loopback_interface = + { + .header = + { + .bLength = USB_ITF_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x01, + .bInterfaceClass = 0x02, + .bInterfaceSubClass = 0x02, + .bInterfaceProtocol = 0x01, + .iInterface = 0x00 + }, + + .cdc_loopback_header = + { + .header = + { + .bLength = sizeof(usb_descriptor_header_function_struct), + .bDescriptorType = USB_DESCTYPE_CS_INTERFACE + }, + .bDescriptorSubtype = 0x00, + .bcdCDC = 0x0110 + }, + + .cdc_loopback_call_managment = + { + .header = + { + .bLength = sizeof(usb_descriptor_call_managment_function_struct), + .bDescriptorType = USB_DESCTYPE_CS_INTERFACE + }, + .bDescriptorSubtype = 0x01, + .bmCapabilities = 0x00, + .bDataInterface = 0x01 + }, + + .cdc_loopback_acm = + { + .header = + { + .bLength = sizeof(usb_descriptor_acm_function_struct), + .bDescriptorType = USB_DESCTYPE_CS_INTERFACE + }, + .bDescriptorSubtype = 0x02, + .bmCapabilities = 0x02, + }, + + .cdc_loopback_union = + { + .header = + { + .bLength = sizeof(usb_descriptor_union_function_struct), + .bDescriptorType = USB_DESCTYPE_CS_INTERFACE + }, + .bDescriptorSubtype = 0x06, + .bMasterInterface = 0x00, + .bSlaveInterface0 = 0x01, + }, + + .cdc_loopback_cmd_endpoint = + { + .header = + { + .bLength = USB_EP_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = CDC_ACM_CMD_EP, + .bmAttributes = 0x03, + .wMaxPacketSize = CDC_ACM_CMD_PACKET_SIZE, + .bInterval = 0x0A + }, + + .cdc_loopback_data_interface = + { + .header = + { + .bLength = USB_ITF_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x01, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x02, + .bInterfaceClass = 0x0A, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00 + }, + + .cdc_loopback_out_endpoint = + { + .header = + { + .bLength = USB_EP_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = CDC_ACM_DATA_OUT_EP, + .bmAttributes = 0x02, + .wMaxPacketSize = CDC_ACM_DATA_PACKET_SIZE, + .bInterval = 0x00 + }, + + .cdc_loopback_in_endpoint = + { + .header = + { + .bLength = USB_EP_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = CDC_ACM_DATA_IN_EP, + .bmAttributes = 0x02, + .wMaxPacketSize = CDC_ACM_DATA_PACKET_SIZE, + .bInterval = 0x00 + } +}; + +/* USB language ID Descriptor */ +const usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +void* const usbd_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = USBD_STRING_DESC("GigaDevice"), + [STR_IDX_PRODUCT] = USBD_STRING_DESC("GD32 USB CDC ACM in FS Mode"), + [STR_IDX_SERIAL] = USBD_STRING_DESC("GD32XXX-3.0.0-7z8x9yer") +}; + +/*! + \brief initialize the CDC ACM device + \param[in] pudev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +uint8_t cdc_acm_init (usb_dev *pudev, uint8_t config_index) +{ + /* initialize the data Tx/Rx endpoint */ + usbd_ep_setup(pudev, &(configuration_descriptor.cdc_loopback_in_endpoint)); + usbd_ep_setup(pudev, &(configuration_descriptor.cdc_loopback_out_endpoint)); + + /* initialize the command Tx endpoint */ + usbd_ep_setup(pudev, &(configuration_descriptor.cdc_loopback_cmd_endpoint)); + + return USBD_OK; +} + +/*! + \brief de-initialize the CDC ACM device + \param[in] pudev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +uint8_t cdc_acm_deinit (usb_dev *pudev, uint8_t config_index) +{ + /* deinitialize the data Tx/Rx endpoint */ + usbd_ep_clear(pudev, CDC_ACM_DATA_IN_EP); + usbd_ep_clear(pudev, CDC_ACM_DATA_OUT_EP); + + /* deinitialize the command Tx endpoint */ + usbd_ep_clear(pudev, CDC_ACM_CMD_EP); + + return USBD_OK; +} + +/*! + \brief handle CDC ACM data + \param[in] pudev: pointer to USB device instance + \param[in] rx_tx: data transfer direction: + \arg USBD_TX + \arg USBD_RX + \param[in] ep_id: endpoint identifier + \param[out] none + \retval USB device operation status +*/ +uint8_t cdc_acm_data_out_handler (usb_dev *pudev, uint8_t ep_id) +{ + if ((EP0_OUT & 0x7F) == ep_id) + { + cdc_acm_EP0_RxReady (pudev); + } + else if ((CDC_ACM_DATA_OUT_EP & 0x7F) == ep_id) + { + packet_receive = 1; + receive_length = usbd_rxcount_get(pudev, CDC_ACM_DATA_OUT_EP); + + return USBD_OK; + } + return USBD_FAIL; +} + +uint8_t cdc_acm_data_in_handler (usb_dev *pudev, uint8_t ep_id) +{ + if ((CDC_ACM_DATA_IN_EP & 0x7F) == ep_id) + { + usb_transc *transc = &pudev->dev.transc_in[EP_ID(ep_id)]; + + if ((transc->xfer_len % transc->max_len == 0) && (transc->xfer_len != 0)) { + usbd_ep_send (pudev, ep_id, NULL, 0U); + } else { + packet_sent = 1; + } + return USBD_OK; + } + return USBD_FAIL; +} + + +/*! + \brief handle the CDC ACM class-specific requests + \param[in] pudev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +uint8_t cdc_acm_req_handler (usb_dev *pudev, usb_req *req) +{ + switch (req->bRequest) + { + case SEND_ENCAPSULATED_COMMAND: + break; + case GET_ENCAPSULATED_RESPONSE: + break; + case SET_COMM_FEATURE: + break; + case GET_COMM_FEATURE: + break; + case CLEAR_COMM_FEATURE: + break; + case SET_LINE_CODING: + /* set the value of the current command to be processed */ + cdc_cmd = req->bRequest; + /* enable EP0 prepare to receive command data packet */ + pudev->dev.transc_out[0].xfer_buf = usb_cmd_buffer; + pudev->dev.transc_out[0].remain_len = req->wLength; + break; + case GET_LINE_CODING: + usb_cmd_buffer[0] = (uint8_t)(linecoding.dwDTERate); + usb_cmd_buffer[1] = (uint8_t)(linecoding.dwDTERate >> 8); + usb_cmd_buffer[2] = (uint8_t)(linecoding.dwDTERate >> 16); + usb_cmd_buffer[3] = (uint8_t)(linecoding.dwDTERate >> 24); + usb_cmd_buffer[4] = linecoding.bCharFormat; + usb_cmd_buffer[5] = linecoding.bParityType; + usb_cmd_buffer[6] = linecoding.bDataBits; + /* send the request data to the host */ + pudev->dev.transc_in[0].xfer_buf = usb_cmd_buffer; + pudev->dev.transc_in[0].remain_len = req->wLength; + break; + case SET_CONTROL_LINE_STATE: + break; + case SEND_BREAK: + break; + default: + break; + } + + return USBD_OK; +} + +/*! + \brief receive CDC ACM data + \param[in] pudev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +void cdc_acm_data_receive(usb_dev *pudev) +{ + packet_receive = 0; + + usbd_ep_recev(pudev, CDC_ACM_DATA_OUT_EP, (uint8_t*)(usb_data_buffer), CDC_ACM_DATA_PACKET_SIZE); +} + +/*! + \brief send CDC ACM data + \param[in] pudev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +void cdc_acm_data_send (usb_dev *pudev, uint32_t data_len) +{ + /* limit the transfer data length */ + if (data_len <= CDC_ACM_DATA_PACKET_SIZE) { + packet_sent = 0; + usbd_ep_send(pudev, CDC_ACM_DATA_IN_EP, (uint8_t*)(usb_data_buffer), data_len); + } +} + +/*! + \brief command data received on control endpoint + \param[in] pudev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +uint8_t cdc_acm_EP0_RxReady (usb_dev *pudev) +{ + if (NO_CMD != cdc_cmd) { + /* process the command data */ + linecoding.dwDTERate = (uint32_t)(usb_cmd_buffer[0] | + (usb_cmd_buffer[1] << 8) | + (usb_cmd_buffer[2] << 16) | + (usb_cmd_buffer[3] << 24)); + + linecoding.bCharFormat = usb_cmd_buffer[4]; + linecoding.bParityType = usb_cmd_buffer[5]; + linecoding.bDataBits = usb_cmd_buffer[6]; + + cdc_cmd = NO_CMD; + } + + return USBD_OK; +} + + +usb_class_core usbd_cdc_cb = { + .command = NO_CMD, + .alter_set = 0, + + .init = cdc_acm_init, + .deinit = cdc_acm_deinit, + .req_proc = cdc_acm_req_handler, + .data_in = cdc_acm_data_in_handler, + .data_out = cdc_acm_data_out_handler +}; diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/gd32vf103_hw.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/gd32vf103_hw.c new file mode 100644 index 0000000..204c678 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/gd32vf103_hw.c @@ -0,0 +1,206 @@ +/*! + \file gd32vf103_hw.c + \brief USB hardware configuration for GD32VF103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include +#include +#include + + +#define TIM_MSEC_DELAY 0x01 +#define TIM_USEC_DELAY 0x02 + +__IO uint32_t delay_time = 0; +__IO uint32_t timer_prescaler; +__IO uint32_t usbfs_prescaler = 0; + +static void hw_time_set (uint8_t unit); +static void hw_delay (uint32_t ntime, uint8_t unit); + + +/*! + \brief configure USB clock + \param[in] none + \param[out] none + \retval none +*/ +void usb_rcu_config(void) +{ + uint32_t system_clock = rcu_clock_freq_get(CK_SYS); + + if (system_clock == 48000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1; + timer_prescaler = 3; + } else if (system_clock == 72000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1_5; + timer_prescaler = 5; + } else if (system_clock == 96000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV2; + timer_prescaler = 7; + } else { + /* reserved */ + } + + rcu_usb_clock_config(usbfs_prescaler); + rcu_periph_clock_enable(RCU_USBFS); +} + +/*! + \brief configure USB interrupt + \param[in] none + \param[out] none + \retval none +*/ +void usb_intr_config(void) +{ + eclic_irq_enable((uint8_t)USBFS_IRQn, 1, 0); + + /* enable the power module clock */ + rcu_periph_clock_enable(RCU_PMU); + + /* USB wakeup EXTI line configuration */ + exti_interrupt_flag_clear(EXTI_18); + exti_init(EXTI_18, EXTI_INTERRUPT, EXTI_TRIG_RISING); + exti_interrupt_enable(EXTI_18); + + eclic_irq_enable((uint8_t)USBFS_WKUP_IRQn, 3, 0); +} + +/*! + \brief initializes delay unit using Timer2 + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_init (void) +{ + rcu_periph_clock_enable(RCU_TIMER2); + + eclic_irq_enable(TIMER2_IRQn, 2, 0); +} + +/*! + \brief delay in micro seconds + \param[in] usec: value of delay required in micro seconds + \param[out] none + \retval none +*/ +void usb_udelay (const uint32_t usec) +{ + hw_delay(usec, TIM_USEC_DELAY); +} + +/*! + \brief delay in milli seconds + \param[in] msec: value of delay required in milli seconds + \param[out] none + \retval none +*/ +void usb_mdelay (const uint32_t msec) +{ + hw_delay(msec, TIM_MSEC_DELAY); +} + +/*! + \brief time base IRQ + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_irq (void) +{ + if (RESET != timer_flag_get(TIMER2, TIMER_FLAG_UP)){ + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + + if (delay_time > 0x00U){ + delay_time--; + } else { + timer_disable(TIMER2); + } + } +} + +/*! + \brief delay routine based on TIM0 + \param[in] nTime: delay Time + \param[in] unit: delay Time unit = mili sec / micro sec + \param[out] none + \retval none +*/ +static void hw_delay(uint32_t ntime, uint8_t unit) +{ + delay_time = ntime; + + hw_time_set(unit); + + while (0U != delay_time) { + } + + timer_disable(TIMER2); +} + +/*! + \brief configures TIM0 for delay routine based on TIM0 + \param[in] unit: msec /usec + \param[out] none + \retval none +*/ +static void hw_time_set(uint8_t unit) +{ + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER2); + timer_deinit(TIMER2); + + if(TIM_USEC_DELAY == unit) { + timer_initpara.period = 11; + } else if(TIM_MSEC_DELAY == unit) { + timer_initpara.period = 11999; + } + + timer_initpara.prescaler = timer_prescaler; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER2, &timer_initpara); + + timer_update_event_enable(TIMER2); + timer_interrupt_enable(TIMER2,TIMER_INT_UP); + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + timer_update_source_config(TIMER2, TIMER_UPDATE_SRC_GLOBAL); + + /* TIMER2 counter enable */ + timer_enable(TIMER2); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/gd32vf103_it.c new file mode 100644 index 0000000..8cae80e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/gd32vf103_it.c @@ -0,0 +1,96 @@ +/*! + \file gd32vf103_it.c + \brief main interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usbd_int.h" +#include "drv_usb_hw.h" +#include "gd32vf103_it.h" + +extern usb_core_driver USB_OTG_dev; +extern uint32_t usbfs_prescaler; + +extern void usb_timer_irq(void); + +/*! + \brief this function handles USBD interrupt + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_IRQHandler (void) +{ + usbd_isr (&USB_OTG_dev); +} + +/*! + \brief this function handles EXTI0_IRQ Handler + \param[in] none + \param[out] none + \retval none +*/ +void EXTI0_IRQHandler(void) +{ + +} + +/*! + \brief this function handles USBD wakeup interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_WKUP_IRQHandler(void) +{ + if (USB_OTG_dev.bp.low_power) { + SystemInit(); + + rcu_usb_clock_config(usbfs_prescaler); + + rcu_periph_clock_enable(RCU_USBFS); + + usb_clock_active(&USB_OTG_dev); + } + + exti_interrupt_flag_clear(EXTI_18); +} + +/*! + \brief this function handles Timer0 updata interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void TIMER2_IRQHandler(void) +{ + usb_timer_irq(); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/system_gd32vf103.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/system_gd32vf103.c new file mode 100644 index 0000000..05e5205 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/Source/system_gd32vf103.c @@ -0,0 +1,998 @@ +/*! + \file system_gd32vf103.h + \brief RISC-V Device Peripheral Access Layer Source File for + GD32VF103 Device Series + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* This file refers the RISC-V standard, some adjustments are made according to GigaDevice chips */ + +#include "gd32vf103.h" + +/* system frequency define */ +#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */ + +/* select a system clock by uncommenting the following line */ +/* use IRC8M */ +//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000) + +/********************************************************************/ +//#define __SYSTEM_CLOCK_HXTAL (HXTAL_VALUE) +//#define __SYSTEM_CLOCK_24M_PLL_HXTAL (uint32_t)(24000000) +/********************************************************************/ + +//#define __SYSTEM_CLOCK_36M_PLL_HXTAL (uint32_t)(36000000) +//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_56M_PLL_HXTAL (uint32_t)(56000000) +//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000) +#define __SYSTEM_CLOCK_96M_PLL_HXTAL (uint32_t)(96000000) +//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000) + +#define SEL_IRC8M 0x00U +#define SEL_HXTAL 0x01U +#define SEL_PLL 0x02U + +/* set the system clock frequency and declare the system clock configuration function */ +#ifdef __SYSTEM_CLOCK_48M_PLL_IRC8M +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_IRC8M; +static void system_clock_48m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M; +static void system_clock_72m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_IRC8M; +static void system_clock_108m_irc8m(void); + +#elif defined (__SYSTEM_CLOCK_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; +static void system_clock_hxtal(void); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_24M_PLL_HXTAL; +static void system_clock_24m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_36M_PLL_HXTAL; +static void system_clock_36m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_HXTAL; +static void system_clock_48m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_56M_PLL_HXTAL; +static void system_clock_56m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL; +static void system_clock_72m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_HXTAL; +static void system_clock_96m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL; +static void system_clock_108m_hxtal(void); +#else +uint32_t SystemCoreClock = IRC8M_VALUE; +#endif /* __SYSTEM_CLOCK_48M_PLL_IRC8M */ + +/* configure the system clock */ +static void system_clock_config(void); + +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ +#ifdef __SYSTEM_CLOCK_HXTAL + system_clock_hxtal(); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) + system_clock_24m_hxtal(); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) + system_clock_36m_hxtal(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) + system_clock_48m_hxtal(); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) + system_clock_56m_hxtal(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) + system_clock_72m_hxtal(); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) + system_clock_96m_hxtal(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) + system_clock_108m_hxtal(); + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) + system_clock_48m_irc8m(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) + system_clock_72m_irc8m(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) + system_clock_108m_irc8m(); +#endif /* __SYSTEM_CLOCK_HXTAL */ +} + +/*! + \brief setup the microcontroller system, initialize the system + \param[in] none + \param[out] none + \retval none +*/ +void SystemInit(void) +{ + /* reset the RCC clock configuration to the default reset state */ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* reset SCS, AHBPSC, APB1PSC, APB2PSC, ADCPSC, CKOUT0SEL bits */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_ADCPSC_2 | RCU_CFG0_CKOUT0SEL); + + /* reset HXTALEN, CKMEN, PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + + /* Reset HXTALBPS bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* reset PLLSEL, PREDV0_LSB, PLLMF, USBFSPSC bits */ + + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_PLLMF_4); + RCU_CFG1 = 0x00000000U; + + /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x00FF0000U; + + /* Configure the System clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */ + system_clock_config(); +} + +/*! + \brief update the SystemCoreClock with current core clock retrieved from cpu registers + \param[in] none + \param[out] none + \retval none +*/ +void SystemCoreClockUpdate(void) +{ + uint32_t scss; + uint32_t pllsel, predv0sel, pllmf, ck_src; + uint32_t predv0, predv1, pll1mf; + + scss = GET_BITS(RCU_CFG0, 2, 3); + + switch (scss) + { + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + SystemCoreClock = IRC8M_VALUE; + break; + + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + + if(RCU_PLLSRC_IRC8M_DIV2 == pllsel){ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE / 2U; + }else{ + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + + if(pllmf >= 15U){ + pllmf += 1U; + }else{ + pllmf += 2U; + } + + SystemCoreClock = ck_src * pllmf; + + if(15U == pllmf){ + /* PLL source clock multiply by 6.5 */ + SystemCoreClock = ck_src * 6U + ck_src / 2U; + } + + break; + + /* IRC8M is selected as CK_SYS */ + default: + SystemCoreClock = IRC8M_VALUE; + break; + } +} + +#ifdef __SYSTEM_CLOCK_HXTAL +/*! + \brief configure the system clock to HXTAL + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select HXTAL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; + + /* wait until HXTAL is selected as system clock */ + while(0 == (RCU_CFG0 & RCU_SCSS_HXTAL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +/*! + \brief configure the system clock to 24M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_24m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 6 = 24 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +/*! + \brief configure the system clock to 36M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_36m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 9 = 36 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +/*! + \brief configure the system clock to 48M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL12); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +/*! + \brief configure the system clock to 56M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_56m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 14 = 56 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL14); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +/*! + \brief configure the system clock to 72M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL18); + + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +/*! + \brief configure the system clock to 96M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_96m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + if(HXTAL_VALUE==25000000){ + + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +/*! + \brief configure the system clock to 108M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ + +static void system_clock_108m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL27); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PREDV1_DIV5 | RCU_PLL1_MUL8 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 | RCU_PREDV1_DIV2 | RCU_PLL1_MUL20 | RCU_PLL2_MUL20); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL2 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + + } + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +/*! + \brief configure the system clock to 48M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL12; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +/*! + \brief configure the system clock to 72M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL18; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +/*! + \brief configure the system clock to 108M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL27; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/readme.txt new file mode 100644 index 0000000..461a43d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/CDC_ACM/readme.txt @@ -0,0 +1,56 @@ +/*! + \file readme.txt + \brief description of the USB CDC_ACM demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board,it provides a description of + how to use the USBFS. + + The target of this example is to read data from and write data to USB devices using +the CDC protocol. + + It makes the USB device look like a serial port (NO serial cable connectors: You +can see the data transferred to and from via USB instead of USB-to-USART bridge connection). + + This example loops back the contents of a text file over usb port. To run the example, +Type a message using the Pc's keyboard. Any data that shows in HyperTerminal is received +from the device. + + This CDC_ACM Demo provides the firmware examples for the GD32VF103V families. + + - OUT transfers (receive the data from the PC to GD32): + When a packet is received from the PC on the OUT pipe (EP3),by calling cdc_acm_data_receive() + it will be stored in the usb_data_buffer[]. + + - IN transfers (to send the data received from the GD32 to the PC): + When a packet is sent from the GD32 on the IN pipe (EP1), by calling cdc_acm_data_send(), + put the data into the usb_data_buffer[] buffer for sending data to the host. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Eclipse/usbd_dfu/.cproject b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Eclipse/usbd_dfu/.cproject new file mode 100644 index 0000000..c2537dc --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Eclipse/usbd_dfu/.cproject @@ -0,0 +1,202 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Eclipse/usbd_dfu/.project b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Eclipse/usbd_dfu/.project new file mode 100644 index 0000000..6901089 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Eclipse/usbd_dfu/.project @@ -0,0 +1,608 @@ + + + usbd_dfu + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + Examples + 2 + virtual:/virtual + + + Firmware + 2 + virtual:/virtual + + + Utilities + 2 + virtual:/virtual + + + Examples/USBFS + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver + 2 + virtual:/virtual + + + Firmware/RISCV + 2 + virtual:/virtual + + + Utilities/gd32vf103v_eval.c + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.c + + + Utilities/gd32vf103v_eval.h + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.h + + + Examples/USBFS/USB_Device + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Source + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/gd32vf103.h + + + Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + + + Firmware/GD32VF103_usbfs_driver/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver/Source + 2 + virtual:/virtual + + + Firmware/RISCV/drivers + 2 + virtual:/virtual + + + Firmware/RISCV/env_Eclipse + 2 + virtual:/virtual + + + Firmware/RISCV/stubs + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/DFU + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h + + + Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c + + + Firmware/RISCV/drivers/n200_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_eclic.h + + + Firmware/RISCV/drivers/n200_func.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.c + + + Firmware/RISCV/drivers/n200_func.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.h + + + Firmware/RISCV/drivers/n200_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_timer.h + + + Firmware/RISCV/drivers/riscv_bits.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_bits.h + + + Firmware/RISCV/drivers/riscv_const.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_const.h + + + Firmware/RISCV/drivers/riscv_encoding.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_encoding.h + + + Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + + + Firmware/RISCV/env_Eclipse/entry.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/entry.S + + + Firmware/RISCV/env_Eclipse/handlers.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/handlers.c + + + Firmware/RISCV/env_Eclipse/init.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/init.c + + + Firmware/RISCV/env_Eclipse/start.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/start.S + + + Firmware/RISCV/env_Eclipse/your_printf.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/your_printf.c + + + Firmware/RISCV/stubs/_exit.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/_exit.c + + + Firmware/RISCV/stubs/close.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/close.c + + + Firmware/RISCV/stubs/fstat.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/fstat.c + + + Firmware/RISCV/stubs/isatty.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/isatty.c + + + Firmware/RISCV/stubs/lseek.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/lseek.c + + + Firmware/RISCV/stubs/read.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/read.c + + + Firmware/RISCV/stubs/sbrk.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/sbrk.c + + + Firmware/RISCV/stubs/stub.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/stub.h + + + Firmware/RISCV/stubs/write.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write.c + + + Firmware/RISCV/stubs/write_hex.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write_hex.c + + + Examples/USBFS/USB_Device/DFU/Include + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/DFU/Source + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/DFU/Include/dfu_core.h + 1 + PARENT-2-PROJECT_LOC/Include/dfu_core.h + + + Examples/USBFS/USB_Device/DFU/Include/dfu_mal.h + 1 + PARENT-2-PROJECT_LOC/Include/dfu_mal.h + + + Examples/USBFS/USB_Device/DFU/Include/flash_if.h + 1 + PARENT-2-PROJECT_LOC/Include/flash_if.h + + + Examples/USBFS/USB_Device/DFU/Include/gd32vf103_it.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_it.h + + + Examples/USBFS/USB_Device/DFU/Include/gd32vf103_libopt.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_libopt.h + + + Examples/USBFS/USB_Device/DFU/Include/usb_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usb_conf.h + + + Examples/USBFS/USB_Device/DFU/Include/usbd_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usbd_conf.h + + + Examples/USBFS/USB_Device/DFU/Source/app.c + 1 + PARENT-2-PROJECT_LOC/Source/app.c + + + Examples/USBFS/USB_Device/DFU/Source/dfu_core.c + 1 + PARENT-2-PROJECT_LOC/Source/dfu_core.c + + + Examples/USBFS/USB_Device/DFU/Source/dfu_mal.c + 1 + PARENT-2-PROJECT_LOC/Source/dfu_mal.c + + + Examples/USBFS/USB_Device/DFU/Source/flash_if.c + 1 + PARENT-2-PROJECT_LOC/Source/flash_if.c + + + Examples/USBFS/USB_Device/DFU/Source/gd32vf103_hw.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_hw.c + + + Examples/USBFS/USB_Device/DFU/Source/gd32vf103_it.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_it.c + + + Examples/USBFS/USB_Device/DFU/Source/system_gd32vf103.c + 1 + PARENT-2-PROJECT_LOC/Source/system_gd32vf103.c + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Eclipse/usbd_dfu/.settings/language.settings.xml b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Eclipse/usbd_dfu/.settings/language.settings.xml new file mode 100644 index 0000000..f0951a1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Eclipse/usbd_dfu/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/dfu_core.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/dfu_core.h new file mode 100644 index 0000000..05bb6d2 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/dfu_core.h @@ -0,0 +1,162 @@ +/*! + \file usbd_hid_core.h + \brief the header file of USB DFU device class core functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef DFU_CORE_H +#define DFU_CORE_H + +#include "usbd_enum.h" +#include "usb_ch9_std.h" +#include "usbd_transc.h" + +/* manifestation State */ +#define MANIFEST_COMPLETE 0x00 +#define MANIFEST_IN_PROGRESS 0x01 + +#define USB_DFU_DESC_SIZE 9 + +/* special commands with download request */ +#define GET_COMMANDS 0x00 +#define SET_ADDRESS_POINTER 0x21 +#define ERASE 0x41 +#define NO_CMD 0xFF + +/* memory operation command */ +#define CMD_ERASE 0 +#define CMD_WRITE 1 + +#define FLASH_ERASE_TIMEOUT 60 +#define FLASH_WRITE_TIMEOUT 80 + +/* bit detach capable = bit 3 in bmAttributes field */ +#define DFU_DETACH_MASK (uint8_t)(0x10) + +#define USB_SERIAL_STRING_SIZE 0x06 +#define DEVICE_ID (0x40022100) + +#define USB_DFU_CONFIG_DESC_SIZE (18 + (9 * USBD_ITF_MAX_NUM)) +#define DFU_DESC_TYPE 0x21 +#define FLASH_IF_STRING "@Internal Flash /0x08000000/16*002Ka,112*002Kg" + +/* DFU device state defines */ +typedef enum +{ + STATE_appIDLE = 0x00, + STATE_appDETACH, + STATE_dfuIDLE, + STATE_dfuDNLOAD_SYNC, + STATE_dfuDNBUSY, + STATE_dfuDNLOAD_IDLE, + STATE_dfuMANIFEST_SYNC, + STATE_dfuMANIFEST, + STATE_dfuMANIFEST_WAIT_RESET, + STATE_dfuUPLOAD_IDLE, + STATE_dfuERROR +}dfu_state_enum; + +/* DFU device status defines */ +typedef enum +{ + STATUS_OK = 0x00, + STATUS_errTARGET, + STATUS_errFILE, + STATUS_errWRITE, + STATUS_errERASE, + STATUS_errCHECK_ERASED, + STATUS_errPROG, + STATUS_errVERIFY, + STATUS_errADDRESS, + STATUS_errNOTDONE, + STATUS_errFIRMWARE, + STATUS_errVENDOR, + STATUS_errUSBR, + STATUS_errPOR, + STATUS_errUNKNOWN, + STATUS_errSTALLEDPKT +}dfu_status_enum; + +/* DFU class-specific requests */ +typedef enum +{ + DFU_DETACH = 0, + DFU_DNLOAD, + DFU_UPLOAD, + DFU_GETSTATUS, + DFU_CLRSTATUS, + DFU_GETSTATE, + DFU_ABORT, + DFU_REQ_MAX +}dfu_requests_enum; + +#pragma pack(1) + +/* USB dfu function descriptor struct */ +typedef struct +{ + usb_desc_header header; /*!< descriptor header, including type and size */ + uint8_t bmAttributes; /*!< DFU attributes */ + uint16_t wDetachTimeOut; /*!< time, in milliseconds, that the device will wait after receipt of the DFU_DETACH request. If */ + uint16_t wTransferSize; /*!< maximum number of bytes that the device can accept per control-write transaction */ + uint16_t bcdDFUVersion; /*!< numeric expression identifying the version of the DFU Specification release. */ +} usb_dfu_function_descriptor_struct; + +#pragma pack() + +/* USB configuration descriptor struct */ +typedef struct +{ + usb_desc_config Config; + usb_desc_itf DFU_Interface; + usb_dfu_function_descriptor_struct DFU_Function_Desc; +} usb_descriptor_configuration_set_struct; + +typedef void (*pAppFunction) (void); + +extern void* const usbd_strings[USB_STRING_COUNT]; +extern const usb_desc_dev device_descripter; +extern const usb_descriptor_configuration_set_struct configuration_descriptor; + +extern usb_class_core usbd_dfu_cb; + +/* function declarations */ +/* initialize the MSC device */ +uint8_t dfu_init (usb_dev *pudev, uint8_t config_index); +/* de-initialize the MSC device */ +uint8_t dfu_deinit (usb_dev *pudev, uint8_t config_index); +/* handle the MSC class-specific requests */ +uint8_t dfu_req_handler (usb_dev *pudev, usb_req *req); +/* handle data Stage */ +uint8_t dfu_data_in_handler (usb_dev *pudev, uint8_t ep_num); +uint8_t dfu_data_out_handler (usb_dev *pudev, uint8_t ep_num); + +#endif /* DFU_CORE_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/dfu_mal.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/dfu_mal.h new file mode 100644 index 0000000..f252fbe --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/dfu_mal.h @@ -0,0 +1,78 @@ +/*! + \file usbd_dfu_mal.h + \brief USB DFU device media access layer header file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBD_DFU_MAL_H +#define USBD_DFU_MAL_H + +#include "usb_conf.h" +#include "usbd_conf.h" + +typedef struct _DFU_MAL_PROPERTY +{ + const uint8_t* pStrDesc; + uint8_t (*pMAL_Init) (void); + uint8_t (*pMAL_DeInit) (void); + uint8_t (*pMAL_Erase) (uint32_t Addr); + uint8_t (*pMAL_Write) (uint32_t Addr, uint32_t Len); + uint8_t* (*pMAL_Read) (uint32_t Addr, uint32_t Len); + uint8_t (*pMAL_CheckAdd) (uint32_t Addr); + const uint32_t EraseTimeout; + const uint32_t WriteTimeout; +} +DFU_MAL_Property_TypeDef; + +typedef enum +{ + MAL_OK = 0, + MAL_FAIL +} MAL_Status; + +#define _1st_BYTE(x) (uint8_t)((x) & 0xFF) /*!< addressing cycle 1st byte */ +#define _2nd_BYTE(x) (uint8_t)(((x) & 0xFF00) >> 8) /*!< addressing cycle 2nd byte */ +#define _3rd_BYTE(x) (uint8_t)(((x) & 0xFF0000) >> 16) /*!< addressing cycle 3rd byte */ + +#define SET_POLLING_TIMEOUT(x) buffer[1] = _1st_BYTE(x);\ + buffer[2] = _2nd_BYTE(x);\ + buffer[3] = _3rd_BYTE(x); + +uint8_t DFU_MAL_Init (void); +uint8_t DFU_MAL_DeInit (void); +uint8_t DFU_MAL_Erase (uint32_t Addr); +uint8_t DFU_MAL_Write (uint32_t Addr, uint32_t Len); +uint8_t* DFU_MAL_Read (uint32_t Addr, uint32_t Len); +uint8_t DFU_MAL_GetStatus (uint32_t Addr, uint8_t Cmd, uint8_t *buffer); + +extern uint8_t MAL_Buffer[TRANSFER_SIZE]; + +#endif /* USBD_DFU_MAL_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/flash_if.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/flash_if.h new file mode 100644 index 0000000..af53c09 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/flash_if.h @@ -0,0 +1,53 @@ +/*! + \file flash_if.h + \brief USB DFU device flash interface header file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef FLASH_IF_H +#define FLASH_IF_H + +#include "dfu_mal.h" + +#define FLASH_START_ADDR 0x08000000 + +#define OB_RDPT 0x1FFFF800 + +#define MAL_MASK_OB 0xFFFFFF00 + +#define FLASH_END_ADDR 0x08040000 +#define FLASH_IF_STRING "@Internal Flash /0x08000000/16*002Ka,112*002Kg" + +extern DFU_MAL_Property_TypeDef DFU_Flash_cb; + +extern fmc_state_enum Option_Byte_Write(uint32_t Mem_Add,uint8_t* data); + +#endif /* FLASH_IF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/gd32vf103_it.h new file mode 100644 index 0000000..cc50acf --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/gd32vf103_it.h @@ -0,0 +1,54 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_core.h" + +/* function declarations */ +/* this function handles USB wakeup interrupt handler */ +void USBFS_WKUP_IRQHandler(void); +/* this function handles USBFS IRQ Handler */ +void USBFS_IRQHandler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/gd32vf103_libopt.h new file mode 100644 index 0000000..60680cf --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/usb_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/usb_conf.h new file mode 100644 index 0000000..b36f0be --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/usb_conf.h @@ -0,0 +1,121 @@ +/*! + \file usb_conf.h + \brief USBFS driver basic configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_CONF_H +#define __USB_CONF_H + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#include + +#ifdef USE_USB_FS + #define USB_FS_CORE +#endif + +#ifdef USE_USB_HS + #define USB_HS_CORE +#endif + +#ifdef USB_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 64 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 0 + #define TX3_FIFO_FS_SIZE 0 +#endif /* USB_FS_CORE */ + +#ifdef USB_HS_CORE + #define RX_FIFO_HS_SIZE 512 + #define TX0_FIFO_HS_SIZE 128 + #define TX1_FIFO_HS_SIZE 372 + #define TX2_FIFO_HS_SIZE 0 + #define TX3_FIFO_HS_SIZE 0 + #define TX4_FIFO_HS_SIZE 0 + #define TX5_FIFO_HS_SIZE 0 + + #ifdef USE_ULPI_PHY + #define USB_OTG_ULPI_PHY_ENABLED + #endif + + #ifdef USE_EMBEDDED_PHY + #define USB_OTG_EMBEDDED_PHY_ENABLED + #endif + + #define USB_OTG_HS_INTERNAL_DMA_ENABLED + #define USB_OTG_HS_DEDICATED_EP1_ENABLED +#endif /* USB_HS_CORE */ + +#define USB_SOF_OUTPUT 1 +#define USB_LOW_POWER 1 + +//#define VBUS_SENSING_ENABLED + +//#define USE_HOST_MODE +#define USE_DEVICE_MODE +//#define USE_OTG_MODE + +#ifndef USB_FS_CORE + #ifndef USB_HS_CORE + #error "USB_HS_CORE or USB_FS_CORE should be defined" + #endif +#endif + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_HS + #ifndef USE_USB_FS + #error "USE_USB_HS or USE_USB_FS should be defined" + #endif +#endif + +/****************** C Compilers dependant keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned(4))) + #define __ALIGN_BEGIN + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + + +#endif /* __USB_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/usbd_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/usbd_conf.h new file mode 100644 index 0000000..4ac3cdd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Include/usbd_conf.h @@ -0,0 +1,73 @@ +/*! + \file usbd_conf.h + \brief the header file of USBHS device-mode configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBD_CONF_H +#define USBD_CONF_H + +#include "usb_conf.h" + +#define USBD_CFG_MAX_NUM 1 +#define USBD_ITF_MAX_NUM 1 +#define USB_STR_DESC_MAX_SIZE 64 + +/* USB feature -- Self Powered */ +//#define USBD_SELF_POWERED + +/* USB user string supported */ +/* #define USB_SUPPORT_USER_STRING_DESC */ + +//#define USBD_DYNAMIC_DESCRIPTOR_CHANGE_ENABLED + +/* Maximum number of supported media (Flash) */ +#define MAX_USED_MEMORY_MEDIA 1 + +#define USB_STRING_COUNT 6 + +/* DFU maximum data packet size */ +#define TRANSFER_SIZE 2048 + +/* memory address from where user application will be loaded, which represents + the dfu code protected against write and erase operations.*/ +#define APP_LOADED_ADDR 0x08010000 + +/* Make sure the corresponding memory where the DFU code should not be loaded + cannot be erased or overwritten by DFU application. */ +#define IS_PROTECTED_AREA(addr) (uint8_t)(((addr >= 0x08000000) && (addr < (APP_LOADED_ADDR)))? 1 : 0) + +/* DFU endpoint define */ +#define DFU_IN_EP EP0_IN +#define DFU_OUT_EP EP0_OUT + + +#endif /* USBD_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/app.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/app.c new file mode 100644 index 0000000..6585ab1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/app.c @@ -0,0 +1,117 @@ +/*! + \file app.c + \brief USB main routine for DFU + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "dfu_core.h" +#include +#include +#include +#include "riscv_encoding.h" + +pAppFunction Application; + +usb_core_driver USB_OTG_dev = +{ + .dev = { + .desc = { + .dev_desc = (uint8_t *)&device_descripter, + .config_desc = (uint8_t *)&configuration_descriptor, + .strings = usbd_strings, + } + } +}; + +extern uint8_t usbd_serial_string[]; +void serial_string_create(void); + +/*! + \brief main routine will construct a USB keyboard + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + eclic_global_interrupt_enable(); + + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); + + /* configure tamper key to run firmware */ + gd_eval_key_init(KEY_A, KEY_MODE_GPIO); + + usb_timer_init(); + + /* tamper key must be pressed on GD32207I-EVAL when power on */ + if (0 == gd_eval_key_state_get(KEY_A)) { + /* test if user code is programmed starting from address 0x08010000 */ + if (0x0001AAB1 == (*(__IO uint32_t*)APP_LOADED_ADDR)) { + clear_csr(mstatus, MSTATUS_MIE); + asm volatile ("jr %0 " :: "r"(APP_LOADED_ADDR)); + } + } + + /* configure USB clock */ + usb_rcu_config(); + + serial_string_create(); + + usb_intr_config(); + + usbd_init (&USB_OTG_dev, USB_CORE_ENUM_FS, &usbd_dfu_cb); + + /* check if USB device is enumerated successfully */ + while (USB_OTG_dev.dev.cur_status != USBD_CONFIGURED) { + } + + while (1) { + } +} + +/*! + \brief create the serial number string descriptor + \param[in] none + \param[out] none + \retval none +*/ +void serial_string_create (void) +{ + uint32_t device_serial = *(uint32_t*)DEVICE_ID; + + if(0 != device_serial) { + usbd_serial_string[2] = (uint8_t)device_serial; + usbd_serial_string[3] = (uint8_t)(device_serial >> 8); + usbd_serial_string[4] = (uint8_t)(device_serial >> 16); + usbd_serial_string[5] = (uint8_t)(device_serial >> 24); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/dfu_core.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/dfu_core.c new file mode 100644 index 0000000..ba69bc0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/dfu_core.c @@ -0,0 +1,720 @@ +/*! + \file dfu_core.c + \brief USB DFU device class core functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "dfu_core.h" +#include "dfu_mal.h" +#include "drv_usb_hw.h" + +#define USBD_VID 0x28e9 +#define USBD_PID 0x0189 + +/* DFU requests management functions */ +static void DFU_Req_DETACH (usb_dev *pudev, usb_req *req); +static void DFU_Req_DNLOAD (usb_dev *pudev, usb_req *req); +static void DFU_Req_UPLOAD (usb_dev *pudev, usb_req *req); +static void DFU_Req_GETSTATUS (usb_dev *pudev); +static void DFU_Req_CLRSTATUS (usb_dev *pudev); +static void DFU_Req_GETSTATE (usb_dev *pudev); +static void DFU_Req_ABORT (usb_dev *pudev); +static void DFU_LeaveDFUMode (usb_dev *pudev); + +static uint8_t dfu_getstatus_complete (usb_dev *pudev); + +/* data management variables */ +extern const uint8_t* USBD_DFU_StringDesc[]; +extern uint8_t MAL_Buffer[]; + +/* state machine variables */ +uint8_t DeviceState = STATE_dfuIDLE; +uint8_t DeviceStatus[6] = +{ + STATUS_OK, /* bStatus: device status is OK */ + 0x00, /* bwPollTimeout: 0ms */ + 0x00, + 0x00, + STATE_dfuIDLE, /* bState: device state is dfuIDLE */ + 0x00 /* iString: index is 0 */ +}; + +uint32_t Manifest_State = MANIFEST_COMPLETE; + +/* data management variables */ +static uint16_t BlockNum = 0; +static uint16_t Length = 0; +static uint32_t BaseAddress = APP_LOADED_ADDR; /*!< user application base address to erase, program or read */ +static __IO uint32_t USBD_DFU_AltSet = 0; + +/* note:it should use the c99 standard when compiling the below codes */ +/* USB standard device descriptor */ +const usb_desc_dev device_descripter = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200, + .bDeviceClass = 0x00, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +const usb_descriptor_configuration_set_struct configuration_descriptor = +{ + .Config = + { + .header = + { + .bLength = USB_CFG_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_DFU_CONFIG_DESC_SIZE, + .bNumInterfaces = 0x01, + .bConfigurationValue = 0x01, + .iConfiguration = 0x00, + .bmAttributes = 0x80, + .bMaxPower = 0x32 + }, + + .DFU_Interface = + { + .header = + { + .bLength = USB_ITF_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x00, + .bInterfaceClass = 0xFE, + .bInterfaceSubClass = 0x01, + .bInterfaceProtocol = 0x02, + .iInterface = 0x05 + }, + + .DFU_Function_Desc = + { + .header = + { + .bLength = sizeof(usb_dfu_function_descriptor_struct), + .bDescriptorType = DFU_DESC_TYPE + }, + .bmAttributes = 0x0B, + .wDetachTimeOut = 0x00FF, + .wTransferSize = TRANSFER_SIZE, + .bcdDFUVersion = 0x011A, + }, +}; + +/* USB language ID descriptor */ +const usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB serial string */ +uint8_t usbd_serial_string[USB_SERIAL_STRING_SIZE] = +{ + USB_SERIAL_STRING_SIZE, + USB_DESCTYPE_STR, +}; + +void* const usbd_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = USBD_STRING_DESC("GigaDevice"), + [STR_IDX_PRODUCT] = USBD_STRING_DESC("GD32 USB DFU in FS Mode"), + [STR_IDX_SERIAL] = usbd_serial_string, + [STR_IDX_CONFIG] = USBD_STRING_DESC("GD32 USB CONFIG"), + [STR_IDX_ITF] = USBD_STRING_DESC("@Internal Flash /0x08000000/16*002Ka,112*002Kg") + +}; + +/*! + \brief initialize the MSC device + \param[in] pudev: pointer to usb device instance + \param[in] config_index: configuration index + \param[out] none + \retval usb device operation status +*/ +uint8_t dfu_init (usb_dev *pudev, uint8_t config_index) +{ + /* initilialize the MAL(media access layer) */ + DFU_MAL_Init(); + + return USBD_OK; +} + +/*! + \brief de-initialize the MSC device + \param[in] pudev: pointer to usb device instance + \param[in] config_index: configuration index + \param[out] none + \retval usb device operation status +*/ +uint8_t dfu_deinit (usb_dev *pudev, uint8_t config_index) +{ + /* restore default state */ + DeviceState = STATE_dfuIDLE; + DeviceStatus[0] = STATUS_OK; + DeviceStatus[4] = DeviceState; + BlockNum = 0; + Length = 0; + + /* deinitilialize the MAL(media access layer) */ + DFU_MAL_DeInit(); + + return USBD_OK; +} + +/*! + \brief handle the MSC class-specific requests + \param[in] pudev: pointer to usb device instance + \param[in] req: device class-specific request + \param[out] none + \retval usb device operation status +*/ +uint8_t dfu_req_handler (usb_dev *pudev, usb_req *req) +{ + uint16_t len = 0; + uint8_t *pbuf = NULL; + + switch (req->bmRequestType & USB_REQTYPE_MASK) { + case USB_REQTYPE_CLASS: + switch (req->bRequest) { + case DFU_DNLOAD: + DFU_Req_DNLOAD(pudev, req); + break; + + case DFU_UPLOAD: + DFU_Req_UPLOAD(pudev, req); + break; + + case DFU_GETSTATUS: + DFU_Req_GETSTATUS(pudev); + break; + + case DFU_CLRSTATUS: + DFU_Req_CLRSTATUS(pudev); + break; + + case DFU_GETSTATE: + DFU_Req_GETSTATE(pudev); + break; + + case DFU_ABORT: + DFU_Req_ABORT(pudev); + break; + + case DFU_DETACH: + DFU_Req_DETACH(pudev, req); + break; + + default: + usbd_enum_error(pudev, req); + return USBD_FAIL; + } + break; + case USB_REQTYPE_STRD: + /* standard device request */ + switch (req->bRequest) { + case USB_GET_DESCRIPTOR: + if ((req->wValue >> 8) == DFU_DESC_TYPE) { + pbuf = (uint8_t*)(&configuration_descriptor.DFU_Function_Desc); + len = USB_MIN(USB_DFU_DESC_SIZE, req->wLength); + } + + pudev->dev.transc_in[0].xfer_buf = pbuf; + pudev->dev.transc_in[0].remain_len = len; + break; + case USB_GET_INTERFACE: + pudev->dev.transc_in[0].xfer_buf = (uint8_t *)&USBD_DFU_AltSet; + pudev->dev.transc_in[0].remain_len = 1; + break; + case USB_SET_INTERFACE: + USBD_DFU_AltSet = (uint8_t)(req->wValue); + usbd_ctl_status_send(pudev); + break; + default: + break; + } + break; + default: + break; + } + + return USBD_OK; +} + +/*! + \brief handle data Stage + \param[in] pudev: pointer to usb device instance + \param[in] rx_tx: the flag of Rx or Tx + \param[in] ep_id: the endpoint ID + \param[out] none + \retval usb device operation status +*/ +uint8_t dfu_data_in_handler (usb_dev *pudev, uint8_t ep_num) +{ + if ((DFU_IN_EP & 0x7F) == ep_num) { + dfu_getstatus_complete(pudev); + + return USBD_OK; + } else { + return USBD_FAIL; + } +} + +uint8_t dfu_data_out_handler (usb_dev *pudev, uint8_t ep_num) +{ + if (DFU_OUT_EP == ep_num) { + return USBD_OK; + } else { + return USBD_FAIL; + } +} + +/*! + \brief handle data IN stage in control endpoint 0 + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval usb device operation status +*/ +static uint8_t dfu_getstatus_complete (usb_dev *pudev) +{ + uint32_t Addr; + usb_req req; + + if (DeviceState == STATE_dfuDNBUSY) { + /* decode the special command*/ + if (BlockNum == 0) { + if ((MAL_Buffer[0] == GET_COMMANDS) && (Length == 1)) { + } else if ((MAL_Buffer[0] == SET_ADDRESS_POINTER) && (Length == 5)) { + BaseAddress = MAL_Buffer[1]; + BaseAddress += MAL_Buffer[2] << 8; + BaseAddress += MAL_Buffer[3] << 16; + BaseAddress += MAL_Buffer[4] << 24; + } else if ((MAL_Buffer[0] == ERASE) && (Length == 5)) { + BaseAddress = MAL_Buffer[1]; + BaseAddress += MAL_Buffer[2] << 8; + BaseAddress += MAL_Buffer[3] << 16; + BaseAddress += MAL_Buffer[4] << 24; + DFU_MAL_Erase(BaseAddress); + } else { + /* call the error management function (command will be NACKed) */ + req.bmRequestType = 0; + req.wLength = 1; + usbd_enum_error (pudev, &req); + } + /* regular download command */ + } else if (BlockNum > 1) { + /* decode the required address */ + Addr = ((BlockNum - 2) * TRANSFER_SIZE) + BaseAddress; + + /* preform the write operation */ + DFU_MAL_Write(Addr, Length); + BlockNum = 0; + } + + Length = 0; + + /* update the state machine */ + DeviceState = STATE_dfuDNLOAD_SYNC; + DeviceStatus[4] = DeviceState; + DeviceStatus[1] = 0; + DeviceStatus[2] = 0; + DeviceStatus[3] = 0; + + return USBD_OK; + /* manifestation in progress*/ + } else if (DeviceState == STATE_dfuMANIFEST) { + /* start leaving DFU mode */ + DFU_LeaveDFUMode(pudev); + } + + return USBD_OK; +} + +/*! + \brief handle the DFU_DETACH request + \param[in] pudev: pointer to usb device instance + \param[in] req: DFU class request + \param[out] none + \retval usb device operation status +*/ +static void DFU_Req_DETACH(usb_dev *pudev, usb_req *req) +{ + switch (DeviceState) { + case STATE_dfuIDLE: + case STATE_dfuDNLOAD_SYNC: + case STATE_dfuDNLOAD_IDLE: + case STATE_dfuMANIFEST_SYNC: + case STATE_dfuUPLOAD_IDLE: + /* update the state machine */ + DeviceState = STATE_dfuIDLE; + DeviceStatus[0] = STATUS_OK; + DeviceStatus[1] = 0; + DeviceStatus[2] = 0; + DeviceStatus[3] = 0; /* bwPollTimeout = 0ms */ + DeviceStatus[4] = DeviceState; + DeviceStatus[5] = 0; /* iString */ + BlockNum = 0; + Length = 0; + break; + + default: + break; + } + + /* check the detach capability in the DFU functional descriptor */ + if (configuration_descriptor.DFU_Function_Desc.wDetachTimeOut & DFU_DETACH_MASK) { + /* perform an Attach-Detach operation on USB bus */ + /* perform an unconnected operation on USB bus */ + usb_dev_disconnect(pudev); + + /* perform an connected operation on USB bus */ + usb_dev_connect(pudev); + } else { + /* wait for the period of time specified in detach request */ + usb_mdelay (req->wValue); + } +} + +/*! + \brief handle the DFU_DNLOAD request + \param[in] pudev: pointer to usb device instance + \param[in] req: DFU class request + \param[out] none + \retval usb device operation status +*/ +static void DFU_Req_DNLOAD(usb_dev *pudev, usb_req *req) +{ + /* data setup request */ + if (req->wLength > 0) { + if ((DeviceState == STATE_dfuIDLE) || (DeviceState == STATE_dfuDNLOAD_IDLE)) { + /* update the global length and block number */ + BlockNum = req->wValue; + Length = req->wLength; + + /* update the state machine */ + DeviceState = STATE_dfuDNLOAD_SYNC; + DeviceStatus[4] = DeviceState; + + /* prepare the reception of the buffer over EP0 */ + pudev->dev.transc_out[0].xfer_buf = (uint8_t*)MAL_Buffer; + pudev->dev.transc_out[0].remain_len = Length; + usbd_ctl_recev(pudev); + /* unsupported state */ + } else { + /* call the error management function (command will be nacked */ + usbd_enum_error (pudev, req); + } + /* 0 data DNLOAD request */ + } else { + /* end of DNLOAD operation*/ + if (DeviceState == STATE_dfuDNLOAD_IDLE || DeviceState == STATE_dfuIDLE) { + Manifest_State = MANIFEST_IN_PROGRESS; + DeviceState = STATE_dfuMANIFEST_SYNC; + DeviceStatus[1] = 0; + DeviceStatus[2] = 0; + DeviceStatus[3] = 0; + DeviceStatus[4] = DeviceState; + } else { + usbd_enum_error (pudev, req); + } + } +} + +/*! + \brief handles the DFU UPLOAD request. + \param[in] pudev: pointer to usb device instance + \param[in] req: DFU class request + \param[out] none + \retval none +*/ +static void DFU_Req_UPLOAD(usb_dev *pudev, usb_req *req) +{ + uint8_t *Phy_Addr = NULL; + uint32_t Addr = 0; + + /* data setup request */ + if (req->wLength > 0) { + if ((DeviceState == STATE_dfuIDLE) || (DeviceState == STATE_dfuUPLOAD_IDLE)) { + /* update the global langth and block number */ + BlockNum = req->wValue; + Length = req->wLength; + + /* set device poll timeout */ + DeviceStatus[1] = 0; + DeviceStatus[2] = 0; + DeviceStatus[3] = 0; + + /* DFU Get Command */ + if (BlockNum == 0) { + /* update the state machine */ + DeviceState = (Length > 3)? STATE_dfuIDLE : STATE_dfuUPLOAD_IDLE; + DeviceStatus[4] = DeviceState; + + /* store the values of all supported commands */ + MAL_Buffer[0] = GET_COMMANDS; + MAL_Buffer[1] = SET_ADDRESS_POINTER; + MAL_Buffer[2] = ERASE; + + /* send the status data over EP0 */ + pudev->dev.transc_in[0].xfer_buf = (uint8_t *)(&(MAL_Buffer[0])); + pudev->dev.transc_in[0].remain_len = 3; + usbd_ctl_send(pudev); + } else if (BlockNum > 1) { + DeviceState = STATE_dfuUPLOAD_IDLE ; + DeviceStatus[4] = DeviceState; + /* change is accelerated */ + Addr = ((BlockNum - 2) * TRANSFER_SIZE) + BaseAddress; + + /* return the physical address where data are stored */ + Phy_Addr = DFU_MAL_Read(Addr, Length); + + /* send the status data over EP0 */ + pudev->dev.transc_in[0].xfer_buf = Phy_Addr; + pudev->dev.transc_in[0].remain_len = Length; + usbd_ctl_send(pudev); + /* unsupported wBlockNum */ + } else { + DeviceState = STATUS_errSTALLEDPKT; + DeviceStatus[4] = DeviceState; + + usbd_enum_error (pudev, req); + } + } else { + Length = 0; + BlockNum = 0; + + usbd_enum_error (pudev, req); + } + } else { + DeviceState = STATE_dfuIDLE; + DeviceStatus[1] = 0; + DeviceStatus[2] = 0; + DeviceStatus[3] = 0; + DeviceStatus[4] = DeviceState; + } +} + +/*! + \brief handle the DFU_GETSTATUS request + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void DFU_Req_GETSTATUS(usb_dev *pudev) +{ + switch (DeviceState) { + case STATE_dfuDNLOAD_SYNC: + if (Length != 0) { + DeviceState = STATE_dfuDNBUSY; + DeviceStatus[4] = DeviceState; + + if (BlockNum == 0) { + if (MAL_Buffer[0] == ERASE) { + DFU_MAL_GetStatus(BaseAddress, CMD_ERASE, DeviceStatus); + } else { + DFU_MAL_GetStatus(BaseAddress, CMD_WRITE, DeviceStatus); + } + } + /* (wlength==0)*/ + } else { + DeviceState = STATE_dfuDNLOAD_IDLE; + DeviceStatus[4] = DeviceState; + DeviceStatus[1] = 0; + DeviceStatus[2] = 0; + DeviceStatus[3] = 0; + } + break; + + case STATE_dfuMANIFEST_SYNC: + if (Manifest_State == MANIFEST_IN_PROGRESS) { + DeviceState = STATE_dfuMANIFEST; + DeviceStatus[4] = DeviceState; + DeviceStatus[1] = 1; + DeviceStatus[2] = 0; + DeviceStatus[3] = 0; + /* bwPollTimeout = 1ms */ + } else if ((Manifest_State == MANIFEST_COMPLETE) && \ + (configuration_descriptor.DFU_Function_Desc.bmAttributes & 0x04)) { + DeviceState = STATE_dfuIDLE; + DeviceStatus[4] = DeviceState; + DeviceStatus[1] = 0; + DeviceStatus[2] = 0; + DeviceStatus[3] = 0; + } + break; + + default: + break; + } + + /* send the status data of DFU interface to host over EP0 */ + pudev->dev.transc_in[0].xfer_buf = (uint8_t *)(&(DeviceStatus[0])); + pudev->dev.transc_in[0].remain_len = 6; + usbd_ctl_send(pudev); +} + +/*! + \brief handle the DFU_CLRSTATUS request + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void DFU_Req_CLRSTATUS(usb_dev *pudev) +{ + if (DeviceState == STATE_dfuERROR) { + DeviceState = STATE_dfuIDLE; + DeviceStatus[0] = STATUS_OK; + } else { + /*State Error*/ + DeviceState = STATE_dfuERROR; + DeviceStatus[0] = STATUS_errUNKNOWN; + } + + DeviceStatus[1] = 0; + DeviceStatus[2] = 0; + DeviceStatus[3] = 0; /* bwPollTimeout = 0ms */ + DeviceStatus[4] = DeviceState; + DeviceStatus[5] = 0; /* iString: index = 0 */ +} + +/*! + \brief handle the DFU_GETSTATE request + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void DFU_Req_GETSTATE(usb_dev *pudev) +{ + /* send the current state of the DFU interface to host */ + pudev->dev.transc_in[0].xfer_buf = &DeviceState; + pudev->dev.transc_in[0].remain_len = 1; + usbd_ctl_send(pudev); +} + +/*! + \brief handle the DFU_ABORT request + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void DFU_Req_ABORT(usb_dev *pudev) +{ + switch (DeviceState) { + case STATE_dfuIDLE: + case STATE_dfuDNLOAD_SYNC: + case STATE_dfuDNLOAD_IDLE: + case STATE_dfuMANIFEST_SYNC: + case STATE_dfuUPLOAD_IDLE: + DeviceState = STATE_dfuIDLE; + DeviceStatus[0] = STATUS_OK; + DeviceStatus[1] = 0; + DeviceStatus[2] = 0; + DeviceStatus[3] = 0; /* bwPollTimeout = 0ms */ + DeviceStatus[4] = DeviceState; + DeviceStatus[5] = 0; /* iString: index = 0 */ + BlockNum = 0; + Length = 0; + break; + + default: + break; + } +} + +/*! + \brief leave DFU mode and reset device to jump to user loaded code + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval none +*/ +void DFU_LeaveDFUMode(usb_dev *pudev) +{ + Manifest_State = MANIFEST_COMPLETE; + + DeviceStatus[1] = 0; + DeviceStatus[2] = 0; + DeviceStatus[3] = 0; + + if (configuration_descriptor.DFU_Function_Desc.bmAttributes & 0x04) { + DeviceState = STATE_dfuMANIFEST_SYNC; + DeviceStatus[4] = DeviceState; + + return; + } else { + DeviceState = STATE_dfuMANIFEST_WAIT_RESET; + DeviceStatus[4] = DeviceState; + + /* disconnect the USB device */ + usb_dev_disconnect(pudev); + + /* deinitilialize the MAL(Media Access Layer) */ + DFU_MAL_DeInit(); + + /* generate system reset to allow jumping to the user code */ + eclic_system_reset(); + + /* this instruction will not be reached (system reset) */ + return; + } +} + +usb_class_core usbd_dfu_cb = { + .command = NO_CMD, + .alter_set = 0, + + .init = dfu_init, + .deinit = dfu_deinit, + .req_proc = dfu_req_handler, + .data_in = dfu_data_in_handler, + .data_out = dfu_data_out_handler +}; diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/dfu_mal.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/dfu_mal.c new file mode 100644 index 0000000..f374bb6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/dfu_mal.c @@ -0,0 +1,242 @@ +/*! + \file usbd_dfu_mal.c + \brief USB DFU device media access layer functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "dfu_mal.h" +#include "flash_if.h" +#include "drv_usb_hw.h" +#include "usbd_transc.h" + +extern usb_core_driver USB_OTG_dev; + +/* the reference tables of global memories callback and string descriptors. + to add a new memory, you can do as follows: + 1. modify the value of MAX_USED_MEDIA in usbd_dfu_mal.h + 2. add the pointer to the callback structure in this table + 3. add the pointer to the memory string descriptor in usbd_dfu_StringDesc table + no other operation is required. + */ +DFU_MAL_Property_TypeDef* tMALTab[MAX_USED_MEMORY_MEDIA] = { + &DFU_Flash_cb +}; + +/* the list of memory interface string descriptor pointers. this list + can be updated whenever a memory has to be added or removed */ +const uint8_t* USBD_DFU_StringDesc[MAX_USED_MEMORY_MEDIA] = +{ + (const uint8_t *)FLASH_IF_STRING +}; + +/* memory buffer for downloaded data */ +uint8_t MAL_Buffer[TRANSFER_SIZE]; + +static uint8_t DFU_MAL_CheckAddr (uint32_t Addr); + +/*! + \brief initialize the memory media on the GD32 + \param[in] none + \param[out] none + \retval MAL_OK +*/ +uint8_t DFU_MAL_Init (void) +{ + uint32_t memIdx = 0; + + /* initialize all supported memory medias */ + for (memIdx = 0; memIdx < MAX_USED_MEMORY_MEDIA; memIdx++) { + /* check if the memory media exists */ + if (tMALTab[memIdx]->pMAL_Init != NULL) { + tMALTab[memIdx]->pMAL_Init(); + } + } + + return MAL_OK; +} + +/*! + \brief deinitialize the memory media on the GD32 + \param[in] none + \param[out] none + \retval MAL_OK +*/ +uint8_t DFU_MAL_DeInit (void) +{ + uint32_t memIdx = 0; + + /* deinitializes all supported memory medias */ + for (memIdx = 0; memIdx < MAX_USED_MEMORY_MEDIA; memIdx++) { + /* check if the memory media exists */ + if (tMALTab[memIdx]->pMAL_DeInit != NULL) { + tMALTab[memIdx]->pMAL_DeInit(); + } + } + + return MAL_OK; +} + +/*! + \brief Erase a memory sector + \param[in] Addr: memory sector address/code + \param[out] none + \retval MAL_OK if all operations are OK, MAL_FAIL else +*/ +uint8_t DFU_MAL_Erase (uint32_t Addr) +{ + uint32_t memIdx = DFU_MAL_CheckAddr(Addr); + + /* check if the address is in protected area */ + if (IS_PROTECTED_AREA(Addr)) { + return MAL_FAIL; + } + + if (memIdx < MAX_USED_MEMORY_MEDIA) { + /* check if the operation is supported */ + if (tMALTab[memIdx]->pMAL_Erase != NULL) { + return tMALTab[memIdx]->pMAL_Erase(Addr); + } else { + return MAL_FAIL; + } + } else { + return MAL_FAIL; + } +} + +/*! + \brief write data to sectors of memory + \param[in] Addr: sector address/code + \param[in] Len: length of data to be written (in bytes) + \param[out] none + \retval MAL_OK if all operations are OK, MAL_FAIL else +*/ +uint8_t DFU_MAL_Write (uint32_t Addr, uint32_t Len) +{ + uint32_t memIdx = DFU_MAL_CheckAddr(Addr); + + /* check if the address is in protected area */ + if (IS_PROTECTED_AREA(Addr)) { + return MAL_FAIL; + } + + if ((Addr & MAL_MASK_OB) == OB_RDPT) { + usbd_ctl_status_recev (&USB_OTG_dev); + usb_mdelay(100); + Option_Byte_Write(Addr,MAL_Buffer); + eclic_system_reset(); + return MAL_OK; + } + + if (memIdx < MAX_USED_MEMORY_MEDIA) { + /* check if the operation is supported */ + if (tMALTab[memIdx]->pMAL_Write != NULL) { + return tMALTab[memIdx]->pMAL_Write(Addr, Len); + } else { + return MAL_FAIL; + } + } else { + return MAL_FAIL; + } +} + +/*! + \brief Read data from sectors of memory + \param[in] Addr: sector address/code + \param[in] Len: length of data to be written (in bytes) + \param[out] none + \retval Pointer to buffer +*/ +uint8_t* DFU_MAL_Read (uint32_t Addr, uint32_t Len) +{ + uint32_t memIdx = 0; + + if (Addr != OB_RDPT) { + memIdx = DFU_MAL_CheckAddr(Addr); + } + + if (memIdx < MAX_USED_MEMORY_MEDIA) { + /* check if the operation is supported */ + if (tMALTab[memIdx]->pMAL_Read != NULL) { + return tMALTab[memIdx]->pMAL_Read(Addr, Len); + } else { + return MAL_Buffer; + } + } else { + return MAL_Buffer; + } +} + +/*! + \brief get the status of a given memory and store in buffer + \param[in] Addr: sector address/code (allow to determine which memory will be addressed) + \param[in] Cmd: 0 for erase and 1 for write + \param[in] buffer: pointer to the buffer where the status data will be stored + \param[out] none + \retval MAL_OK if all operations are OK, MAL_FAIL else +*/ +uint8_t DFU_MAL_GetStatus (uint32_t Addr, uint8_t Cmd, uint8_t *buffer) +{ + uint32_t memIdx = DFU_MAL_CheckAddr(Addr); + + if (memIdx < MAX_USED_MEMORY_MEDIA) { + if (Cmd & 0x01) { + SET_POLLING_TIMEOUT(tMALTab[memIdx]->WriteTimeout); + } else { + SET_POLLING_TIMEOUT(tMALTab[memIdx]->EraseTimeout); + } + + return MAL_OK; + } else { + return MAL_FAIL; + } +} + +/*! + \brief Check the address is supported + \param[in] Addr: Sector address/code (allow to determine which memory will be addressed) + \param[out] none + \retval Index of the addressed memory +*/ +static uint8_t DFU_MAL_CheckAddr (uint32_t Addr) +{ + uint32_t memIdx = 0; + + /* check with all supported memories */ + for (memIdx = 0; memIdx < MAX_USED_MEMORY_MEDIA; memIdx++) { + /* if the check address is supported, return the memory index */ + if (tMALTab[memIdx]->pMAL_CheckAdd(Addr) == MAL_OK) { + return memIdx; + } + } + + /* if there is no memory found, return MAX_USED_MEDIA */ + return (MAX_USED_MEMORY_MEDIA); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/flash_if.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/flash_if.c new file mode 100644 index 0000000..9267b72 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/flash_if.c @@ -0,0 +1,209 @@ +/*! + \file usbd_flash_if.c + \brief USB DFU device flash interface functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + \version 2019-09-20, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "flash_if.h" +#include "dfu_mal.h" + +static uint8_t Flash_If_Init (void); +static uint8_t Flash_If_DeInit (void); +static uint8_t Flash_If_Erase (uint32_t Addr); +static uint8_t Flash_If_Write (uint32_t Addr, uint32_t Len); +static uint8_t* Flash_If_Read (uint32_t Addr, uint32_t Len); +static uint8_t Flash_If_CheckAddr (uint32_t Addr); + +/* USBD_DFU_FlashIf_Private_Variables */ +DFU_MAL_Property_TypeDef DFU_Flash_cb = +{ + (const uint8_t *)FLASH_IF_STRING, + + Flash_If_Init, + Flash_If_DeInit, + Flash_If_Erase, + Flash_If_Write, + Flash_If_Read, + Flash_If_CheckAddr, + 60, /* flash erase timeout in ms */ + 80 /* flash programming timeout in ms (80us * ram buffer size (1024 bytes) */ +}; + +/*! + \brief option Byte write routine. + \param[in] none + \param[out] none + \retval the state of the FMC after write option Byte operation +*/ +fmc_state_enum Option_Byte_Write(uint32_t Mem_Add,uint8_t* data) +{ + uint8_t index; + fmc_state_enum status ; + + /* unlock the flash program erase controller */ + fmc_unlock(); + + /* clear pending flags */ + fmc_flag_clear(FMC_FLAG_PGERR | FMC_FLAG_WPERR | FMC_FLAG_END); + + status = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + /* Authorize the small information block programming */ + ob_unlock(); + + /* start erase the option byte */ + FMC_CTL |= FMC_CTL_OBER; + FMC_CTL |= FMC_CTL_START; + + status = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + FMC_CTL &= ~FMC_CTL_OBER; + /* set the OBPG bit */ + FMC_CTL |= FMC_CTL_OBPG; + + /*OptionBytes always have 16Bytes*/ + for(index = 0;index<15;index=index+2) + { + *(__IO uint16_t*)Mem_Add = data[index]&0xff; + + Mem_Add = Mem_Add + 2; + + status = fmc_ready_wait(FMC_TIMEOUT_COUNT); + } + + /* if the program operation is completed, disable the OPTPG Bit */ + FMC_CTL &= ~FMC_CTL_OBPG; + + fmc_lock(); + + return status; +} + +/*! + \brief flash memory interface initialization routine. + \param[in] none + \param[out] none + \retval MAL_OK if the operation is right, MAL_FAIL else +*/ +static uint8_t Flash_If_Init (void) +{ + /* unlock the internal flash */ + fmc_unlock(); + + return MAL_OK; +} + +/*! + \brief flash memory interface deinitialization routine. + \param[in] none + \param[out] none + \retval MAL_OK if all operation is right, MAL_FAIL else +*/ +static uint8_t Flash_If_DeInit (void) +{ + /* lock the internal flash */ + fmc_lock(); + + return MAL_OK; +} + +/*! + \brief erase flash sector + \param[in] Addr: address to be written to. + \param[out] none + \retval MAL_OK +*/ +static uint8_t Flash_If_Erase (uint32_t Addr) +{ + fmc_page_erase(Addr); + + return MAL_OK; +} + +/*! + \brief flash memory write routine + \param[in] Addr: address to be written to + \param[in] Len: length of data to be written (in bytes). + \param[out] none + \retval MAL_OK +*/ +static uint8_t Flash_If_Write (uint32_t Addr, uint32_t Len) +{ + uint32_t idx = 0; + + /* unlock the flash program erase controller */ + fmc_unlock(); + + /* not an aligned data */ + if (Len & 0x03) { + for (idx = Len; idx < ((Len & 0xFFFC) + 4); idx++) { + MAL_Buffer[idx] = 0xFF; + } + } + + /* data received are word multiple */ + for (idx = 0; idx < Len; idx += 4) { + fmc_word_program(Addr, *(uint32_t *)(MAL_Buffer + idx)); + Addr += 4; + } + + fmc_lock(); + + return MAL_OK; +} + +/*! + \brief flash memory read routine + \param[in] Addr: address to be read from + \param[in] Len: length of data to be read (in bytes) + \param[out] none + \retval Pointer to the physical address where data should be read +*/ +static uint8_t *Flash_If_Read (uint32_t Addr, uint32_t Len) +{ + return (uint8_t *)(Addr); +} + +/*! + \brief check if the address is an allowed address for this memory + \param[in] Addr: address to be checked. + \param[out] none + \retval MAL_OK if the address is allowed, MAL_FAIL else. +*/ +static uint8_t Flash_If_CheckAddr (uint32_t Addr) +{ + if ((Addr >= FLASH_START_ADDR) && (Addr < FLASH_END_ADDR)) { + return MAL_OK; + } else { + return MAL_FAIL; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/gd32vf103_hw.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/gd32vf103_hw.c new file mode 100644 index 0000000..204c678 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/gd32vf103_hw.c @@ -0,0 +1,206 @@ +/*! + \file gd32vf103_hw.c + \brief USB hardware configuration for GD32VF103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include +#include +#include + + +#define TIM_MSEC_DELAY 0x01 +#define TIM_USEC_DELAY 0x02 + +__IO uint32_t delay_time = 0; +__IO uint32_t timer_prescaler; +__IO uint32_t usbfs_prescaler = 0; + +static void hw_time_set (uint8_t unit); +static void hw_delay (uint32_t ntime, uint8_t unit); + + +/*! + \brief configure USB clock + \param[in] none + \param[out] none + \retval none +*/ +void usb_rcu_config(void) +{ + uint32_t system_clock = rcu_clock_freq_get(CK_SYS); + + if (system_clock == 48000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1; + timer_prescaler = 3; + } else if (system_clock == 72000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1_5; + timer_prescaler = 5; + } else if (system_clock == 96000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV2; + timer_prescaler = 7; + } else { + /* reserved */ + } + + rcu_usb_clock_config(usbfs_prescaler); + rcu_periph_clock_enable(RCU_USBFS); +} + +/*! + \brief configure USB interrupt + \param[in] none + \param[out] none + \retval none +*/ +void usb_intr_config(void) +{ + eclic_irq_enable((uint8_t)USBFS_IRQn, 1, 0); + + /* enable the power module clock */ + rcu_periph_clock_enable(RCU_PMU); + + /* USB wakeup EXTI line configuration */ + exti_interrupt_flag_clear(EXTI_18); + exti_init(EXTI_18, EXTI_INTERRUPT, EXTI_TRIG_RISING); + exti_interrupt_enable(EXTI_18); + + eclic_irq_enable((uint8_t)USBFS_WKUP_IRQn, 3, 0); +} + +/*! + \brief initializes delay unit using Timer2 + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_init (void) +{ + rcu_periph_clock_enable(RCU_TIMER2); + + eclic_irq_enable(TIMER2_IRQn, 2, 0); +} + +/*! + \brief delay in micro seconds + \param[in] usec: value of delay required in micro seconds + \param[out] none + \retval none +*/ +void usb_udelay (const uint32_t usec) +{ + hw_delay(usec, TIM_USEC_DELAY); +} + +/*! + \brief delay in milli seconds + \param[in] msec: value of delay required in milli seconds + \param[out] none + \retval none +*/ +void usb_mdelay (const uint32_t msec) +{ + hw_delay(msec, TIM_MSEC_DELAY); +} + +/*! + \brief time base IRQ + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_irq (void) +{ + if (RESET != timer_flag_get(TIMER2, TIMER_FLAG_UP)){ + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + + if (delay_time > 0x00U){ + delay_time--; + } else { + timer_disable(TIMER2); + } + } +} + +/*! + \brief delay routine based on TIM0 + \param[in] nTime: delay Time + \param[in] unit: delay Time unit = mili sec / micro sec + \param[out] none + \retval none +*/ +static void hw_delay(uint32_t ntime, uint8_t unit) +{ + delay_time = ntime; + + hw_time_set(unit); + + while (0U != delay_time) { + } + + timer_disable(TIMER2); +} + +/*! + \brief configures TIM0 for delay routine based on TIM0 + \param[in] unit: msec /usec + \param[out] none + \retval none +*/ +static void hw_time_set(uint8_t unit) +{ + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER2); + timer_deinit(TIMER2); + + if(TIM_USEC_DELAY == unit) { + timer_initpara.period = 11; + } else if(TIM_MSEC_DELAY == unit) { + timer_initpara.period = 11999; + } + + timer_initpara.prescaler = timer_prescaler; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER2, &timer_initpara); + + timer_update_event_enable(TIMER2); + timer_interrupt_enable(TIMER2,TIMER_INT_UP); + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + timer_update_source_config(TIMER2, TIMER_UPDATE_SRC_GLOBAL); + + /* TIMER2 counter enable */ + timer_enable(TIMER2); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/gd32vf103_it.c new file mode 100644 index 0000000..f46e7c3 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/gd32vf103_it.c @@ -0,0 +1,96 @@ +/*! + \file gd32vf103_it.c + \brief main interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usbd_int.h" +#include "drv_usb_hw.h" +#include "gd32vf103_it.h" + +extern usb_core_driver USB_OTG_dev; +extern uint32_t usbfs_prescaler; + +extern void usb_timer_irq (void); + +/*! + \brief this function handles USBD interrupt + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_IRQHandler (void) +{ + usbd_isr (&USB_OTG_dev); +} + +/*! + \brief this function handles EXTI0_IRQ Handler + \param[in] none + \param[out] none + \retval none +*/ +void EXTI0_IRQHandler(void) +{ + +} + +/*! + \brief this function handles USBD wakeup interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_WKUP_IRQHandler(void) +{ + if (USB_OTG_dev.bp.low_power) { + SystemInit(); + + rcu_usb_clock_config(usbfs_prescaler); + + rcu_periph_clock_enable(RCU_USBFS); + + usb_clock_active(&USB_OTG_dev); + } + + exti_interrupt_flag_clear(EXTI_18); +} + +/*! + \brief this function handles Timer0 updata interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void TIMER2_IRQHandler(void) +{ + usb_timer_irq(); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/system_gd32vf103.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/system_gd32vf103.c new file mode 100644 index 0000000..05e5205 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/Source/system_gd32vf103.c @@ -0,0 +1,998 @@ +/*! + \file system_gd32vf103.h + \brief RISC-V Device Peripheral Access Layer Source File for + GD32VF103 Device Series + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* This file refers the RISC-V standard, some adjustments are made according to GigaDevice chips */ + +#include "gd32vf103.h" + +/* system frequency define */ +#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */ + +/* select a system clock by uncommenting the following line */ +/* use IRC8M */ +//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000) + +/********************************************************************/ +//#define __SYSTEM_CLOCK_HXTAL (HXTAL_VALUE) +//#define __SYSTEM_CLOCK_24M_PLL_HXTAL (uint32_t)(24000000) +/********************************************************************/ + +//#define __SYSTEM_CLOCK_36M_PLL_HXTAL (uint32_t)(36000000) +//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_56M_PLL_HXTAL (uint32_t)(56000000) +//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000) +#define __SYSTEM_CLOCK_96M_PLL_HXTAL (uint32_t)(96000000) +//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000) + +#define SEL_IRC8M 0x00U +#define SEL_HXTAL 0x01U +#define SEL_PLL 0x02U + +/* set the system clock frequency and declare the system clock configuration function */ +#ifdef __SYSTEM_CLOCK_48M_PLL_IRC8M +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_IRC8M; +static void system_clock_48m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M; +static void system_clock_72m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_IRC8M; +static void system_clock_108m_irc8m(void); + +#elif defined (__SYSTEM_CLOCK_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; +static void system_clock_hxtal(void); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_24M_PLL_HXTAL; +static void system_clock_24m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_36M_PLL_HXTAL; +static void system_clock_36m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_HXTAL; +static void system_clock_48m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_56M_PLL_HXTAL; +static void system_clock_56m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL; +static void system_clock_72m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_HXTAL; +static void system_clock_96m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL; +static void system_clock_108m_hxtal(void); +#else +uint32_t SystemCoreClock = IRC8M_VALUE; +#endif /* __SYSTEM_CLOCK_48M_PLL_IRC8M */ + +/* configure the system clock */ +static void system_clock_config(void); + +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ +#ifdef __SYSTEM_CLOCK_HXTAL + system_clock_hxtal(); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) + system_clock_24m_hxtal(); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) + system_clock_36m_hxtal(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) + system_clock_48m_hxtal(); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) + system_clock_56m_hxtal(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) + system_clock_72m_hxtal(); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) + system_clock_96m_hxtal(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) + system_clock_108m_hxtal(); + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) + system_clock_48m_irc8m(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) + system_clock_72m_irc8m(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) + system_clock_108m_irc8m(); +#endif /* __SYSTEM_CLOCK_HXTAL */ +} + +/*! + \brief setup the microcontroller system, initialize the system + \param[in] none + \param[out] none + \retval none +*/ +void SystemInit(void) +{ + /* reset the RCC clock configuration to the default reset state */ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* reset SCS, AHBPSC, APB1PSC, APB2PSC, ADCPSC, CKOUT0SEL bits */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_ADCPSC_2 | RCU_CFG0_CKOUT0SEL); + + /* reset HXTALEN, CKMEN, PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + + /* Reset HXTALBPS bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* reset PLLSEL, PREDV0_LSB, PLLMF, USBFSPSC bits */ + + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_PLLMF_4); + RCU_CFG1 = 0x00000000U; + + /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x00FF0000U; + + /* Configure the System clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */ + system_clock_config(); +} + +/*! + \brief update the SystemCoreClock with current core clock retrieved from cpu registers + \param[in] none + \param[out] none + \retval none +*/ +void SystemCoreClockUpdate(void) +{ + uint32_t scss; + uint32_t pllsel, predv0sel, pllmf, ck_src; + uint32_t predv0, predv1, pll1mf; + + scss = GET_BITS(RCU_CFG0, 2, 3); + + switch (scss) + { + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + SystemCoreClock = IRC8M_VALUE; + break; + + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + + if(RCU_PLLSRC_IRC8M_DIV2 == pllsel){ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE / 2U; + }else{ + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + + if(pllmf >= 15U){ + pllmf += 1U; + }else{ + pllmf += 2U; + } + + SystemCoreClock = ck_src * pllmf; + + if(15U == pllmf){ + /* PLL source clock multiply by 6.5 */ + SystemCoreClock = ck_src * 6U + ck_src / 2U; + } + + break; + + /* IRC8M is selected as CK_SYS */ + default: + SystemCoreClock = IRC8M_VALUE; + break; + } +} + +#ifdef __SYSTEM_CLOCK_HXTAL +/*! + \brief configure the system clock to HXTAL + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select HXTAL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; + + /* wait until HXTAL is selected as system clock */ + while(0 == (RCU_CFG0 & RCU_SCSS_HXTAL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +/*! + \brief configure the system clock to 24M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_24m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 6 = 24 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +/*! + \brief configure the system clock to 36M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_36m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 9 = 36 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +/*! + \brief configure the system clock to 48M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL12); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +/*! + \brief configure the system clock to 56M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_56m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 14 = 56 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL14); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +/*! + \brief configure the system clock to 72M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL18); + + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +/*! + \brief configure the system clock to 96M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_96m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + if(HXTAL_VALUE==25000000){ + + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +/*! + \brief configure the system clock to 108M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ + +static void system_clock_108m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL27); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PREDV1_DIV5 | RCU_PLL1_MUL8 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 | RCU_PREDV1_DIV2 | RCU_PLL1_MUL20 | RCU_PLL2_MUL20); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL2 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + + } + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +/*! + \brief configure the system clock to 48M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL12; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +/*! + \brief configure the system clock to 72M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL18; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +/*! + \brief configure the system clock to 108M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL27; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/readme.txt new file mode 100644 index 0000000..5a34bcc --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/DFU/readme.txt @@ -0,0 +1,58 @@ +/*! + \file readme.txt + \brief description of the USB DFU demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board,it presents the implementation +of a device firmware upgrade (DFU) capability in the GD32 USB device. + + It follows the DFU class specification defined by the USB Implementers Forum for +reprogramming an application through USBFS. + + The DFU principle is particularly well suited to USBFS applications that +need to be reprogrammed in the field. + + To test the demo, you need a configuration hex image or bin image . The hex image +and the bin image should set application address at 0x8010000. + + You need install the corresponding GD DFU Driver with your PC operation system. + + Once the configuration *.hex image is generated, it can be downloaded into +internal flash memory using the GD tool "GD MCU Dfu Tool" available for download +from www.gd32mcu.21ic.com. + + The GD tool "GD MCU Dfu Tool" also can operate the option Byte. + + The supported memory for this example is the internal flash memory, you can also +add a new memory interface if you have extral memory. + +After each device reset, hold down the key A on the GD32VF103V-EVAL board. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Eclipse/in_application_program/.cproject b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Eclipse/in_application_program/.cproject new file mode 100644 index 0000000..a69de3d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Eclipse/in_application_program/.cproject @@ -0,0 +1,259 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Eclipse/in_application_program/.project b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Eclipse/in_application_program/.project new file mode 100644 index 0000000..5a6f5ea --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Eclipse/in_application_program/.project @@ -0,0 +1,588 @@ + + + in_application_program + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + Examples + 2 + virtual:/virtual + + + Firmware + 2 + virtual:/virtual + + + Utilities + 2 + virtual:/virtual + + + Examples/USBFS + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver + 2 + virtual:/virtual + + + Firmware/RISCV + 2 + virtual:/virtual + + + Utilities/gd32vf103v_eval.c + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.c + + + Utilities/gd32vf103v_eval.h + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.h + + + Examples/USBFS/USB_Device + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Source + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/gd32vf103.h + + + Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + + + Firmware/GD32VF103_usbfs_driver/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver/Source + 2 + virtual:/virtual + + + Firmware/RISCV/drivers + 2 + virtual:/virtual + + + Firmware/RISCV/env_Eclipse + 2 + virtual:/virtual + + + Firmware/RISCV/stubs + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/HID_IAP + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h + + + Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c + + + Firmware/RISCV/drivers/n200_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_eclic.h + + + Firmware/RISCV/drivers/n200_func.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.c + + + Firmware/RISCV/drivers/n200_func.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.h + + + Firmware/RISCV/drivers/n200_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_timer.h + + + Firmware/RISCV/drivers/riscv_bits.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_bits.h + + + Firmware/RISCV/drivers/riscv_const.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_const.h + + + Firmware/RISCV/drivers/riscv_encoding.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_encoding.h + + + Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + + + Firmware/RISCV/env_Eclipse/entry.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/entry.S + + + Firmware/RISCV/env_Eclipse/handlers.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/handlers.c + + + Firmware/RISCV/env_Eclipse/init.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/init.c + + + Firmware/RISCV/env_Eclipse/start.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/start.S + + + Firmware/RISCV/env_Eclipse/your_printf.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/your_printf.c + + + Firmware/RISCV/stubs/_exit.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/_exit.c + + + Firmware/RISCV/stubs/close.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/close.c + + + Firmware/RISCV/stubs/fstat.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/fstat.c + + + Firmware/RISCV/stubs/isatty.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/isatty.c + + + Firmware/RISCV/stubs/lseek.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/lseek.c + + + Firmware/RISCV/stubs/read.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/read.c + + + Firmware/RISCV/stubs/sbrk.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/sbrk.c + + + Firmware/RISCV/stubs/stub.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/stub.h + + + Firmware/RISCV/stubs/write.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write.c + + + Firmware/RISCV/stubs/write_hex.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write_hex.c + + + Examples/USBFS/USB_Device/HID_IAP/Include + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/HID_IAP/Source + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/HID_IAP/Include/gd32vf103_it.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_it.h + + + Examples/USBFS/USB_Device/HID_IAP/Include/gd32vf103_libopt.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_libopt.h + + + Examples/USBFS/USB_Device/HID_IAP/Include/iap_core.h + 1 + PARENT-2-PROJECT_LOC/Include/iap_core.h + + + Examples/USBFS/USB_Device/HID_IAP/Include/usb_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usb_conf.h + + + Examples/USBFS/USB_Device/HID_IAP/Include/usbd_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usbd_conf.h + + + Examples/USBFS/USB_Device/HID_IAP/Source/app.c + 1 + PARENT-2-PROJECT_LOC/Source/app.c + + + Examples/USBFS/USB_Device/HID_IAP/Source/gd32vf103_hw.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_hw.c + + + Examples/USBFS/USB_Device/HID_IAP/Source/gd32vf103_it.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_it.c + + + Examples/USBFS/USB_Device/HID_IAP/Source/iap_core.c + 1 + PARENT-2-PROJECT_LOC/Source/iap_core.c + + + Examples/USBFS/USB_Device/HID_IAP/Source/system_gd32vf103.c + 1 + PARENT-2-PROJECT_LOC/Source/system_gd32vf103.c + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Eclipse/in_application_program/.settings/language.settings.xml b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Eclipse/in_application_program/.settings/language.settings.xml new file mode 100644 index 0000000..f4c6cd1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Eclipse/in_application_program/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/gd32vf103_it.h new file mode 100644 index 0000000..cc50acf --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/gd32vf103_it.h @@ -0,0 +1,54 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_core.h" + +/* function declarations */ +/* this function handles USB wakeup interrupt handler */ +void USBFS_WKUP_IRQHandler(void); +/* this function handles USBFS IRQ Handler */ +void USBFS_IRQHandler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/iap_core.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/iap_core.h new file mode 100644 index 0000000..c936c24 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/iap_core.h @@ -0,0 +1,115 @@ +/*! + \file iap_core.h + \brief the header file of IAP driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef IAP_CORE_H +#define IAP_CORE_H + +#include "usbd_enum.h" +#include "usb_ch9_std.h" +#include "usbd_transc.h" + +#define IAP_CONFIG_DESC_SIZE 9 +#define USB_SERIAL_STRING_SIZE 0x06 + +#define DEVICE_ID (0x40022100) + +#define IAP_REPORT_DESC_SIZE 35 +#define IAP_CONFIG_SET_DESC_SIZE 41 + +#define HID_DESCTYPE 0x21 +#define HID_REPORT_DESCTYPE 0x22 + +#define GET_REPORT 0x01 +#define GET_IDLE 0x02 +#define GET_PROTOCOL 0x03 +#define SET_REPORT 0x09 +#define SET_IDLE 0x0A +#define SET_PROTOCOL 0x0B +#define NO_CMD 0xFF + +/* special commands with download request */ +#define IAP_OPTION_BYTE1 0x01 +#define IAP_ERASE 0x02 +#define IAP_DNLOAD 0x03 +#define IAP_LEAVE 0x04 +#define IAP_GETBIN_ADDRESS 0x05 +#define IAP_OPTION_BYTE2 0x06 + + +typedef void (*pAppFunction) (void); + +#pragma pack(1) + +typedef struct +{ + usb_desc_header header; /*!< regular descriptor header containing the descriptor's type and length */ + + uint16_t bcdHID; /*!< BCD encoded version that the HID descriptor and device complies to */ + uint8_t bCountryCode; /*!< country code of the localized device, or zero if universal */ + uint8_t bNumDescriptors; /*!< total number of HID report descriptors for the interface */ + uint8_t bDescriptorType; /*!< type of HID report */ + uint16_t wDescriptorLength; /*!< length of the associated HID report descriptor, in bytes */ +} usb_hid_descriptor_hid_struct; + +#pragma pack() + +typedef struct +{ + usb_desc_config Config; + usb_desc_itf HID_Interface; + usb_hid_descriptor_hid_struct HID_VendorHID; + usb_desc_ep HID_ReportINEndpoint; + usb_desc_ep HID_ReportOUTEndpoint; +} usb_descriptor_configuration_set_struct; + +extern void* const usbd_strings[USB_STRING_COUNT]; +extern const usb_desc_dev device_descripter; +extern const usb_descriptor_configuration_set_struct configuration_descriptor; + +extern usb_class_core usbd_hid_cb; + +/* function declarations */ +/* initialize the HID device */ +uint8_t iap_init (usb_dev *pudev, uint8_t config_index); +/* de-initialize the HID device */ +uint8_t iap_deinit (usb_dev *pudev, uint8_t config_index); +/* handle the HID class-specific requests */ +uint8_t iap_req_handler (usb_dev *pudev, usb_req *req); +/* handle data stage */ +uint8_t iap_data_handler (usb_dev *pudev, uint8_t ep_id); + +/* send iap report */ +uint8_t iap_report_send (usb_dev *pudev, uint8_t *report, uint16_t Len); + +#endif /* IAP_CORE_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/usb_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/usb_conf.h new file mode 100644 index 0000000..b36f0be --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/usb_conf.h @@ -0,0 +1,121 @@ +/*! + \file usb_conf.h + \brief USBFS driver basic configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_CONF_H +#define __USB_CONF_H + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#include + +#ifdef USE_USB_FS + #define USB_FS_CORE +#endif + +#ifdef USE_USB_HS + #define USB_HS_CORE +#endif + +#ifdef USB_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 64 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 0 + #define TX3_FIFO_FS_SIZE 0 +#endif /* USB_FS_CORE */ + +#ifdef USB_HS_CORE + #define RX_FIFO_HS_SIZE 512 + #define TX0_FIFO_HS_SIZE 128 + #define TX1_FIFO_HS_SIZE 372 + #define TX2_FIFO_HS_SIZE 0 + #define TX3_FIFO_HS_SIZE 0 + #define TX4_FIFO_HS_SIZE 0 + #define TX5_FIFO_HS_SIZE 0 + + #ifdef USE_ULPI_PHY + #define USB_OTG_ULPI_PHY_ENABLED + #endif + + #ifdef USE_EMBEDDED_PHY + #define USB_OTG_EMBEDDED_PHY_ENABLED + #endif + + #define USB_OTG_HS_INTERNAL_DMA_ENABLED + #define USB_OTG_HS_DEDICATED_EP1_ENABLED +#endif /* USB_HS_CORE */ + +#define USB_SOF_OUTPUT 1 +#define USB_LOW_POWER 1 + +//#define VBUS_SENSING_ENABLED + +//#define USE_HOST_MODE +#define USE_DEVICE_MODE +//#define USE_OTG_MODE + +#ifndef USB_FS_CORE + #ifndef USB_HS_CORE + #error "USB_HS_CORE or USB_FS_CORE should be defined" + #endif +#endif + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_HS + #ifndef USE_USB_FS + #error "USE_USB_HS or USE_USB_FS should be defined" + #endif +#endif + +/****************** C Compilers dependant keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned(4))) + #define __ALIGN_BEGIN + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + + +#endif /* __USB_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/usbd_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/usbd_conf.h new file mode 100644 index 0000000..86c418f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Include/usbd_conf.h @@ -0,0 +1,68 @@ +/*! + \file usbd_conf.h + \brief the header file of USBFS device-mode configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBFS_CONF_H +#define USBFS_CONF_H + +#include "usb_conf.h" + +#define USBD_CFG_MAX_NUM 1 +#define USBD_ITF_MAX_NUM 1 +#define USB_STR_DESC_MAX_SIZE 64 + +#define USB_STRING_COUNT 4 + +#define IAP_IN_EP EP1_IN +#define IAP_OUT_EP EP1_OUT + +#define IAP_IN_PACKET 24 +#define IAP_OUT_PACKET 64 + +#define TRANSFER_SIZE 62 + +#define PAGE_SIZE 1024 /* MCU page size */ + +/* maximum number of supported memory media (Flash, RAM or EEPROM and so on) */ +#define MAX_USED_MEMORY_MEDIA 1 + +/* memory address from where user application will be loaded, which represents + the DFU code protected against write and erase operations.*/ +#define APP_LOADED_ADDR 0x08010000 + +/* make sure the corresponding memory where the DFU code should not be loaded + cannot be erased or overwritten by DFU application. */ +#define IS_PROTECTED_AREA(addr) (uint8_t)(((addr >= 0x08000000) && \ + (addr < (APP_LOADED_ADDR)))? 1 : 0) + +#endif /* USBD_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/app.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/app.c new file mode 100644 index 0000000..12f49a1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/app.c @@ -0,0 +1,119 @@ +/*! + \file app.c + \brief USB main routine for HID IAP + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "iap_core.h" +#include +#include +#include +#include "riscv_encoding.h" + + +usb_core_driver USB_OTG_dev = +{ + .dev = { + .desc = { + .dev_desc = (uint8_t *)&device_descripter, + .config_desc = (uint8_t *)&configuration_descriptor, + .strings = usbd_strings, + } + } +}; + +pAppFunction application; + +extern uint8_t usbd_serial_string[]; +void serial_string_create(void); + + +/*! + \brief main routine will construct a USB keyboard + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + eclic_global_interrupt_enable(); + + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); + + /* configure Tamper key to run firmware */ + gd_eval_key_init(KEY_A, KEY_MODE_GPIO); + + usb_timer_init(); + + /* tamper key must be pressed on GD32350R-EVAL when power on */ + if (0 == gd_eval_key_state_get(KEY_A)) { + /* test if user code is programmed starting from address 0x08010000 */ + if (0x0001AAB1 == (*(__IO uint32_t*)APP_LOADED_ADDR)) { + clear_csr(mstatus, MSTATUS_MIE); + asm volatile ("jr %0 " :: "r"(APP_LOADED_ADDR)); + } + } + + /* configure USB clock */ + usb_rcu_config(); + + serial_string_create(); + + usb_intr_config(); + + usbd_init (&USB_OTG_dev, USB_CORE_ENUM_FS, &usbd_hid_cb); + + /* check if USB device is enumerated successfully */ + while (USB_OTG_dev.dev.cur_status != USBD_CONFIGURED) { + } + + while (1) { + } +} + +/*! + \brief create the serial number string descriptor + \param[in] none + \param[out] none + \retval none +*/ +void serial_string_create (void) +{ + uint32_t device_serial = *(uint32_t*)DEVICE_ID; + + if (0 != device_serial) { + usbd_serial_string[2] = (uint8_t)device_serial; + usbd_serial_string[3] = (uint8_t)(device_serial >> 8); + usbd_serial_string[4] = (uint8_t)(device_serial >> 16); + usbd_serial_string[5] = (uint8_t)(device_serial >> 24); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/gd32vf103_hw.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/gd32vf103_hw.c new file mode 100644 index 0000000..2378125 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/gd32vf103_hw.c @@ -0,0 +1,205 @@ +/*! + \file gd32vf103_hw.c + \brief USB hardware configuration for GD32VF103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include +#include +#include + + +#define TIM_MSEC_DELAY 0x01 +#define TIM_USEC_DELAY 0x02 + +__IO uint32_t delay_time = 0; +__IO uint32_t timer_prescaler; +__IO uint32_t usbfs_prescaler = 0; + +static void hw_time_set (uint8_t unit); +static void hw_delay (uint32_t ntime, uint8_t unit); + + +/*! + \brief configure USB clock + \param[in] none + \param[out] none + \retval none +*/ +void usb_rcu_config(void) +{ + uint32_t system_clock = rcu_clock_freq_get(CK_SYS); + + if (system_clock == 48000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1; + timer_prescaler = 3; + } else if (system_clock == 72000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1_5; + timer_prescaler = 5; + } else if (system_clock == 96000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV2; + timer_prescaler = 7; + } else { + /* reserved */ + } + + rcu_usb_clock_config(usbfs_prescaler); + rcu_periph_clock_enable(RCU_USBFS); +} + +/*! + \brief configure USB interrupt + \param[in] none + \param[out] none + \retval none +*/ +void usb_intr_config(void) +{ + eclic_irq_enable((uint8_t)USBFS_IRQn, 1, 0); + + /* enable the power module clock */ + rcu_periph_clock_enable(RCU_PMU); + + /* USB wakeup EXTI line configuration */ + exti_interrupt_flag_clear(EXTI_18); + exti_init(EXTI_18, EXTI_INTERRUPT, EXTI_TRIG_RISING); + exti_interrupt_enable(EXTI_18); + + eclic_irq_enable((uint8_t)USBFS_WKUP_IRQn, 3, 0); +} + +/*! + \brief initializes delay unit using Timer2 + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_init (void) +{ + rcu_periph_clock_enable(RCU_TIMER2); + eclic_irq_enable(TIMER2_IRQn, 2, 0); +} + +/*! + \brief delay in micro seconds + \param[in] usec: value of delay required in micro seconds + \param[out] none + \retval none +*/ +void usb_udelay (const uint32_t usec) +{ + hw_delay(usec, TIM_USEC_DELAY); +} + +/*! + \brief delay in milli seconds + \param[in] msec: value of delay required in milli seconds + \param[out] none + \retval none +*/ +void usb_mdelay (const uint32_t msec) +{ + hw_delay(msec, TIM_MSEC_DELAY); +} + +/*! + \brief time base IRQ + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_irq (void) +{ + if (RESET != timer_flag_get(TIMER2, TIMER_FLAG_UP)){ + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + + if (delay_time > 0x00U){ + delay_time--; + } else { + timer_disable(TIMER2); + } + } +} + +/*! + \brief delay routine based on TIM0 + \param[in] nTime: delay Time + \param[in] unit: delay Time unit = mili sec / micro sec + \param[out] none + \retval none +*/ +static void hw_delay(uint32_t ntime, uint8_t unit) +{ + delay_time = ntime; + + hw_time_set(unit); + + while (0U != delay_time) { + } + + timer_disable(TIMER2); +} + +/*! + \brief configures TIM0 for delay routine based on TIM0 + \param[in] unit: msec /usec + \param[out] none + \retval none +*/ +static void hw_time_set(uint8_t unit) +{ + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER2); + timer_deinit(TIMER2); + + if(TIM_USEC_DELAY == unit) { + timer_initpara.period = 11; + } else if(TIM_MSEC_DELAY == unit) { + timer_initpara.period = 11999; + } + + timer_initpara.prescaler = timer_prescaler; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER2, &timer_initpara); + + timer_update_event_enable(TIMER2); + timer_interrupt_enable(TIMER2,TIMER_INT_UP); + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + timer_update_source_config(TIMER2, TIMER_UPDATE_SRC_GLOBAL); + + /* TIMER2 counter enable */ + timer_enable(TIMER2); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/gd32vf103_it.c new file mode 100644 index 0000000..8cae80e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/gd32vf103_it.c @@ -0,0 +1,96 @@ +/*! + \file gd32vf103_it.c + \brief main interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usbd_int.h" +#include "drv_usb_hw.h" +#include "gd32vf103_it.h" + +extern usb_core_driver USB_OTG_dev; +extern uint32_t usbfs_prescaler; + +extern void usb_timer_irq(void); + +/*! + \brief this function handles USBD interrupt + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_IRQHandler (void) +{ + usbd_isr (&USB_OTG_dev); +} + +/*! + \brief this function handles EXTI0_IRQ Handler + \param[in] none + \param[out] none + \retval none +*/ +void EXTI0_IRQHandler(void) +{ + +} + +/*! + \brief this function handles USBD wakeup interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_WKUP_IRQHandler(void) +{ + if (USB_OTG_dev.bp.low_power) { + SystemInit(); + + rcu_usb_clock_config(usbfs_prescaler); + + rcu_periph_clock_enable(RCU_USBFS); + + usb_clock_active(&USB_OTG_dev); + } + + exti_interrupt_flag_clear(EXTI_18); +} + +/*! + \brief this function handles Timer0 updata interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void TIMER2_IRQHandler(void) +{ + usb_timer_irq(); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/iap_core.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/iap_core.c new file mode 100644 index 0000000..88cdc62 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/iap_core.c @@ -0,0 +1,594 @@ +/*! + \file iap_core.c + \brief IAP driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "iap_core.h" + +#define USBD_VID 0x28E9 +#define USBD_PID 0x028B + +uint8_t report_buf[IAP_OUT_PACKET + 1]; +uint8_t option_byte[IAP_IN_PACKET] = {0}; + +/* state machine variables */ +uint8_t device_status[IAP_IN_PACKET] = {0}; +uint8_t bin_address[IAP_IN_PACKET] = {0}; + +uint8_t usbd_customhid_report_id = 0; +uint8_t flag = 0; + +static uint32_t usbd_customhid_altset = 0; +static uint32_t usbd_customhid_protocol = 0; +static uint32_t usbd_customhid_idlestate = 0; + +static uint16_t transfer_times = 0; +static uint16_t page_count = 0; +static uint32_t file_length = 0; +static uint32_t base_address = APP_LOADED_ADDR; + + +/* Note:it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +__ALIGN_BEGIN const usb_desc_dev device_descripter __ALIGN_END = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200, + .bDeviceClass = 0x00, + .bDeviceSubClass = 0x00, + .bDeviceProtocol = 0x00, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +__ALIGN_BEGIN const usb_descriptor_configuration_set_struct configuration_descriptor __ALIGN_END = +{ + .Config = + { + .header = + { + .bLength = USB_CFG_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = IAP_CONFIG_SET_DESC_SIZE, + .bNumInterfaces = 0x01, + .bConfigurationValue = 0x01, + .iConfiguration = 0x00, + .bmAttributes = 0x80, + .bMaxPower = 0x32 + }, + + .HID_Interface = + { + .header = + { + .bLength = USB_ITF_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x02, + .bInterfaceClass = 0x03, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00 + }, + + .HID_VendorHID = + { + .header = + { + .bLength = sizeof(usb_hid_descriptor_hid_struct), + .bDescriptorType = HID_DESCTYPE + }, + .bcdHID = 0x0111, + .bCountryCode = 0x00, + .bNumDescriptors = 0x01, + .bDescriptorType = HID_REPORT_DESCTYPE, + .wDescriptorLength = IAP_REPORT_DESC_SIZE, + }, + + .HID_ReportINEndpoint = + { + .header = + { + .bLength = USB_EP_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = IAP_IN_EP, + .bmAttributes = 0x03, + .wMaxPacketSize = IAP_IN_PACKET, + .bInterval = 0x20 + }, + + .HID_ReportOUTEndpoint = + { + .header = + { + .bLength = USB_EP_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = IAP_OUT_EP, + .bmAttributes = 0x03, + .wMaxPacketSize = IAP_OUT_PACKET, + .bInterval = 0x20 + } +}; + +/* USB language ID Descriptor */ +__ALIGN_BEGIN const usb_desc_LANGID usbd_language_id_desc __ALIGN_END = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* USB serial string */ +__ALIGN_BEGIN uint8_t usbd_serial_string[USB_SERIAL_STRING_SIZE] __ALIGN_END = +{ + USB_SERIAL_STRING_SIZE, /* bLength */ + USB_DESCTYPE_STR, /* bDescriptorType */ +}; + +__ALIGN_BEGIN void* const usbd_strings[] __ALIGN_END = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = USBD_STRING_DESC("GigaDevice"), + [STR_IDX_PRODUCT] = USBD_STRING_DESC("GD32 USB IAP in FS Mode"), + [STR_IDX_SERIAL] = usbd_serial_string +}; + +/* USB custom HID device report descriptor */ +__ALIGN_BEGIN const uint8_t iap_report_descriptor[IAP_REPORT_DESC_SIZE] __ALIGN_END = +{ + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x00, /* USAGE (Custom Device) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + + /* IAP command and data */ + 0x85, 0x01, /* REPORT_ID (0x01) */ + 0x09, 0x01, /* USAGE (IAP command) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x95, 0x3f, /* REPORT_COUNT(63) */ + 0x91, 0x82, /* OUTPUT (Data,Var,Abs,Vol) */ + + /* device status and option byte */ + 0x85, 0x02, /* REPORT_ID (0x02) */ + 0x09, 0x02, /* USAGE (Status and option byte) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0xff, /* LOGICAL_MAXIMUM (255) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x95, 0x17, /* REPORT_COUNT (23) */ + 0x81, 0x82, /* INPUT (Data,Var,Abs,Vol) */ + + 0xc0 /* END_COLLECTION */ +}; + +/* IAP requests management functions */ +static void iap_req_erase (usb_dev *pudev); +static void iap_req_dnload (usb_dev *pudev); +static void iap_req_optionbyte(usb_dev *pudev, uint8_t option_ID); +static void iap_req_leave (usb_dev *pudev); +static void iap_address_send (usb_dev *pudev); + +static void iap_data_write (uint8_t *data, uint32_t addr, uint32_t len); + +/*! + \brief initialize the HID device + \param[in] pudev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +uint8_t iap_init (usb_dev *pudev, uint8_t config_index) +{ + /* initialize Tx endpoint */ + usbd_ep_setup(pudev, &(configuration_descriptor.HID_ReportINEndpoint)); + + /* initialize Rx endpoint */ + usbd_ep_setup(pudev, &(configuration_descriptor.HID_ReportOUTEndpoint)); + + /* unlock the internal flash */ + fmc_unlock(); + + /* prepare receive Data */ + usbd_ep_recev(pudev, IAP_OUT_EP, report_buf, IAP_OUT_PACKET); + + return USBD_OK; +} + +/*! + \brief de-initialize the HID device + \param[in] pudev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +uint8_t iap_deinit (usb_dev *pudev, uint8_t config_index) +{ + /* deinitialize HID endpoints */ + usbd_ep_clear (pudev, IAP_IN_EP); + usbd_ep_clear (pudev, IAP_OUT_EP); + + /* lock the internal flash */ + fmc_lock(); + + return USBD_OK; +} + +/*! + \brief handle the HID class-specific requests + \param[in] pudev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +uint8_t iap_req_handler (usb_dev *pudev, usb_req *req) +{ + uint16_t len = 0; + uint8_t *pbuf = NULL; + uint8_t USBD_CUSTOMHID_Report_LENGTH = 0; + + switch (req->bmRequestType & USB_REQTYPE_MASK) { + case USB_REQTYPE_CLASS: + switch (req->bRequest) { + case GET_REPORT: + /* no use for this driver */ + break; + case GET_IDLE: + pudev->dev.transc_in[0].xfer_buf = (uint8_t *)&usbd_customhid_idlestate; + pudev->dev.transc_in[0].remain_len = 1; + break; + case GET_PROTOCOL: + pudev->dev.transc_in[0].xfer_buf = (uint8_t *)&usbd_customhid_protocol; + pudev->dev.transc_in[0].remain_len = 1; + break; + case SET_REPORT: + flag = 1; + usbd_customhid_report_id = (uint8_t)(req->wValue); + USBD_CUSTOMHID_Report_LENGTH = (uint8_t)(req->wLength); + pudev->dev.transc_out[0].xfer_buf = report_buf; + pudev->dev.transc_out[0].remain_len = USBD_CUSTOMHID_Report_LENGTH; + break; + case SET_IDLE: + usbd_customhid_idlestate = (uint8_t)(req->wValue >> 8); + break; + case SET_PROTOCOL: + usbd_customhid_protocol = (uint8_t)(req->wValue); + break; + default: + usbd_enum_error (pudev, req); + return USBD_FAIL; + } + break; + case USB_REQTYPE_STRD: + /* standard device request */ + switch(req->bRequest) { + case USB_GET_DESCRIPTOR: + switch(req->wValue >> 8) { + case HID_REPORT_DESCTYPE: + len = USB_MIN(IAP_REPORT_DESC_SIZE, req->wLength); + pbuf = (uint8_t *)iap_report_descriptor; + break; + case HID_DESCTYPE: + len = USB_MIN(IAP_CONFIG_DESC_SIZE, req->wLength); + pbuf = (uint8_t *)(&(configuration_descriptor.HID_VendorHID)); + break; + default: + break; + } + pudev->dev.transc_in[0].xfer_buf = pbuf; + pudev->dev.transc_in[0].remain_len = len; + break; + case USB_GET_INTERFACE: + pudev->dev.transc_in[0].xfer_buf = (uint8_t *)&usbd_customhid_altset; + pudev->dev.transc_in[0].remain_len = 1; + break; + case USB_SET_INTERFACE: + usbd_customhid_altset = (uint8_t)(req->wValue); + break; + default: + break; + } + break; + } + + return USBD_OK; +} + +/*! + \brief handle data stage + \param[in] pudev: pointer to USB device instance + \param[in] rx_tx: data transfer direction: + \arg USBD_TX + \arg USBD_RX + \param[in] ep_id: endpoint identifier + \param[out] none + \retval USB device operation status +*/ +uint8_t iap_data_in_handler (usb_dev *pudev, uint8_t ep_id) +{ + if((IAP_IN_EP & 0x7F) == ep_id) { + return USBD_OK; + } + return USBD_FAIL; +} + +uint8_t iap_data_out_handler (usb_dev *pudev, uint8_t ep_id) +{ + if (IAP_OUT_EP == ep_id) { + switch (report_buf[0]) { + case 0x01: + switch(report_buf[1]) { + case IAP_DNLOAD: + iap_req_dnload(pudev); + break; + case IAP_ERASE: + iap_req_erase(pudev); + break; + case IAP_OPTION_BYTE1: + iap_req_optionbyte(pudev, 0x01); + break; + case IAP_LEAVE: + iap_req_leave(pudev); + break; + case IAP_GETBIN_ADDRESS: + iap_address_send(pudev); + break; + case IAP_OPTION_BYTE2: + iap_req_optionbyte(pudev, 0x02); + break; + default: + usbd_enum_error(pudev, NULL); + return USBD_FAIL; + } + break; + default: + break; + } + + usbd_ep_recev(pudev, IAP_OUT_EP, report_buf, IAP_OUT_PACKET); + + return USBD_OK; + } + + return USBD_FAIL; +} + +/*! + \brief send iap report + \param[in] pudev: pointer to USB device instance + \param[in] report: pointer to HID report + \param[in] len: data length + \param[out] none + \retval USB device operation status +*/ +uint8_t iap_report_send (usb_dev *pudev, uint8_t *report, uint16_t len) +{ + usbd_ep_send (pudev, IAP_IN_EP, report, len); + + return USBD_OK; +} + +/*! + \brief handle the IAP_DNLOAD request + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_dnload(usb_dev *pudev) +{ + if (0 != transfer_times) { + if (1 == transfer_times) { + iap_data_write(&report_buf[2], base_address, file_length % TRANSFER_SIZE); + + device_status[0] = 0x02; + device_status[1] = 0x02; + iap_report_send (pudev, device_status, IAP_IN_PACKET); + } else { + iap_data_write(&report_buf[2], base_address, TRANSFER_SIZE); + + base_address += TRANSFER_SIZE; + } + + transfer_times --; + } +} + +/*! + \brief handle the IAP_ERASE request + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_erase(usb_dev *pudev) +{ + uint32_t i = 0, addr = 0; + + /* get base address to erase */ + base_address = report_buf[2]; + base_address |= report_buf[3] << 8; + base_address |= report_buf[4] << 16; + base_address |= report_buf[5] << 24; + + page_count = report_buf[6]; + + /* get file length */ + file_length = report_buf[7]; + file_length |= report_buf[8] << 8; + file_length |= report_buf[9] << 16; + file_length |= report_buf[10] << 24; + + transfer_times = file_length / TRANSFER_SIZE + 1; + + /* check if the address is in protected area */ + if (IS_PROTECTED_AREA(base_address)) { + return; + } + + addr = base_address; + + /* unlock the flash program erase controller */ + fmc_unlock(); + + for (i = 0; i < page_count; i ++) { + /* call the standard flash erase-page function */ + fmc_page_erase(addr); + + addr += PAGE_SIZE; + } + + fmc_lock(); + + device_status[0] = 0x02; + device_status[1] = 0x01; + + usbd_ep_send(pudev, IAP_IN_EP, device_status, IAP_IN_PACKET); +} + +/*! + \brief handle the IAP_OPTION_BYTE request + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_optionbyte(usb_dev *pudev, uint8_t option_ID) +{ + uint8_t i = 0; + uint32_t address = 0; + + option_byte[0] = 0x02; + + if (option_ID == 0x01) { + address = 0x1FFFF800; + } else { + return; + } + + for (i = 1; i < 17; i++) { + option_byte[i] = *(uint8_t *)address; + address++; + } + + iap_report_send (pudev, option_byte, IAP_IN_PACKET); +} + +/*! + \brief handle the IAP_LEAVE request + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_req_leave(usb_dev *pudev) +{ + /* lock the internal flash */ + fmc_lock(); + + /* generate system reset to allow jumping to the user code */ + eclic_system_reset(); +} + +/*! + \brief handle the IAP_SEND_ADDRESS request + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval none +*/ +static void iap_address_send(usb_dev *pudev) +{ + bin_address[0] = 0x02; + + bin_address[1] = (uint8_t)(APP_LOADED_ADDR); + bin_address[2] = (uint8_t)(APP_LOADED_ADDR >> 8); + bin_address[3] = (uint8_t)(APP_LOADED_ADDR >> 16); + bin_address[4] = (uint8_t)(APP_LOADED_ADDR >> 24); + + iap_report_send (pudev, bin_address, IAP_IN_PACKET); +} + +/*! + \brief write data to sectors of memory + \param[in] data: data to be written + \param[in] addr: sector address/code + \param[in] len: length of data to be written (in bytes) + \param[out] none + \retval MAL_OK if all operations are OK, MAL_FAIL else +*/ +static void iap_data_write (uint8_t *data, uint32_t addr, uint32_t len) +{ + uint32_t idx = 0; + + /* check if the address is in protected area */ + if (IS_PROTECTED_AREA(addr)) { + return; + } + + /* unlock the flash program erase controller */ + fmc_unlock(); + + /* data received are word multiple */ + for (idx = 0; idx < len; idx += 2) { + if (FMC_READY == fmc_halfword_program(addr, *(uint16_t *)(data + idx))) { + addr += 2; + } else { + while(1); + } + } + + fmc_lock(); +} + +usb_class_core usbd_hid_cb = { + .command = NO_CMD, + .alter_set = 0, + + .init = iap_init, + .deinit = iap_deinit, + .req_proc = iap_req_handler, + .data_in = iap_data_in_handler, + .data_out = iap_data_out_handler +}; diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/system_gd32vf103.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/system_gd32vf103.c new file mode 100644 index 0000000..05e5205 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/Source/system_gd32vf103.c @@ -0,0 +1,998 @@ +/*! + \file system_gd32vf103.h + \brief RISC-V Device Peripheral Access Layer Source File for + GD32VF103 Device Series + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* This file refers the RISC-V standard, some adjustments are made according to GigaDevice chips */ + +#include "gd32vf103.h" + +/* system frequency define */ +#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */ + +/* select a system clock by uncommenting the following line */ +/* use IRC8M */ +//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000) + +/********************************************************************/ +//#define __SYSTEM_CLOCK_HXTAL (HXTAL_VALUE) +//#define __SYSTEM_CLOCK_24M_PLL_HXTAL (uint32_t)(24000000) +/********************************************************************/ + +//#define __SYSTEM_CLOCK_36M_PLL_HXTAL (uint32_t)(36000000) +//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_56M_PLL_HXTAL (uint32_t)(56000000) +//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000) +#define __SYSTEM_CLOCK_96M_PLL_HXTAL (uint32_t)(96000000) +//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000) + +#define SEL_IRC8M 0x00U +#define SEL_HXTAL 0x01U +#define SEL_PLL 0x02U + +/* set the system clock frequency and declare the system clock configuration function */ +#ifdef __SYSTEM_CLOCK_48M_PLL_IRC8M +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_IRC8M; +static void system_clock_48m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M; +static void system_clock_72m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_IRC8M; +static void system_clock_108m_irc8m(void); + +#elif defined (__SYSTEM_CLOCK_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; +static void system_clock_hxtal(void); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_24M_PLL_HXTAL; +static void system_clock_24m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_36M_PLL_HXTAL; +static void system_clock_36m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_HXTAL; +static void system_clock_48m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_56M_PLL_HXTAL; +static void system_clock_56m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL; +static void system_clock_72m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_HXTAL; +static void system_clock_96m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL; +static void system_clock_108m_hxtal(void); +#else +uint32_t SystemCoreClock = IRC8M_VALUE; +#endif /* __SYSTEM_CLOCK_48M_PLL_IRC8M */ + +/* configure the system clock */ +static void system_clock_config(void); + +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ +#ifdef __SYSTEM_CLOCK_HXTAL + system_clock_hxtal(); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) + system_clock_24m_hxtal(); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) + system_clock_36m_hxtal(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) + system_clock_48m_hxtal(); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) + system_clock_56m_hxtal(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) + system_clock_72m_hxtal(); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) + system_clock_96m_hxtal(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) + system_clock_108m_hxtal(); + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) + system_clock_48m_irc8m(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) + system_clock_72m_irc8m(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) + system_clock_108m_irc8m(); +#endif /* __SYSTEM_CLOCK_HXTAL */ +} + +/*! + \brief setup the microcontroller system, initialize the system + \param[in] none + \param[out] none + \retval none +*/ +void SystemInit(void) +{ + /* reset the RCC clock configuration to the default reset state */ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* reset SCS, AHBPSC, APB1PSC, APB2PSC, ADCPSC, CKOUT0SEL bits */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_ADCPSC_2 | RCU_CFG0_CKOUT0SEL); + + /* reset HXTALEN, CKMEN, PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + + /* Reset HXTALBPS bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* reset PLLSEL, PREDV0_LSB, PLLMF, USBFSPSC bits */ + + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_PLLMF_4); + RCU_CFG1 = 0x00000000U; + + /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x00FF0000U; + + /* Configure the System clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */ + system_clock_config(); +} + +/*! + \brief update the SystemCoreClock with current core clock retrieved from cpu registers + \param[in] none + \param[out] none + \retval none +*/ +void SystemCoreClockUpdate(void) +{ + uint32_t scss; + uint32_t pllsel, predv0sel, pllmf, ck_src; + uint32_t predv0, predv1, pll1mf; + + scss = GET_BITS(RCU_CFG0, 2, 3); + + switch (scss) + { + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + SystemCoreClock = IRC8M_VALUE; + break; + + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + + if(RCU_PLLSRC_IRC8M_DIV2 == pllsel){ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE / 2U; + }else{ + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + + if(pllmf >= 15U){ + pllmf += 1U; + }else{ + pllmf += 2U; + } + + SystemCoreClock = ck_src * pllmf; + + if(15U == pllmf){ + /* PLL source clock multiply by 6.5 */ + SystemCoreClock = ck_src * 6U + ck_src / 2U; + } + + break; + + /* IRC8M is selected as CK_SYS */ + default: + SystemCoreClock = IRC8M_VALUE; + break; + } +} + +#ifdef __SYSTEM_CLOCK_HXTAL +/*! + \brief configure the system clock to HXTAL + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select HXTAL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; + + /* wait until HXTAL is selected as system clock */ + while(0 == (RCU_CFG0 & RCU_SCSS_HXTAL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +/*! + \brief configure the system clock to 24M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_24m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 6 = 24 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +/*! + \brief configure the system clock to 36M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_36m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 9 = 36 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +/*! + \brief configure the system clock to 48M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL12); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +/*! + \brief configure the system clock to 56M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_56m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 14 = 56 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL14); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +/*! + \brief configure the system clock to 72M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL18); + + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +/*! + \brief configure the system clock to 96M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_96m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + if(HXTAL_VALUE==25000000){ + + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +/*! + \brief configure the system clock to 108M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ + +static void system_clock_108m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL27); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PREDV1_DIV5 | RCU_PLL1_MUL8 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 | RCU_PREDV1_DIV2 | RCU_PLL1_MUL20 | RCU_PLL2_MUL20); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL2 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + + } + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +/*! + \brief configure the system clock to 48M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL12; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +/*! + \brief configure the system clock to 72M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL18; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +/*! + \brief configure the system clock to 108M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL27; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/readme.txt new file mode 100644 index 0000000..e4d66dc --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_IAP/readme.txt @@ -0,0 +1,52 @@ +/*! + \file readme.txt + \brief description of the USB HID IAP demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board,it provides a description of +how to use the USBFS peripheral. + + The GD32 device is enumerated as an USB Custom HID device for IAP, that uses the +native PC Host HID driver. + + To test the demo, you need a configuration hex image or bin image. The hex image +or the bin image should set application address at 0x8010000. + + To test the demo, you need to: + - Download the "USB IAP Client" PC applet + - Start the "USB IAP Client" PC applet and connect GD32 USB to PC (Note: maybe + the driver installion is failed in the first time, try reseating again.) + - The device should be detected and shown in the PC applet + - Select the hex image and download it to the flash + - After each device reset, the mcu will enter IAP mode + - After each device reset, hold down the key A on the GD32VF103V-EVAL board + to run the new application diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Eclipse/usbd_mouse/.cproject b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Eclipse/usbd_mouse/.cproject new file mode 100644 index 0000000..9b899dc --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Eclipse/usbd_mouse/.cproject @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Eclipse/usbd_mouse/.project b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Eclipse/usbd_mouse/.project new file mode 100644 index 0000000..ed55170 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Eclipse/usbd_mouse/.project @@ -0,0 +1,603 @@ + + + usbd_mouse + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + Examples + 2 + virtual:/virtual + + + Firmware + 2 + virtual:/virtual + + + Utilities + 2 + virtual:/virtual + + + Examples/USBFS + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver + 2 + virtual:/virtual + + + Firmware/RISCV + 2 + virtual:/virtual + + + Utilities/gd32vf103v_eval.c + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.c + + + Utilities/gd32vf103v_eval.h + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.h + + + Examples/USBFS/USB_Device + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Source + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/gd32vf103.h + + + Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + + + Firmware/GD32VF103_usbfs_driver/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver/Source + 2 + virtual:/virtual + + + Firmware/RISCV/drivers + 2 + virtual:/virtual + + + Firmware/RISCV/env_Eclipse + 2 + virtual:/virtual + + + Firmware/RISCV/stubs + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/HID_Mouse + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h + + + Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c + + + Firmware/RISCV/drivers/n200_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_eclic.h + + + Firmware/RISCV/drivers/n200_func.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.c + + + Firmware/RISCV/drivers/n200_func.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.h + + + Firmware/RISCV/drivers/n200_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_timer.h + + + Firmware/RISCV/drivers/riscv_bits.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_bits.h + + + Firmware/RISCV/drivers/riscv_const.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_const.h + + + Firmware/RISCV/drivers/riscv_encoding.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_encoding.h + + + Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + + + Firmware/RISCV/env_Eclipse/entry.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/entry.S + + + Firmware/RISCV/env_Eclipse/handlers.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/handlers.c + + + Firmware/RISCV/env_Eclipse/init.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/init.c + + + Firmware/RISCV/env_Eclipse/start.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/start.S + + + Firmware/RISCV/env_Eclipse/your_printf.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/your_printf.c + + + Firmware/RISCV/stubs/_exit.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/_exit.c + + + Firmware/RISCV/stubs/close.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/close.c + + + Firmware/RISCV/stubs/fstat.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/fstat.c + + + Firmware/RISCV/stubs/isatty.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/isatty.c + + + Firmware/RISCV/stubs/lseek.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/lseek.c + + + Firmware/RISCV/stubs/read.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/read.c + + + Firmware/RISCV/stubs/sbrk.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/sbrk.c + + + Firmware/RISCV/stubs/stub.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/stub.h + + + Firmware/RISCV/stubs/write.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write.c + + + Firmware/RISCV/stubs/write_hex.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write_hex.c + + + Examples/USBFS/USB_Device/HID_Mouse/Include + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/HID_Mouse/Source + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/HID_Mouse/Include/gd32vf103_it.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_it.h + + + Examples/USBFS/USB_Device/HID_Mouse/Include/gd32vf103_libopt.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_libopt.h + + + Examples/USBFS/USB_Device/HID_Mouse/Include/standard_hid_core.h + 1 + PARENT-2-PROJECT_LOC/Include/standard_hid_core.h + + + Examples/USBFS/USB_Device/HID_Mouse/Include/systick.h + 1 + PARENT-2-PROJECT_LOC/Include/systick.h + + + Examples/USBFS/USB_Device/HID_Mouse/Include/usb_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usb_conf.h + + + Examples/USBFS/USB_Device/HID_Mouse/Include/usb_hid.h + 1 + PARENT-2-PROJECT_LOC/Include/usb_hid.h + + + Examples/USBFS/USB_Device/HID_Mouse/Include/usbd_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usbd_conf.h + + + Examples/USBFS/USB_Device/HID_Mouse/Source/app.c + 1 + PARENT-2-PROJECT_LOC/Source/app.c + + + Examples/USBFS/USB_Device/HID_Mouse/Source/gd32vf103_hw.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_hw.c + + + Examples/USBFS/USB_Device/HID_Mouse/Source/gd32vf103_it.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_it.c + + + Examples/USBFS/USB_Device/HID_Mouse/Source/standard_hid_core.c + 1 + PARENT-2-PROJECT_LOC/Source/standard_hid_core.c + + + Examples/USBFS/USB_Device/HID_Mouse/Source/system_gd32vf103.c + 1 + PARENT-2-PROJECT_LOC/Source/system_gd32vf103.c + + + Examples/USBFS/USB_Device/HID_Mouse/Source/systick.c + 1 + PARENT-2-PROJECT_LOC/Source/systick.c + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Eclipse/usbd_mouse/.settings/language.settings.xml b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Eclipse/usbd_mouse/.settings/language.settings.xml new file mode 100644 index 0000000..5a45c33 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Eclipse/usbd_mouse/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/gd32vf103_it.h new file mode 100644 index 0000000..99bf030 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/gd32vf103_it.h @@ -0,0 +1,63 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_core.h" + +typedef enum { + JOY_NONE = 0, + JOY_SEL, + JOY_UP, + JOY_DOWN, + JOY_LEFT, + JOY_RIGHT +} joystate_enum; + +/* function declarations */ +/* this function handles USB wakeup interrupt handler */ +void USBFS_WKUP_IRQHandler(void); +/* this function handles USBFS IRQ Handler */ +void USBFS_IRQHandler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/gd32vf103_libopt.h new file mode 100644 index 0000000..60680cf --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/standard_hid_core.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/standard_hid_core.h new file mode 100644 index 0000000..65d5912 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/standard_hid_core.h @@ -0,0 +1,56 @@ +/*! + \file standard_hid_core.h + \brief definitions for HID core + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __STANDARD_HID_CORE_H +#define __STANDARD_HID_CORE_H + +#include "usbd_enum.h" +#include "usb_hid.h" + +#define USB_HID_CONFIG_DESC_LEN 0x22U +#define USB_HID_REPORT_DESC_LEN 0x4AU + +#define NO_CMD 0xFFU + +extern void* const usbd_hid_strings[USB_STRING_COUNT]; +extern const usb_desc_dev hid_dev_desc; +extern const usb_hid_desc_config_set hid_config_desc; +extern usb_class_core usbd_hid_cb; + +/* function declarations */ + +/* send keyboard report */ +uint8_t hid_report_send (usb_dev *pudev, uint8_t *report, uint16_t len); + +#endif /* __STANDARD_HID_CORE_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/systick.h new file mode 100644 index 0000000..a82b0b5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/systick.h @@ -0,0 +1,44 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void systick_config(void); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/usb_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/usb_conf.h new file mode 100644 index 0000000..b36f0be --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/usb_conf.h @@ -0,0 +1,121 @@ +/*! + \file usb_conf.h + \brief USBFS driver basic configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_CONF_H +#define __USB_CONF_H + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#include + +#ifdef USE_USB_FS + #define USB_FS_CORE +#endif + +#ifdef USE_USB_HS + #define USB_HS_CORE +#endif + +#ifdef USB_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 64 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 0 + #define TX3_FIFO_FS_SIZE 0 +#endif /* USB_FS_CORE */ + +#ifdef USB_HS_CORE + #define RX_FIFO_HS_SIZE 512 + #define TX0_FIFO_HS_SIZE 128 + #define TX1_FIFO_HS_SIZE 372 + #define TX2_FIFO_HS_SIZE 0 + #define TX3_FIFO_HS_SIZE 0 + #define TX4_FIFO_HS_SIZE 0 + #define TX5_FIFO_HS_SIZE 0 + + #ifdef USE_ULPI_PHY + #define USB_OTG_ULPI_PHY_ENABLED + #endif + + #ifdef USE_EMBEDDED_PHY + #define USB_OTG_EMBEDDED_PHY_ENABLED + #endif + + #define USB_OTG_HS_INTERNAL_DMA_ENABLED + #define USB_OTG_HS_DEDICATED_EP1_ENABLED +#endif /* USB_HS_CORE */ + +#define USB_SOF_OUTPUT 1 +#define USB_LOW_POWER 1 + +//#define VBUS_SENSING_ENABLED + +//#define USE_HOST_MODE +#define USE_DEVICE_MODE +//#define USE_OTG_MODE + +#ifndef USB_FS_CORE + #ifndef USB_HS_CORE + #error "USB_HS_CORE or USB_FS_CORE should be defined" + #endif +#endif + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_HS + #ifndef USE_USB_FS + #error "USE_USB_HS or USE_USB_FS should be defined" + #endif +#endif + +/****************** C Compilers dependant keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned(4))) + #define __ALIGN_BEGIN + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + + +#endif /* __USB_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/usb_hid.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/usb_hid.h new file mode 100644 index 0000000..c105cf5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/usb_hid.h @@ -0,0 +1,83 @@ +/*! + \file usb_hid.h + \brief definitions for the USB HID class + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_HID_H +#define __USB_HID_H + +#include "usb_ch9_std.h" + +#define USB_HID_CLASS 0x03U + +#define USB_DESCTYPE_HID 0x21U +#define USB_DESCTYPE_REPORT 0x22U + +/* HID subclass code */ +#define USB_HID_SUBCLASS_BOOT_ITF 0x01U + +/* HID protocol codes */ +#define USB_HID_PROTOCOL_KEYBOARD 0x01U +#define USB_HID_PROTOCOL_MOUSE 0x02U + +#define GET_REPORT 0x01U +#define GET_IDLE 0x02U +#define GET_PROTOCOL 0x03U +#define SET_REPORT 0x09U +#define SET_IDLE 0x0AU +#define SET_PROTOCOL 0x0BU + +#pragma pack(1) + +typedef struct +{ + usb_desc_header header; /*!< regular descriptor header containing the descriptor's type and length */ + + uint16_t bcdHID; /*!< BCD encoded version that the HID descriptor and device complies to */ + uint8_t bCountryCode; /*!< country code of the localized device, or zero if universal */ + uint8_t bNumDescriptors; /*!< total number of HID report descriptors for the interface */ + uint8_t bDescriptorType; /*!< type of HID report */ + uint16_t wDescriptorLength; /*!< length of the associated HID report descriptor, in bytes */ +} usb_desc_hid; + +#pragma pack() + +typedef struct +{ + usb_desc_config config; + usb_desc_itf hid_itf; + usb_desc_hid hid_vendor; + usb_desc_ep hid_epin; + usb_desc_ep hid_epout; +}usb_hid_desc_config_set; + +#endif /* __USB_HID_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/usbd_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/usbd_conf.h new file mode 100644 index 0000000..b301a26 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Include/usbd_conf.h @@ -0,0 +1,54 @@ +/*! + \file usbd_conf.h + \brief the header file of USB device-mode configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBD_CONF_H +#define USBD_CONF_H + +#include "usb_conf.h" + +#define USBD_CFG_MAX_NUM 1 +#define USBD_ITF_MAX_NUM 1 + +#define USB_STR_DESC_MAX_SIZE 64 + +#define USB_STRING_COUNT 4U + +/* endpoint count used by the HID device */ +#define HID_IN_EP EP1_IN +#define HID_OUT_EP EP1_OUT + +#define HID_IN_PACKET 8 +#define HID_OUT_PACKET 8 + +#endif /* USBD_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/app.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/app.c new file mode 100644 index 0000000..312398d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/app.c @@ -0,0 +1,102 @@ +/*! + \file main.c + \brief USB main routine for HID device(USB keyboard) + + \version 2019-6-5, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "standard_hid_core.h" +#include +#include +#include +#include "systick.h" + +usb_core_driver USB_OTG_dev = { + .dev = { + .desc = { + .dev_desc = (uint8_t *)&hid_dev_desc, + .config_desc = (uint8_t *)&hid_config_desc, + .strings = usbd_hid_strings, + } + } +}; + +void key_config(void); + +/** + * @brief Main routine will construct a USB virtual ComPort device + * @param None + * @retval None + */ +int main(void) +{ + eclic_global_interrupt_enable(); + + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); + + usb_rcu_config(); + + usb_timer_init(); + + /* configure key */ + key_config(); + + systick_config(); + + usb_intr_config(); + + usbd_init (&USB_OTG_dev, USB_CORE_ENUM_FS, &usbd_hid_cb); + + /* check if USB device is enumerated successfully */ + while (USBD_CONFIGURED != USB_OTG_dev.dev.cur_status) { + } + + while (1) + { + } +} + +/*! + \brief configure key + \param[in] none + \param[out] none + \retval none +*/ +void key_config(void) +{ + gd_eval_key_init(KEY_A, KEY_MODE_GPIO); + gd_eval_key_init(KEY_B, KEY_MODE_GPIO); + gd_eval_key_init(KEY_C, KEY_MODE_GPIO); + gd_eval_key_init(KEY_D, KEY_MODE_GPIO); + + gd_eval_key_init(KEY_CET, KEY_MODE_EXTI); + eclic_irq_enable(KEY_CET_EXTI_IRQn, 2, 0); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/gd32vf103_hw.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/gd32vf103_hw.c new file mode 100644 index 0000000..d312458 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/gd32vf103_hw.c @@ -0,0 +1,207 @@ +/*! + \file gd32vf103_hw.c + \brief USB hardware configuration for GD32VF103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "n200_func.h" +#include +#include +#include + + +#define TIM_MSEC_DELAY 0x01 +#define TIM_USEC_DELAY 0x02 + +__IO uint32_t delay_time = 0; +__IO uint32_t timer_prescaler; +__IO uint32_t usbfs_prescaler = 0; + +static void hw_time_set (uint8_t unit); +static void hw_delay (uint32_t ntime, uint8_t unit); + + +/*! + \brief configure USB clock + \param[in] none + \param[out] none + \retval none +*/ +void usb_rcu_config(void) +{ + uint32_t system_clock = rcu_clock_freq_get(CK_SYS); + + if (system_clock == 48000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1; + timer_prescaler = 3; + } else if (system_clock == 72000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1_5; + timer_prescaler = 5; + } else if (system_clock == 96000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV2; + timer_prescaler = 7; + } else { + /* reserved */ + } + + rcu_usb_clock_config(usbfs_prescaler); + rcu_periph_clock_enable(RCU_USBFS); +} + +/*! + \brief configure USB interrupt + \param[in] none + \param[out] none + \retval none +*/ +void usb_intr_config(void) +{ + eclic_irq_enable((uint8_t)USBFS_IRQn, 1, 0); + + /* enable the power module clock */ + rcu_periph_clock_enable(RCU_PMU); + + /* USB wakeup EXTI line configuration */ + exti_interrupt_flag_clear(EXTI_18); + exti_init(EXTI_18, EXTI_INTERRUPT, EXTI_TRIG_RISING); + exti_interrupt_enable(EXTI_18); + + eclic_irq_enable((uint8_t)USBFS_WKUP_IRQn, 3, 0); +} + +/*! + \brief initializes delay unit using Timer2 + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_init (void) +{ + rcu_periph_clock_enable(RCU_TIMER2); + + eclic_irq_enable(TIMER2_IRQn, 3, 0); +} + +/*! + \brief delay in micro seconds + \param[in] usec: value of delay required in micro seconds + \param[out] none + \retval none +*/ +void usb_udelay (const uint32_t usec) +{ + hw_delay(usec, TIM_USEC_DELAY); +} + +/*! + \brief delay in milli seconds + \param[in] msec: value of delay required in milli seconds + \param[out] none + \retval none +*/ +void usb_mdelay (const uint32_t msec) +{ + hw_delay(msec, TIM_MSEC_DELAY); +} + +/*! + \brief time base IRQ + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_irq (void) +{ + if (RESET != timer_flag_get(TIMER2, TIMER_FLAG_UP)){ + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + + if (delay_time > 0x00U){ + delay_time--; + } else { + timer_disable(TIMER2); + } + } +} + +/*! + \brief delay routine based on TIM0 + \param[in] nTime: delay Time + \param[in] unit: delay Time unit = mili sec / micro sec + \param[out] none + \retval none +*/ +static void hw_delay(uint32_t ntime, uint8_t unit) +{ + delay_time = ntime; + + hw_time_set(unit); + + while (0U != delay_time) { + } + + timer_disable(TIMER2); +} + +/*! + \brief configures TIM0 for delay routine based on TIM0 + \param[in] unit: msec /usec + \param[out] none + \retval none +*/ +static void hw_time_set(uint8_t unit) +{ + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER2); + timer_deinit(TIMER2); + + if(TIM_USEC_DELAY == unit) { + timer_initpara.period = 11; + } else if(TIM_MSEC_DELAY == unit) { + timer_initpara.period = 11999; + } + + timer_initpara.prescaler = timer_prescaler; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER2, &timer_initpara); + + timer_update_event_enable(TIMER2); + timer_interrupt_enable(TIMER2,TIMER_INT_UP); + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + timer_update_source_config(TIMER2, TIMER_UPDATE_SRC_GLOBAL); + + /* TIMER2 counter enable */ + timer_enable(TIMER2); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/gd32vf103_it.c new file mode 100644 index 0000000..b94ee67 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/gd32vf103_it.c @@ -0,0 +1,205 @@ +/*! + \file gd32vf103_it.c + \brief main interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usbd_int.h" +#include "drv_usb_hw.h" +#include "gd32vf103_it.h" +#include "standard_hid_core.h" +#include "gd32vf103v_eval.h" + +#define CURSOR_STEP 5 + +extern usb_core_driver USB_OTG_dev; +extern uint32_t usbfs_prescaler; + +void usb_timer_irq(void); +static uint8_t joystate_get(void); +static uint8_t* usbd_mice_pos_get(void); + +/*! + \brief this function handles Core timer Handler + \param[in] none + \param[out] none + \retval none +*/ +void eclic_mtip_handler(void) +{ + uint8_t* buf; + + *(uint64_t*)(TIMER_CTRL_ADDR + TIMER_MTIME) = 0; + + buf = usbd_mice_pos_get(); + + if ((buf[1] != 0) || (buf[2] != 0)) { + hid_report_send(&USB_OTG_dev, buf, 4); + } +} + +/*! + \brief this function handles USBD interrupt + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_IRQHandler (void) +{ + usbd_isr (&USB_OTG_dev); +} + +/*! + \brief this function handles EXTI4_IRQ Handler + \param[in] none + \param[out] none + \retval none +*/ +void EXTI4_IRQHandler(void) +{ + if (exti_interrupt_flag_get(KEY_CET_EXTI_LINE) != RESET) { + if (USB_OTG_dev.dev.pm.dev_remote_wakeup) { + SystemInit(); + + rcu_usb_clock_config(usbfs_prescaler); + + rcu_periph_clock_enable(RCU_USBFS); + + usb_clock_active(&USB_OTG_dev); + + usb_rwkup_set(&USB_OTG_dev); + + usb_mdelay(5U); + + usb_rwkup_reset(&USB_OTG_dev); + + USB_OTG_dev.dev.cur_status = USB_OTG_dev.dev.backup_status; + + USB_OTG_dev.dev.pm.dev_remote_wakeup = 0U; + } + + /* clear the exti line pending bit */ + exti_interrupt_flag_clear(KEY_CET_EXTI_LINE); + } +} + +/*! + \brief this function handles USBD wakeup interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_WKUP_IRQHandler(void) +{ + if (USB_OTG_dev.bp.low_power) { + SystemInit(); + + rcu_usb_clock_config(usbfs_prescaler); + + rcu_periph_clock_enable(RCU_USBFS); + + usb_clock_active(&USB_OTG_dev); + } + + exti_interrupt_flag_clear(EXTI_18); +} + +/*! + \brief this function handles Timer2 updata interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void TIMER2_IRQHandler(void) +{ + usb_timer_irq(); +} + +/*! + \brief get joystick state + \param[in] none + \param[out] none + \retval state +*/ +static uint8_t joystate_get(void) +{ + if (0 == gd_eval_key_state_get(KEY_A)) { + return JOY_UP; + } else if (0 == gd_eval_key_state_get(KEY_B)) { + return JOY_LEFT; + } else if (0 == gd_eval_key_state_get(KEY_C)) { + return JOY_DOWN; + } else if (0 == gd_eval_key_state_get(KEY_D)) { + return JOY_RIGHT; + } else { + return JOY_NONE; + } +} + +/*! + \brief get mice position + \param[in] none + \param[out] none + \retval the value of position +*/ +static uint8_t* usbd_mice_pos_get(void) +{ + int8_t x = 0, y = 0; + static uint8_t mice_buf[4] = {0,0,0,0}; + + switch (joystate_get()) { + case JOY_UP: + y = -CURSOR_STEP; + break; + + case JOY_DOWN: + y = CURSOR_STEP; + break; + + case JOY_LEFT: + x = -CURSOR_STEP; + break; + + case JOY_RIGHT: + x = CURSOR_STEP; + break; + + default: + break; + } + + mice_buf[0] = 0; + mice_buf[1] = x; + mice_buf[2] = y; + mice_buf[3] = 0; + + return mice_buf; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/standard_hid_core.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/standard_hid_core.c new file mode 100644 index 0000000..52e0816 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/standard_hid_core.c @@ -0,0 +1,326 @@ +/*! + \file standard_hid_core.c + \brief HID class driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "standard_hid_core.h" + +#define USBD_VID 0x28e9 +#define USBD_PID 0x0380 + +static uint32_t usbd_hid_protocol = 0; +static uint32_t usbd_hid_idlestate = 0; +__IO uint8_t prev_transfer_complete = 1; + +/* Note:it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +const usb_desc_dev hid_dev_desc = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +const usb_hid_desc_config_set hid_config_desc = +{ + .config = + { + .header = + { + .bLength = USB_CFG_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_HID_CONFIG_DESC_LEN, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xA0U, + .bMaxPower = 0x32U + }, + + .hid_itf = + { + .header = + { + .bLength = USB_ITF_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x01U, + .bInterfaceClass = USB_HID_CLASS, + .bInterfaceSubClass = USB_HID_SUBCLASS_BOOT_ITF, + .bInterfaceProtocol = USB_HID_PROTOCOL_MOUSE, + .iInterface = 0x00U + }, + + .hid_vendor = + { + .header = + { + .bLength = sizeof(usb_desc_hid), + .bDescriptorType = USB_DESCTYPE_HID + }, + .bcdHID = 0x0111U, + .bCountryCode = 0x00U, + .bNumDescriptors = 0x01U, + .bDescriptorType = USB_DESCTYPE_REPORT, + .wDescriptorLength = USB_HID_REPORT_DESC_LEN, + }, + + .hid_epin = + { + .header = + { + .bLength = USB_EP_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = HID_IN_EP, + .bmAttributes = USB_EP_ATTR_INT, + .wMaxPacketSize = HID_IN_PACKET, + .bInterval = 0x01U, + } +}; + +/* USB language ID Descriptor */ +const usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +void *const usbd_hid_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = USBD_STRING_DESC("GigaDevice"), + [STR_IDX_PRODUCT] = USBD_STRING_DESC("GD32 USB Mouse in FS Mode"), + [STR_IDX_SERIAL] = USBD_STRING_DESC("GD32VF103-V1.0.0-3a4b5ed") +}; + +const uint8_t hid_report_desc[USB_HID_REPORT_DESC_LEN] = +{ + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x02, /* USAGE (Mouse) */ + 0xa1, 0x01, /* COLLECTION (Application) */ + 0x09, 0x01, /* USAGE (Pointer) */ + + 0xa1, 0x00, /* COLLECTION (Physical) */ + 0x05, 0x09, /* USAGE_PAGE (Button) */ + 0x19, 0x01, /* USAGE_MINIMUM (1) */ + 0x29, 0x03, /* USAGE_MAXIMUM (3) */ + + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x95, 0x03, /* REPORT_COUNT (3) */ + 0x75, 0x01, /* REPORT_SIZE (1) */ + 0x81, 0x02, /* INPUT (Data,Var,Abs) */ + + 0x95, 0x01, /* REPORT_COUNT (1) */ + 0x75, 0x05, /* REPORT_SIZE (5) */ + 0x81, 0x01, /* INPUT (Cnst,Var,Abs) */ + + 0x05, 0x01, /* USAGE_PAGE (Generic Desktop) */ + 0x09, 0x30, /* USAGE (X) */ + 0x09, 0x31, /* USAGE (Y) */ + 0x09, 0x38, /* USAGE (Wheel) */ + + 0x15, 0x81, /* LOGICAL_MINIMUM (81) */ + 0x25, 0x7F, /* LOGICAL_MAXIMUM (7F) */ + 0x75, 0x08, /* REPORT_SIZE (8) */ + 0x95, 0x03, /* REPORT_COUNT (3) */ + 0x81, 0x06, /* INPUT (Data,Ary,Abs) */ + 0xc0, /* END_COLLECTION */ + + 0x09, 0x3c, /* USAGE (Motion Wakeup) */ + 0x05, 0xff, /* USAGE PAGE (vendor defined) */ + 0x09, 0x01, /* USAGE(01) */ + 0x15, 0x00, /* LOGICAL_MINIMUM (0) */ + 0x25, 0x01, /* LOGICAL_MAXIMUM (1) */ + 0x75, 0x01, /* REPORT_SIZE (1) */ + 0x95, 0x02, /* REPORT_COUNT (2) */ + 0xb1, 0x22, /* Feature (var) */ + 0x75, 0x06, /* REPORT_SIZE (6) */ + 0x95, 0x01, /* REPORT_COUNT (1) */ + 0xb1, 0x01, /* Feature (cnst) */ + 0xc0 +}; + +/* local function prototypes ('static') */ +static uint8_t hid_init (usb_dev *udev, uint8_t config_index); +static uint8_t hid_deinit (usb_dev *udev, uint8_t config_index); +static uint8_t hid_req (usb_dev *udev, usb_req *req); +static uint8_t hid_data_in (usb_dev *udev, uint8_t ep_num); + +usb_class_core usbd_hid_cb = { + .command = NO_CMD, + .alter_set = 0, + + .init = hid_init, + .deinit = hid_deinit, + .req_proc = hid_req, + .data_in = hid_data_in +}; + + +/*! + \brief initialize the HID device + \param[in] pudev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_init (usb_dev *udev, uint8_t config_index) +{ + /* Initialize the data Tx endpoint */ + usbd_ep_setup (udev, &(hid_config_desc.hid_epin)); + + return USBD_OK; +} + +/*! + \brief de-initialize the HID device + \param[in] pudev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_deinit (usb_dev *pudev, uint8_t config_index) +{ + /* deinitialize HID endpoints */ + usbd_ep_clear(pudev, HID_IN_EP); + + return USBD_OK; +} + +/*! + \brief handle the HID class-specific requests + \param[in] pudev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_req (usb_dev *pudev, usb_req *req) +{ + usb_transc *transc = &pudev->dev.transc_in[0]; + + switch (req->bRequest) { + case GET_REPORT: + /* no use for this driver */ + break; + + case GET_IDLE: + transc->xfer_buf = (uint8_t *)&usbd_hid_idlestate; + transc->remain_len = 1; + break; + + case GET_PROTOCOL: + transc->xfer_buf = (uint8_t *)&usbd_hid_protocol; + transc->remain_len = 1; + break; + + case SET_REPORT: + /* no use for this driver */ + break; + + case SET_IDLE: + usbd_hid_idlestate = (uint8_t)(req->wValue >> 8); + break; + + case SET_PROTOCOL: + usbd_hid_protocol = (uint8_t)(req->wValue); + break; + + case USB_GET_DESCRIPTOR: + if (USB_DESCTYPE_REPORT == (req->wValue >> 8)) { + transc->remain_len = USB_MIN(USB_HID_REPORT_DESC_LEN, req->wLength); + transc->xfer_buf = (uint8_t *)hid_report_desc; + return REQ_SUPP; + } + break; + + default: + break; + } + + return USBD_OK; +} + +/*! + \brief handle data stage + \param[in] pudev: pointer to USB device instance + \param[in] ep_num: endpoint identifier + \param[out] none + \retval USB device operation status +*/ +static uint8_t hid_data_in (usb_dev *pudev, uint8_t ep_num) +{ + prev_transfer_complete = 1; + return USBD_OK; +} + +/*! + \brief send keyboard report + \param[in] pudev: pointer to USB device instance + \param[in] report: pointer to HID report + \param[in] len: data length + \param[out] none + \retval USB device operation status +*/ +uint8_t hid_report_send (usb_dev *pudev, uint8_t *report, uint16_t len) +{ + if (pudev->dev.cur_status == USBD_CONFIGURED) { + if(1 == prev_transfer_complete){ + prev_transfer_complete = 0; + usbd_ep_send(pudev, HID_IN_EP, report, len); + } + } + + return USBD_OK; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/system_gd32vf103.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/system_gd32vf103.c new file mode 100644 index 0000000..05e5205 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/system_gd32vf103.c @@ -0,0 +1,998 @@ +/*! + \file system_gd32vf103.h + \brief RISC-V Device Peripheral Access Layer Source File for + GD32VF103 Device Series + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* This file refers the RISC-V standard, some adjustments are made according to GigaDevice chips */ + +#include "gd32vf103.h" + +/* system frequency define */ +#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */ + +/* select a system clock by uncommenting the following line */ +/* use IRC8M */ +//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000) + +/********************************************************************/ +//#define __SYSTEM_CLOCK_HXTAL (HXTAL_VALUE) +//#define __SYSTEM_CLOCK_24M_PLL_HXTAL (uint32_t)(24000000) +/********************************************************************/ + +//#define __SYSTEM_CLOCK_36M_PLL_HXTAL (uint32_t)(36000000) +//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_56M_PLL_HXTAL (uint32_t)(56000000) +//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000) +#define __SYSTEM_CLOCK_96M_PLL_HXTAL (uint32_t)(96000000) +//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000) + +#define SEL_IRC8M 0x00U +#define SEL_HXTAL 0x01U +#define SEL_PLL 0x02U + +/* set the system clock frequency and declare the system clock configuration function */ +#ifdef __SYSTEM_CLOCK_48M_PLL_IRC8M +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_IRC8M; +static void system_clock_48m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M; +static void system_clock_72m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_IRC8M; +static void system_clock_108m_irc8m(void); + +#elif defined (__SYSTEM_CLOCK_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; +static void system_clock_hxtal(void); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_24M_PLL_HXTAL; +static void system_clock_24m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_36M_PLL_HXTAL; +static void system_clock_36m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_HXTAL; +static void system_clock_48m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_56M_PLL_HXTAL; +static void system_clock_56m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL; +static void system_clock_72m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_HXTAL; +static void system_clock_96m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL; +static void system_clock_108m_hxtal(void); +#else +uint32_t SystemCoreClock = IRC8M_VALUE; +#endif /* __SYSTEM_CLOCK_48M_PLL_IRC8M */ + +/* configure the system clock */ +static void system_clock_config(void); + +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ +#ifdef __SYSTEM_CLOCK_HXTAL + system_clock_hxtal(); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) + system_clock_24m_hxtal(); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) + system_clock_36m_hxtal(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) + system_clock_48m_hxtal(); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) + system_clock_56m_hxtal(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) + system_clock_72m_hxtal(); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) + system_clock_96m_hxtal(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) + system_clock_108m_hxtal(); + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) + system_clock_48m_irc8m(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) + system_clock_72m_irc8m(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) + system_clock_108m_irc8m(); +#endif /* __SYSTEM_CLOCK_HXTAL */ +} + +/*! + \brief setup the microcontroller system, initialize the system + \param[in] none + \param[out] none + \retval none +*/ +void SystemInit(void) +{ + /* reset the RCC clock configuration to the default reset state */ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* reset SCS, AHBPSC, APB1PSC, APB2PSC, ADCPSC, CKOUT0SEL bits */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_ADCPSC_2 | RCU_CFG0_CKOUT0SEL); + + /* reset HXTALEN, CKMEN, PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + + /* Reset HXTALBPS bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* reset PLLSEL, PREDV0_LSB, PLLMF, USBFSPSC bits */ + + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_PLLMF_4); + RCU_CFG1 = 0x00000000U; + + /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x00FF0000U; + + /* Configure the System clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */ + system_clock_config(); +} + +/*! + \brief update the SystemCoreClock with current core clock retrieved from cpu registers + \param[in] none + \param[out] none + \retval none +*/ +void SystemCoreClockUpdate(void) +{ + uint32_t scss; + uint32_t pllsel, predv0sel, pllmf, ck_src; + uint32_t predv0, predv1, pll1mf; + + scss = GET_BITS(RCU_CFG0, 2, 3); + + switch (scss) + { + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + SystemCoreClock = IRC8M_VALUE; + break; + + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + + if(RCU_PLLSRC_IRC8M_DIV2 == pllsel){ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE / 2U; + }else{ + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + + if(pllmf >= 15U){ + pllmf += 1U; + }else{ + pllmf += 2U; + } + + SystemCoreClock = ck_src * pllmf; + + if(15U == pllmf){ + /* PLL source clock multiply by 6.5 */ + SystemCoreClock = ck_src * 6U + ck_src / 2U; + } + + break; + + /* IRC8M is selected as CK_SYS */ + default: + SystemCoreClock = IRC8M_VALUE; + break; + } +} + +#ifdef __SYSTEM_CLOCK_HXTAL +/*! + \brief configure the system clock to HXTAL + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select HXTAL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; + + /* wait until HXTAL is selected as system clock */ + while(0 == (RCU_CFG0 & RCU_SCSS_HXTAL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +/*! + \brief configure the system clock to 24M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_24m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 6 = 24 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +/*! + \brief configure the system clock to 36M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_36m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 9 = 36 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +/*! + \brief configure the system clock to 48M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL12); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +/*! + \brief configure the system clock to 56M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_56m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 14 = 56 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL14); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +/*! + \brief configure the system clock to 72M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL18); + + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +/*! + \brief configure the system clock to 96M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_96m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + if(HXTAL_VALUE==25000000){ + + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +/*! + \brief configure the system clock to 108M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ + +static void system_clock_108m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL27); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PREDV1_DIV5 | RCU_PLL1_MUL8 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 | RCU_PREDV1_DIV2 | RCU_PLL1_MUL20 | RCU_PLL2_MUL20); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL2 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + + } + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +/*! + \brief configure the system clock to 48M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL12; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +/*! + \brief configure the system clock to 72M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL18; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +/*! + \brief configure the system clock to 108M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL27; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/systick.c new file mode 100644 index 0000000..f2a4aae --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/Source/systick.c @@ -0,0 +1,47 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +void systick_config(void) +{ + eclic_global_interrupt_enable(); + *(uint64_t*)(TIMER_CTRL_ADDR + TIMER_MTIMECMP) = TIMER_FREQ / 100; + eclic_set_nlbits(ECLIC_GROUP_LEVEL2_PRIO2); + eclic_irq_enable(CLIC_INT_TMR, 3, 3); + *(uint64_t*)(TIMER_CTRL_ADDR + TIMER_MTIME) = 0; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/readme.txt new file mode 100644 index 0000000..6a3d357 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/HID_Mouse/readme.txt @@ -0,0 +1,64 @@ +/*! + \file readme.txt + \brief description of the USB HID device(USB-Keyboard) demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it provides a description of +how to use the USB_FS device application based on the Human Interface Device (HID). + + The Full Speed (FS) USB module uses a 48MHz clock, which is generated +from an integrated PLL. + + The GD32 device is enumerated as an USB mice, that uses the native PC Host +HID driver to which the GD32VF103V-EVAL-V1.0 board is connected. + + The USB mice use four key(A key, B key, C key and D key) to move the cursor. + + This demo supports remote wakeup (which is the ability of a USB device to +bring a suspended bus back to the active condition), and the CET key is +used as the remote wakeup source. + + In order to test USB remote wakeup function, you can do as follows: + - Manually switch PC to standby mode + + - Wait for PC to fully enter the standby mode + + - Push the CET key + + - If PC is ON, remote wakeup is OK, else failed + + In order to make the program work, you must do the following: + - Open your preferred toolchain + + - Rebuild all files and load your image into target memory + + - Run the application diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Eclipse/usbd_msc/.cproject b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Eclipse/usbd_msc/.cproject new file mode 100644 index 0000000..4119fc0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Eclipse/usbd_msc/.cproject @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Eclipse/usbd_msc/.project b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Eclipse/usbd_msc/.project new file mode 100644 index 0000000..5482046 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Eclipse/usbd_msc/.project @@ -0,0 +1,653 @@ + + + usbd_msc + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + Examples + 2 + virtual:/virtual + + + Firmware + 2 + virtual:/virtual + + + Utilities + 2 + virtual:/virtual + + + Examples/USBFS + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver + 2 + virtual:/virtual + + + Firmware/RISCV + 2 + virtual:/virtual + + + Utilities/gd32vf103v_eval.c + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.c + + + Utilities/gd32vf103v_eval.h + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.h + + + Examples/USBFS/USB_Device + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Source + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/gd32vf103.h + + + Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + + + Firmware/GD32VF103_usbfs_driver/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver/Source + 2 + virtual:/virtual + + + Firmware/RISCV/drivers + 2 + virtual:/virtual + + + Firmware/RISCV/env_Eclipse + 2 + virtual:/virtual + + + Firmware/RISCV/stubs + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/MSC_Internal_flash + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h + + + Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c + + + Firmware/RISCV/drivers/n200_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_eclic.h + + + Firmware/RISCV/drivers/n200_func.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.c + + + Firmware/RISCV/drivers/n200_func.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.h + + + Firmware/RISCV/drivers/n200_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_timer.h + + + Firmware/RISCV/drivers/riscv_bits.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_bits.h + + + Firmware/RISCV/drivers/riscv_const.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_const.h + + + Firmware/RISCV/drivers/riscv_encoding.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_encoding.h + + + Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + + + Firmware/RISCV/env_Eclipse/entry.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/entry.S + + + Firmware/RISCV/env_Eclipse/handlers.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/handlers.c + + + Firmware/RISCV/env_Eclipse/init.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/init.c + + + Firmware/RISCV/env_Eclipse/start.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/start.S + + + Firmware/RISCV/env_Eclipse/your_printf.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/your_printf.c + + + Firmware/RISCV/stubs/_exit.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/_exit.c + + + Firmware/RISCV/stubs/close.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/close.c + + + Firmware/RISCV/stubs/fstat.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/fstat.c + + + Firmware/RISCV/stubs/isatty.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/isatty.c + + + Firmware/RISCV/stubs/lseek.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/lseek.c + + + Firmware/RISCV/stubs/read.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/read.c + + + Firmware/RISCV/stubs/sbrk.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/sbrk.c + + + Firmware/RISCV/stubs/stub.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/stub.h + + + Firmware/RISCV/stubs/write.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write.c + + + Firmware/RISCV/stubs/write_hex.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write_hex.c + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Source + 2 + virtual:/virtual + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/flash_msd.h + 1 + PARENT-2-PROJECT_LOC/Include/flash_msd.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/gd32vf103_it.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_it.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/gd32vf103_libopt.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_libopt.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/msc_bbb.h + 1 + PARENT-2-PROJECT_LOC/Include/msc_bbb.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/msc_scsi.h + 1 + PARENT-2-PROJECT_LOC/Include/msc_scsi.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usb_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usb_conf.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usb_msc.h + 1 + PARENT-2-PROJECT_LOC/Include/usb_msc.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usbd_conf.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_bbb.h + 1 + PARENT-2-PROJECT_LOC/Include/usbd_msc_bbb.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_core.h + 1 + PARENT-2-PROJECT_LOC/Include/usbd_msc_core.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_data.h + 1 + PARENT-2-PROJECT_LOC/Include/usbd_msc_data.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_mem.h + 1 + PARENT-2-PROJECT_LOC/Include/usbd_msc_mem.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_scsi.h + 1 + PARENT-2-PROJECT_LOC/Include/usbd_msc_scsi.h + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Source/app.c + 1 + PARENT-2-PROJECT_LOC/Source/app.c + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Source/flash_msd.c + 1 + PARENT-2-PROJECT_LOC/Source/flash_msd.c + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Source/gd32vf103_hw.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_hw.c + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Source/gd32vf103_it.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_it.c + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Source/system_gd32vf103.c + 1 + PARENT-2-PROJECT_LOC/Source/system_gd32vf103.c + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_bbb.c + 1 + PARENT-2-PROJECT_LOC/Source/usbd_msc_bbb.c + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_core.c + 1 + PARENT-2-PROJECT_LOC/Source/usbd_msc_core.c + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_data.c + 1 + PARENT-2-PROJECT_LOC/Source/usbd_msc_data.c + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_scsi.c + 1 + PARENT-2-PROJECT_LOC/Source/usbd_msc_scsi.c + + + Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_storage_msd.c + 1 + PARENT-2-PROJECT_LOC/Source/usbd_storage_msd.c + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Eclipse/usbd_msc/.settings/language.settings.xml b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Eclipse/usbd_msc/.settings/language.settings.xml new file mode 100644 index 0000000..c57dc40 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Eclipse/usbd_msc/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/flash_msd.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/flash_msd.h new file mode 100644 index 0000000..a7629ba --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/flash_msd.h @@ -0,0 +1,52 @@ +/*! + \file flash_msd.h + \brief the header file of flash_msd.c + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef FLASH_ACCESS_H +#define FLASH_ACCESS_H + +#include "stdlib.h" +#include "usb_conf.h" + +#define ISFLASH_BLOCK_SIZE 1024 +#define ISFLASH_BLOCK_NUM 64 + +/* function declarations */ +/* initialize the nand flash */ +uint32_t flash_init (void); +/* read data from multiple blocks of nand flash */ +uint32_t flash_multi_blocks_read (uint8_t* pBuf, uint32_t read_addr, uint16_t block_size, uint32_t block_num); +/* write data to multiple blocks of flash */ +uint32_t flash_multi_blocks_write (uint8_t* pBuf, uint32_t write_addr, uint16_t block_size, uint32_t block_num); + +#endif /* FLASH_ACCESS_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/gd32vf103_it.h new file mode 100644 index 0000000..4fa49f1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/gd32vf103_it.h @@ -0,0 +1,54 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "usbd_core.h" + +/* function declarations */ +/* this function handles USB wakeup interrupt handler */ +void USBFS_WKUP_IRQHandler(void); +/* this function handles USBFS IRQ Handler */ +void USBFS_IRQHandler(void); + +#ifdef __cplusplus +} +#endif + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/msc_bbb.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/msc_bbb.h new file mode 100644 index 0000000..0e2e171 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/msc_bbb.h @@ -0,0 +1,69 @@ +/*! + \file msc_bbb.h + \brief definitions for the USB MSC BBB(bulk/bulk/bulk) protocol + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __MSC_BBB_H +#define __MSC_BBB_H + +#include "usb_ch9_std.h" + +#define BBB_CBW_SIGNATURE 0x43425355U +#define BBB_CSW_SIGNATURE 0x53425355U +#define BBB_CBW_LENGTH 31U +#define BBB_CSW_LENGTH 13U + +typedef struct { + uint32_t dCBWSignature; + uint32_t dCBWTag; + uint32_t dCBWDataTransferLength; + uint8_t bmCBWFlags; + uint8_t bCBWLUN; + uint8_t bCBWCBLength; + uint8_t CBWCB[16]; +}msc_bbb_cbw; + +typedef struct { + uint32_t dCSWSignature; + uint32_t dCSWTag; + uint32_t dCSWDataResidue; + uint8_t bCSWStatus; +}msc_bbb_csw; + +/* CSW command status */ +enum msc_csw_status { + CSW_CMD_PASSED = 0, + CSW_CMD_FAILED, + CSW_PHASE_ERROR +}; + +#endif /* __MSC_BBB_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/msc_scsi.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/msc_scsi.h new file mode 100644 index 0000000..359aea6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/msc_scsi.h @@ -0,0 +1,117 @@ +/*! + \file msc_scsi.h + \brief definitions for the USB MSC SCSI commands + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __MSC_SCSI_H +#define __MSC_SCSI_H + +#include "usb_ch9_std.h" + +/* SCSI commands */ +#define SCSI_FORMAT_UNIT 0x04U +#define SCSI_INQUIRY 0x12U +#define SCSI_MODE_SELECT6 0x15U +#define SCSI_MODE_SELECT10 0x55U +#define SCSI_MODE_SENSE6 0x1AU +#define SCSI_READ_TOC_DATA 0x43U +#define SCSI_MODE_SENSE10 0x5AU +#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1EU +#define SCSI_READ6 0x08U +#define SCSI_READ10 0x28U +#define SCSI_READ12 0xA8U +#define SCSI_READ16 0x88U + +#define SCSI_READ_CAPACITY10 0x25U +#define SCSI_READ_CAPACITY16 0x9EU + +#define SCSI_REQUEST_SENSE 0x03U +#define SCSI_START_STOP_UNIT 0x1BU +#define SCSI_TEST_UNIT_READY 0x00U +#define SCSI_WRITE6 0x0AU +#define SCSI_WRITE10 0x2AU +#define SCSI_WRITE12 0xAAU +#define SCSI_WRITE16 0x8AU + +#define SCSI_VERIFY10 0x2FU +#define SCSI_VERIFY12 0xAFU +#define SCSI_VERIFY16 0x8FU + +#define SCSI_SEND_DIAGNOSTIC 0x1DU +#define SCSI_READ_FORMAT_CAPACITIES 0x23U + +#define INVALID_CDB 0x20U +#define INVALID_FIELED_IN_COMMAND 0x24U +#define PARAMETER_LIST_LENGTH_ERROR 0x1AU +#define INVALID_FIELD_IN_PARAMETER_LIST 0x26U +#define ADDRESS_OUT_OF_RANGE 0x21U +#define MEDIUM_NOT_PRESENT 0x3AU +#define MEDIUM_HAVE_CHANGED 0x28U +#define WRITE_PROTECTED 0x27U +#define UNRECOVERED_READ_ERROR 0x11U +#define WRITE_FAULT 0x03U + +#define READ_FORMAT_CAPACITY_DATA_LEN 0x0CU +#define READ_CAPACITY10_DATA_LEN 0x08U +#define MODE_SENSE10_DATA_LEN 0x08U +#define MODE_SENSE6_DATA_LEN 0x04U +#define READ_TOC_CMD_LEN 0x14U +#define REQUEST_SENSE_DATA_LEN 0x12U +#define STANDARD_INQUIRY_DATA_LEN 0x24U +#define BLKVFY 0x04U + +enum sense_state { + NO_SENSE = 0U, + RECOVERED_ERROR, + NOT_READY, + MEDIUM_ERROR, + HARDWARE_ERROR, + ILLEGAL_REQUEST, + UNIT_ATTENTION, + DATA_PROTECT, + BLANK_CHECK, + VENDOR_SPECIFIC, + COPY_ABORTED, + ABORTED_COMMAND, + RESERVED, + VOLUME_OVERFLOW, + MISCOMPARE +}; + +typedef struct { + uint8_t SenseKey; + uint32_t Information; + uint8_t ASC; + uint8_t ASCQ; +} msc_scsi_sense; + +#endif /* __MSC_SCSI_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usb_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usb_conf.h new file mode 100644 index 0000000..b36f0be --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usb_conf.h @@ -0,0 +1,121 @@ +/*! + \file usb_conf.h + \brief USBFS driver basic configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_CONF_H +#define __USB_CONF_H + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" + +#include + +#ifdef USE_USB_FS + #define USB_FS_CORE +#endif + +#ifdef USE_USB_HS + #define USB_HS_CORE +#endif + +#ifdef USB_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 64 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 0 + #define TX3_FIFO_FS_SIZE 0 +#endif /* USB_FS_CORE */ + +#ifdef USB_HS_CORE + #define RX_FIFO_HS_SIZE 512 + #define TX0_FIFO_HS_SIZE 128 + #define TX1_FIFO_HS_SIZE 372 + #define TX2_FIFO_HS_SIZE 0 + #define TX3_FIFO_HS_SIZE 0 + #define TX4_FIFO_HS_SIZE 0 + #define TX5_FIFO_HS_SIZE 0 + + #ifdef USE_ULPI_PHY + #define USB_OTG_ULPI_PHY_ENABLED + #endif + + #ifdef USE_EMBEDDED_PHY + #define USB_OTG_EMBEDDED_PHY_ENABLED + #endif + + #define USB_OTG_HS_INTERNAL_DMA_ENABLED + #define USB_OTG_HS_DEDICATED_EP1_ENABLED +#endif /* USB_HS_CORE */ + +#define USB_SOF_OUTPUT 1 +#define USB_LOW_POWER 1 + +//#define VBUS_SENSING_ENABLED + +//#define USE_HOST_MODE +#define USE_DEVICE_MODE +//#define USE_OTG_MODE + +#ifndef USB_FS_CORE + #ifndef USB_HS_CORE + #error "USB_HS_CORE or USB_FS_CORE should be defined" + #endif +#endif + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_HS + #ifndef USE_USB_FS + #error "USE_USB_HS or USE_USB_FS should be defined" + #endif +#endif + +/****************** C Compilers dependant keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned(4))) + #define __ALIGN_BEGIN + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + + +#endif /* __USB_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usb_msc.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usb_msc.h new file mode 100644 index 0000000..485e747 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usb_msc.h @@ -0,0 +1,66 @@ +/*! + \file usb_msc.h + \brief definitions for the USB MSC class + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_MSC_H +#define __USB_MSC_H + +#include "usb_ch9_std.h" + +/* mass storage device class code */ +#define USB_CLASS_MSC 0x08U + +/* mass storage subclass code */ +#define USB_MSC_SUBCLASS_RBC 0x01U +#define USB_MSC_SUBCLASS_ATAPI 0x02U +#define USB_MSC_SUBCLASS_UFI 0x04U +#define USB_MSC_SUBCLASS_SCSI 0x06U +#define USB_MSC_SUBCLASS_LOCKABLE 0x07U +#define USB_MSC_SUBCLASS_IEEE1667 0x08U + +/* mass storage interface class control protocol codes */ +#define USB_MSC_PROTOCOL_CBI 0x00U +#define USB_MSC_PROTOCOL_CBI_ALT 0x01U +#define USB_MSC_PROTOCOL_BBB 0x50U + +/* mass storage request codes */ +#define USB_MSC_REQ_CODES_ADSC 0x00U +#define USB_MSC_REQ_CODES_GET 0xFCU +#define USB_MSC_REQ_CODES_PUT 0xFDU +#define USB_MSC_REQ_CODES_GML 0xFEU +#define USB_MSC_REQ_CODES_BOMSR 0xFFU + +#define BBB_GET_MAX_LUN 0xFEU +#define BBB_RESET 0xFFU + +#endif /* __USB_MSC_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_conf.h new file mode 100644 index 0000000..6c05633 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_conf.h @@ -0,0 +1,64 @@ +/*! + \file usbd_conf.h + \brief USB device-mode configuration header file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBD_CONF_H +#define USBD_CONF_H + +#include "usb_conf.h" + +#define USBD_CFG_MAX_NUM 1 +#define USBD_ITF_MAX_NUM 1 +#define USB_STR_DESC_MAX_SIZE 64 + +#define USB_STRING_COUNT 4 + +/* Class Layer Parameter */ +#define MSC_IN_EP EP1_IN +#define MSC_OUT_EP EP1_OUT + +#ifdef USE_USB_HS + #ifdef USE_ULPI_PHY + #define MSC_DATA_PACKET_SIZE 512 + #else + #define MSC_DATA_PACKET_SIZE 64 + #endif +#else /*USE_USB_OTG_FS*/ + #define MSC_DATA_PACKET_SIZE 64 +#endif + +#define MSC_MEDIA_PACKET_SIZE 4096 + +#define MEM_LUN_NUM 1 + +#endif /* USBD_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_bbb.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_bbb.h new file mode 100644 index 0000000..67af299 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_bbb.h @@ -0,0 +1,86 @@ +/*! + \file usbd_msc_bbb.h + \brief the header file of the usbd_msc_bot.c file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_MSC_BBB_H +#define __USBD_MSC_BBB_H + +#include "usbd_core.h" +#include "msc_bbb.h" + +/* MSC BBB state */ +enum msc_bbb_state { + BBB_IDLE = 0, /*!< idle state */ + BBB_DATA_OUT, /*!< data OUT state */ + BBB_DATA_IN, /*!< data IN state */ + BBB_LAST_DATA_IN, /*!< last data IN state */ + BBB_SEND_DATA /*!< send immediate data state */ +}; + +/* MSC BBB status */ +enum msc_bbb_status { + BBB_STATUS_NORMAL = 0, /*!< normal status */ + BBB_STATUS_RECOVERY, /*!< recovery status*/ + BBB_STATUS_ERROR /*!< error status */ +}; + +extern uint8_t msc_bbb_data[]; + +extern uint8_t msc_bbb_state; +extern uint16_t msc_bbb_datalen; + +extern msc_bbb_cbw bbb_cbw; +extern msc_bbb_csw bbb_csw; + +/* initialize the bbb process */ +void msc_bbb_init (usb_core_driver *pudev); + +/* reset the BBB machine */ +void msc_bbb_reset (usb_core_driver *pudev); + +/* de-initialize the BBB machine */ +void msc_bbb_deinit (usb_core_driver *pudev); + +/* handle BBB data IN stage */ +void msc_bbb_data_in (usb_core_driver *pudev, uint8_t ep_num); + +/* handle BBB data OUT stage */ +void msc_bbb_data_out (usb_core_driver *pudev, uint8_t ep_num); + +/* send the CSW(command status wrapper) */ +void msc_bbb_csw_send (usb_core_driver *pudev, uint8_t ep_num); + +/* complete the clear feature request */ +void msc_bbb_clrfeature (usb_core_driver *pudev, uint8_t ep_num); + +#endif /* __USBD_MSC_BOT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_core.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_core.h new file mode 100644 index 0000000..1624305 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_core.h @@ -0,0 +1,63 @@ +/*! + \file usbd_msc_core.h + \brief the header file of USB MSC device class core functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_MSC_CORE_H +#define __USBD_MSC_CORE_H + +#include "usbd_conf.h" +#include "usbd_core.h" +#include "usb_msc.h" + +#define USB_MSC_CONFIG_DESC_SIZE 32U + +#define MSC_EPIN_SIZE MSC_DATA_PACKET_SIZE +#define MSC_EPOUT_SIZE MSC_DATA_PACKET_SIZE + +/* USB configuration descriptor structure */ +typedef struct +{ + usb_desc_config config; + + usb_desc_itf msc_itf; + usb_desc_ep msc_epin; + usb_desc_ep msc_epout; +} usb_desc_config_set; + +extern void* const usbd_msc_strings[USB_STRING_COUNT]; +extern const usb_desc_dev msc_dev_desc; +extern const usb_desc_config_set msc_config_desc; + +extern usb_class_core msc_class; + +#endif /* __USBD_MSC_CORE_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_data.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_data.h new file mode 100644 index 0000000..61500d0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_data.h @@ -0,0 +1,49 @@ +/*! + \file usbd_msc_data.h + \brief the header file of the usbd_msc_data.c file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_MSC_DATA_H +#define __USBD_MSC_DATA_H + +#include "usbd_conf.h" + +#define MODE_SENSE6_LENGTH 8U +#define MODE_SENSE10_LENGTH 8U +#define INQUIRY_PAGE00_LENGTH 7U +#define FORMAT_CAPACITIES_LENGTH 20U + +extern const uint8_t msc_page00_inquiry_data[]; +extern const uint8_t msc_mode_sense6_data[]; +extern const uint8_t msc_mode_sense10_data[]; + +#endif /* __USBD_MSC_DATA_H_ */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_mem.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_mem.h new file mode 100644 index 0000000..d76fc74 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_mem.h @@ -0,0 +1,59 @@ +/*! + \file usbd_msc_mem.h + \brief header file for storage memory + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_MSC_MEM_H +#define __USBD_MSC_MEM_H + +#include "usbd_conf.h" + +#define USBD_STD_INQUIRY_LENGTH 36U + +typedef struct +{ + int8_t (*mem_init) (uint8_t lun); + int8_t (*mem_ready) (uint8_t lun); + int8_t (*mem_protected) (uint8_t lun); + int8_t (*mem_read) (uint8_t lun, uint8_t *buf, uint32_t block_addr, uint16_t block_len); + int8_t (*mem_write) (uint8_t lun, uint8_t *buf, uint32_t block_addr, uint16_t block_len); + int8_t (*mem_maxlun) (void); + + uint8_t *mem_toc_data; + uint8_t *mem_inquiry_data[MEM_LUN_NUM]; + uint32_t mem_block_size[MEM_LUN_NUM]; + uint32_t mem_block_len[MEM_LUN_NUM]; +}usbd_mem_cb; + +extern usbd_mem_cb *usbd_mem_fops; + +#endif /* __USBD_MSC_MEM_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_scsi.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_scsi.h new file mode 100644 index 0000000..0de5330 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Include/usbd_msc_scsi.h @@ -0,0 +1,53 @@ +/*! + \file usbd_msc_scsi.h + \brief the header file of the usbd_msc_scsi.c file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_MSC_SCSI_H +#define __USBD_MSC_SCSI_H + +#include "usbd_msc_data.h" +#include "usbd_msc_bbb.h" +#include "msc_scsi.h" + +#define SENSE_LIST_DEEPTH 4U + +extern msc_scsi_sense scsi_sense[SENSE_LIST_DEEPTH]; + +extern uint8_t scsi_sense_head; +extern uint8_t scsi_sense_tail; + +int8_t scsi_process_cmd (usb_core_driver *pudev, uint8_t lun, uint8_t *cmd); + +void scsi_sense_code (uint8_t lun, uint8_t skey, uint8_t asc); + +#endif /* __USBD_MSC_SCSI_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/app.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/app.c new file mode 100644 index 0000000..4635f5d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/app.c @@ -0,0 +1,73 @@ +/*! + \file main.c + \brief USB main routine for MSC device(Udisk) + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "usbd_msc_core.h" +#include +#include +#include + + +usb_core_driver USB_OTG_dev = { + .dev = { + .desc = { + .dev_desc = (uint8_t *)&msc_dev_desc, + .config_desc = (uint8_t *)&msc_config_desc, + .strings = usbd_msc_strings + } + } +}; + +/** + * @brief Main routine will construct a USB mass storage device + * @param None + * @retval None + */ +int main(void) +{ + eclic_global_interrupt_enable(); + + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); + + usb_rcu_config(); + + usb_timer_init(); + + usb_intr_config(); + + usbd_init(&USB_OTG_dev, USB_CORE_ENUM_FS, &msc_class); + + while (1) { + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/flash_msd.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/flash_msd.c new file mode 100644 index 0000000..9e79ff9 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/flash_msd.c @@ -0,0 +1,112 @@ +/*! + \file flash_msd.c + \brief flash access functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_conf.h" +#include "flash_msd.h" + +/* pages 0 and 1 base and end addresses */ +#define NAND_FLASH_BASE_ADDRESS 0x8010000 +#define PAGE_SIZE 0x400 + +/*! + \brief initialize the nand flash + \param[in] none + \param[out] none + \retval status +*/ +uint32_t flash_init () +{ + fmc_unlock(); + + return 0; +} + +/*! + \brief read data from multiple blocks of nand flash + \param[in] pBuf: pointer to user buffer + \param[in] read_addr: address to be read + \param[in] block_size: size of block + \param[in] block_num: number of block + \param[out] none + \retval status +*/ +uint32_t flash_multi_blocks_read (uint8_t *pBuf, uint32_t read_addr, uint16_t block_size, uint32_t block_num) +{ + uint32_t i; + uint8_t *pSource = (uint8_t *)(read_addr + NAND_FLASH_BASE_ADDRESS); + + /* Data transfer */ + while (block_num--) { + for (i = 0; i < block_size; i++) { + *pBuf++ = *pSource++; + } + } + + return 0; +} + +/*! + \brief write data to multiple blocks of flash + \param[in] pBuf: pointer to user buffer + \param[in] write_addr: address to be write + \param[in] block_size: block size + \param[in] block_num: number of block + \param[out] none + \retval status +*/ +uint32_t flash_multi_blocks_write (uint8_t *pBuf, + uint32_t write_addr, + uint16_t block_size, + uint32_t block_num) +{ + uint32_t i, page; + uint32_t start_page = (write_addr / PAGE_SIZE) * PAGE_SIZE + NAND_FLASH_BASE_ADDRESS; + uint32_t *ptrs = (uint32_t *)pBuf; + uint16_t word_count = block_size / 4; + + page = block_num; + + for(; page > 0; page--){ + fmc_page_erase(start_page); + + i = 0; + + do{ + fmc_word_program(start_page, *ptrs++); + start_page += 4; + }while(++i < word_count); + } + + return 0; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/gd32vf103_hw.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/gd32vf103_hw.c new file mode 100644 index 0000000..b2931b1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/gd32vf103_hw.c @@ -0,0 +1,204 @@ +/*! + \file gd32vf103_hw.c + \brief USB hardware configuration for GD32VF103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include +#include +#include + +#define TIM_MSEC_DELAY 0x01 +#define TIM_USEC_DELAY 0x02 + +__IO uint32_t delay_time = 0; +__IO uint32_t timer_prescaler; +__IO uint32_t usbfs_prescaler = 0; + +static void hw_time_set (uint8_t unit); +static void hw_delay (uint32_t ntime, uint8_t unit); + +/*! + \brief configure USB clock + \param[in] none + \param[out] none + \retval none +*/ +void usb_rcu_config(void) +{ + uint32_t system_clock = rcu_clock_freq_get(CK_SYS); + + if (system_clock == 48000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1; + timer_prescaler = 3; + } else if (system_clock == 72000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1_5; + timer_prescaler = 5; + } else if (system_clock == 96000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV2; + timer_prescaler = 7; + } else { + /* reserved */ + } + + rcu_usb_clock_config(usbfs_prescaler); + rcu_periph_clock_enable(RCU_USBFS); +} + +/*! + \brief configure USB interrupt + \param[in] none + \param[out] none + \retval none +*/ +void usb_intr_config(void) +{ + eclic_irq_enable((uint8_t)USBFS_IRQn, 1, 0); + + /* enable the power module clock */ + rcu_periph_clock_enable(RCU_PMU); + + /* USB wakeup EXTI line configuration */ + exti_interrupt_flag_clear(EXTI_18); + exti_init(EXTI_18, EXTI_INTERRUPT, EXTI_TRIG_RISING); + exti_interrupt_enable(EXTI_18); + + eclic_irq_enable((uint8_t)USBFS_WKUP_IRQn, 3, 0); +} + +/*! + \brief initializes delay unit using Timer2 + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_init (void) +{ + rcu_periph_clock_enable(RCU_TIMER2); + + eclic_irq_enable(TIMER2_IRQn, 2, 0); +} + +/*! + \brief delay in micro seconds + \param[in] usec: value of delay required in micro seconds + \param[out] none + \retval none +*/ +void usb_udelay (const uint32_t usec) +{ + hw_delay(usec, TIM_USEC_DELAY); +} + +/*! + \brief delay in milli seconds + \param[in] msec: value of delay required in milli seconds + \param[out] none + \retval none +*/ +void usb_mdelay (const uint32_t msec) +{ + hw_delay(msec, TIM_MSEC_DELAY); +} + +/*! + \brief time base IRQ + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_irq (void) +{ + if (RESET != timer_flag_get(TIMER2, TIMER_FLAG_UP)){ + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + + if (delay_time > 0x00U){ + delay_time--; + } else { + timer_disable(TIMER2); + } + } +} + +/*! + \brief delay routine based on TIM0 + \param[in] nTime: delay Time + \param[in] unit: delay Time unit = mili sec / micro sec + \param[out] none + \retval none +*/ +static void hw_delay(uint32_t ntime, uint8_t unit) +{ + delay_time = ntime; + + hw_time_set(unit); + + while (0U != delay_time) { + } + + timer_disable(TIMER2); +} + +/*! + \brief configures TIM0 for delay routine based on TIM0 + \param[in] unit: msec /usec + \param[out] none + \retval none +*/ +static void hw_time_set(uint8_t unit) +{ + timer_parameter_struct timer_initpara; + + rcu_periph_clock_enable(RCU_TIMER2); + timer_deinit(TIMER2); + + if(TIM_USEC_DELAY == unit) { + timer_initpara.period = 11; + } else if(TIM_MSEC_DELAY == unit) { + timer_initpara.period = 11999; + } + + timer_initpara.prescaler = timer_prescaler; + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.repetitioncounter = 0; + timer_init(TIMER2, &timer_initpara); + + timer_update_event_enable(TIMER2); + timer_interrupt_enable(TIMER2,TIMER_INT_UP); + timer_flag_clear(TIMER2, TIMER_FLAG_UP); + timer_update_source_config(TIMER2, TIMER_UPDATE_SRC_GLOBAL); + + /* TIMER2 counter enable */ + timer_enable(TIMER2); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/gd32vf103_it.c new file mode 100644 index 0000000..8cae80e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/gd32vf103_it.c @@ -0,0 +1,96 @@ +/*! + \file gd32vf103_it.c + \brief main interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usbd_int.h" +#include "drv_usb_hw.h" +#include "gd32vf103_it.h" + +extern usb_core_driver USB_OTG_dev; +extern uint32_t usbfs_prescaler; + +extern void usb_timer_irq(void); + +/*! + \brief this function handles USBD interrupt + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_IRQHandler (void) +{ + usbd_isr (&USB_OTG_dev); +} + +/*! + \brief this function handles EXTI0_IRQ Handler + \param[in] none + \param[out] none + \retval none +*/ +void EXTI0_IRQHandler(void) +{ + +} + +/*! + \brief this function handles USBD wakeup interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_WKUP_IRQHandler(void) +{ + if (USB_OTG_dev.bp.low_power) { + SystemInit(); + + rcu_usb_clock_config(usbfs_prescaler); + + rcu_periph_clock_enable(RCU_USBFS); + + usb_clock_active(&USB_OTG_dev); + } + + exti_interrupt_flag_clear(EXTI_18); +} + +/*! + \brief this function handles Timer0 updata interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void TIMER2_IRQHandler(void) +{ + usb_timer_irq(); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/system_gd32vf103.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/system_gd32vf103.c new file mode 100644 index 0000000..05e5205 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/system_gd32vf103.c @@ -0,0 +1,998 @@ +/*! + \file system_gd32vf103.h + \brief RISC-V Device Peripheral Access Layer Source File for + GD32VF103 Device Series + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* This file refers the RISC-V standard, some adjustments are made according to GigaDevice chips */ + +#include "gd32vf103.h" + +/* system frequency define */ +#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */ + +/* select a system clock by uncommenting the following line */ +/* use IRC8M */ +//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000) + +/********************************************************************/ +//#define __SYSTEM_CLOCK_HXTAL (HXTAL_VALUE) +//#define __SYSTEM_CLOCK_24M_PLL_HXTAL (uint32_t)(24000000) +/********************************************************************/ + +//#define __SYSTEM_CLOCK_36M_PLL_HXTAL (uint32_t)(36000000) +//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_56M_PLL_HXTAL (uint32_t)(56000000) +//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000) +#define __SYSTEM_CLOCK_96M_PLL_HXTAL (uint32_t)(96000000) +//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000) + +#define SEL_IRC8M 0x00U +#define SEL_HXTAL 0x01U +#define SEL_PLL 0x02U + +/* set the system clock frequency and declare the system clock configuration function */ +#ifdef __SYSTEM_CLOCK_48M_PLL_IRC8M +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_IRC8M; +static void system_clock_48m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M; +static void system_clock_72m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_IRC8M; +static void system_clock_108m_irc8m(void); + +#elif defined (__SYSTEM_CLOCK_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; +static void system_clock_hxtal(void); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_24M_PLL_HXTAL; +static void system_clock_24m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_36M_PLL_HXTAL; +static void system_clock_36m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_HXTAL; +static void system_clock_48m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_56M_PLL_HXTAL; +static void system_clock_56m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL; +static void system_clock_72m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_HXTAL; +static void system_clock_96m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL; +static void system_clock_108m_hxtal(void); +#else +uint32_t SystemCoreClock = IRC8M_VALUE; +#endif /* __SYSTEM_CLOCK_48M_PLL_IRC8M */ + +/* configure the system clock */ +static void system_clock_config(void); + +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ +#ifdef __SYSTEM_CLOCK_HXTAL + system_clock_hxtal(); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) + system_clock_24m_hxtal(); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) + system_clock_36m_hxtal(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) + system_clock_48m_hxtal(); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) + system_clock_56m_hxtal(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) + system_clock_72m_hxtal(); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) + system_clock_96m_hxtal(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) + system_clock_108m_hxtal(); + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) + system_clock_48m_irc8m(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) + system_clock_72m_irc8m(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) + system_clock_108m_irc8m(); +#endif /* __SYSTEM_CLOCK_HXTAL */ +} + +/*! + \brief setup the microcontroller system, initialize the system + \param[in] none + \param[out] none + \retval none +*/ +void SystemInit(void) +{ + /* reset the RCC clock configuration to the default reset state */ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* reset SCS, AHBPSC, APB1PSC, APB2PSC, ADCPSC, CKOUT0SEL bits */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_ADCPSC_2 | RCU_CFG0_CKOUT0SEL); + + /* reset HXTALEN, CKMEN, PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + + /* Reset HXTALBPS bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* reset PLLSEL, PREDV0_LSB, PLLMF, USBFSPSC bits */ + + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_PLLMF_4); + RCU_CFG1 = 0x00000000U; + + /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x00FF0000U; + + /* Configure the System clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */ + system_clock_config(); +} + +/*! + \brief update the SystemCoreClock with current core clock retrieved from cpu registers + \param[in] none + \param[out] none + \retval none +*/ +void SystemCoreClockUpdate(void) +{ + uint32_t scss; + uint32_t pllsel, predv0sel, pllmf, ck_src; + uint32_t predv0, predv1, pll1mf; + + scss = GET_BITS(RCU_CFG0, 2, 3); + + switch (scss) + { + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + SystemCoreClock = IRC8M_VALUE; + break; + + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + + if(RCU_PLLSRC_IRC8M_DIV2 == pllsel){ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE / 2U; + }else{ + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + + if(pllmf >= 15U){ + pllmf += 1U; + }else{ + pllmf += 2U; + } + + SystemCoreClock = ck_src * pllmf; + + if(15U == pllmf){ + /* PLL source clock multiply by 6.5 */ + SystemCoreClock = ck_src * 6U + ck_src / 2U; + } + + break; + + /* IRC8M is selected as CK_SYS */ + default: + SystemCoreClock = IRC8M_VALUE; + break; + } +} + +#ifdef __SYSTEM_CLOCK_HXTAL +/*! + \brief configure the system clock to HXTAL + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select HXTAL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; + + /* wait until HXTAL is selected as system clock */ + while(0 == (RCU_CFG0 & RCU_SCSS_HXTAL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +/*! + \brief configure the system clock to 24M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_24m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 6 = 24 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +/*! + \brief configure the system clock to 36M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_36m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 9 = 36 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +/*! + \brief configure the system clock to 48M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL12); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +/*! + \brief configure the system clock to 56M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_56m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 14 = 56 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL14); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +/*! + \brief configure the system clock to 72M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL18); + + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +/*! + \brief configure the system clock to 96M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_96m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + if(HXTAL_VALUE==25000000){ + + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +/*! + \brief configure the system clock to 108M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ + +static void system_clock_108m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL27); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PREDV1_DIV5 | RCU_PLL1_MUL8 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 | RCU_PREDV1_DIV2 | RCU_PLL1_MUL20 | RCU_PLL2_MUL20); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL2 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + + } + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +/*! + \brief configure the system clock to 48M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL12; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +/*! + \brief configure the system clock to 72M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL18; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +/*! + \brief configure the system clock to 108M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL27; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_bbb.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_bbb.c new file mode 100644 index 0000000..37bf786 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_bbb.c @@ -0,0 +1,275 @@ +/*! + \file usbd_msc_bbb.c + \brief USB BBB(Bulk/Bulk/Bulk) protocol core functions + \note BBB means Bulk-only transport protocol for USB MSC + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_msc_bbb.h" +#include "usbd_msc_mem.h" +#include "usbd_msc_scsi.h" +#include "usbd_transc.h" +#include "usbd_enum.h" + +uint8_t msc_bbb_state; +uint8_t msc_bbb_status; + +uint16_t msc_bbb_datalen; + +uint8_t msc_bbb_data[MSC_MEDIA_PACKET_SIZE]; + +msc_bbb_cbw bbb_cbw; +msc_bbb_csw bbb_csw; + +static void msc_bbb_cbw_decode (usb_core_driver *pudev); +static void msc_bbb_data_send (usb_core_driver *pudev, uint8_t *pbuf, uint16_t Len); +static void msc_bbb_abort (usb_core_driver *pudev); + +/*! + \brief initialize the bbb process + \param[in] pudev: pointer to USB device instance + \param[out] none + \retval none +*/ +void msc_bbb_init (usb_core_driver *pudev) +{ + uint8_t lun_num; + + msc_bbb_state = BBB_IDLE; + msc_bbb_status = BBB_STATUS_NORMAL; + + /* init the storage logic unit */ + for(lun_num = 0U; lun_num < MEM_LUN_NUM; lun_num++) { + usbd_mem_fops->mem_init(lun_num); + } + + /* flush the Rx FIFO */ + usbd_fifo_flush (pudev, MSC_OUT_EP); + + /* flush the Tx FIFO */ + usbd_fifo_flush (pudev, MSC_IN_EP); + + /* prepare endpoint to receive the first BBB CBW */ + usbd_ep_recev (pudev, MSC_OUT_EP, (uint8_t *)&bbb_cbw, BBB_CBW_LENGTH); +} + +/*! + \brief reset the BBB machine + \param[in] pudev: pointer to USB device instance + \param[out] none + \retval none +*/ +void msc_bbb_reset (usb_core_driver *pudev) +{ + msc_bbb_state = BBB_IDLE; + msc_bbb_status = BBB_STATUS_RECOVERY; + + /* prapare endpoint to receive the first BBB command */ + usbd_ep_recev (pudev, MSC_OUT_EP, (uint8_t *)&bbb_cbw, BBB_CBW_LENGTH); +} + +/*! + \brief de-initialize the BBB machine + \param[in] pudev: pointer to USB device instance + \param[out] none + \retval none +*/ +void msc_bbb_deinit (usb_core_driver *pudev) +{ + msc_bbb_state = BBB_IDLE; +} + +/*! + \brief handle BBB data IN stage + \param[in] pudev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +void msc_bbb_data_in (usb_core_driver *pudev, uint8_t ep_num) +{ + usbd_fifo_flush (pudev, MSC_IN_EP); + + switch (msc_bbb_state) { + case BBB_DATA_IN: + if (scsi_process_cmd (pudev, bbb_cbw.bCBWLUN, &bbb_cbw.CBWCB[0]) < 0) { + msc_bbb_csw_send (pudev, CSW_CMD_FAILED); + } + break; + + case BBB_SEND_DATA: + case BBB_LAST_DATA_IN: + msc_bbb_csw_send (pudev, CSW_CMD_PASSED); + break; + + default: + break; + } +} + +/*! + \brief handle BBB data OUT stage + \param[in] pudev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +void msc_bbb_data_out (usb_core_driver *pudev, uint8_t ep_num) +{ + switch (msc_bbb_state) { + case BBB_IDLE: + msc_bbb_cbw_decode (pudev); + break; + + case BBB_DATA_OUT: + if (scsi_process_cmd (pudev, bbb_cbw.bCBWLUN, &bbb_cbw.CBWCB[0]) < 0) { + msc_bbb_csw_send (pudev, CSW_CMD_FAILED); + } + break; + + default: + break; + } +} + +/*! + \brief decode the CBW command and set the BBB state machine accordingtly + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void msc_bbb_cbw_decode (usb_core_driver *pudev) +{ + bbb_csw.dCSWTag = bbb_cbw.dCBWTag; + bbb_csw.dCSWDataResidue = bbb_cbw.dCBWDataTransferLength; + + if ((BBB_CBW_LENGTH != usbd_rxcount_get (pudev, MSC_OUT_EP)) || + (BBB_CBW_SIGNATURE != bbb_cbw.dCBWSignature)|| + (bbb_cbw.bCBWLUN > 1U) || + (bbb_cbw.bCBWCBLength < 1U) || + (bbb_cbw.bCBWCBLength > 16U)) { + /* illegal command handler */ + scsi_sense_code (bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + msc_bbb_status = BBB_STATUS_ERROR; + + msc_bbb_abort (pudev); + } else { + if (scsi_process_cmd (pudev, bbb_cbw.bCBWLUN, &bbb_cbw.CBWCB[0]) < 0) { + msc_bbb_abort (pudev); + } else if ((BBB_DATA_IN != msc_bbb_state) && + (BBB_DATA_OUT != msc_bbb_state) && + (BBB_LAST_DATA_IN != msc_bbb_state)) { /* burst xfer handled internally */ + if (msc_bbb_datalen > 0U) { + msc_bbb_data_send (pudev, msc_bbb_data, msc_bbb_datalen); + } else if (0U == msc_bbb_datalen) { + msc_bbb_csw_send (pudev, CSW_CMD_PASSED); + } + } + } +} + +/*! + \brief send the requested data + \param[in] udev: pointer to USB device instance + \param[in] buf: pointer to data buffer + \param[in] len: data length + \param[out] none + \retval none +*/ +static void msc_bbb_data_send (usb_core_driver *pudev, uint8_t *buf, uint16_t len) +{ + len = USB_MIN (bbb_cbw.dCBWDataTransferLength, len); + + bbb_csw.dCSWDataResidue -= len; + bbb_csw.bCSWStatus = CSW_CMD_PASSED; + msc_bbb_state = BBB_SEND_DATA; + + usbd_ep_send (pudev, MSC_IN_EP, buf, len); +} + +/*! + \brief send the CSW(command status wrapper) + \param[in] udev: pointer to USB device instance + \param[in] csw_status: CSW status + \param[out] none + \retval none +*/ +void msc_bbb_csw_send (usb_core_driver *pudev, uint8_t csw_status) +{ + bbb_csw.dCSWSignature = BBB_CSW_SIGNATURE; + bbb_csw.bCSWStatus = csw_status; + msc_bbb_state = BBB_IDLE; + + usbd_ep_send (pudev, MSC_IN_EP, (uint8_t *)&bbb_csw, BBB_CSW_LENGTH); + + /* prapare endpoint to receive next command */ + usbd_ep_recev (pudev, MSC_OUT_EP, (uint8_t *)&bbb_cbw, BBB_CBW_LENGTH); +} + +/*! + \brief abort the current transfer + \param[in] pudev: pointer to USB device instance + \param[out] none + \retval none +*/ +static void msc_bbb_abort (usb_core_driver *pudev) +{ + if ((bbb_cbw.bmCBWFlags == 0) && + (bbb_cbw.dCBWDataTransferLength != 0) && + (msc_bbb_status == BBB_STATUS_NORMAL)) { + usbd_ep_stall(pudev, MSC_OUT_EP); + } + + usbd_ep_stall(pudev, MSC_IN_EP); + + if (msc_bbb_status == BBB_STATUS_ERROR) { + usbd_ep_recev (pudev, MSC_OUT_EP, (uint8_t *)&bbb_cbw, BBB_CBW_LENGTH); + } +} + +/*! + \brief complete the clear feature request + \param[in] pudev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +void msc_bbb_clrfeature (usb_core_driver *pudev, uint8_t ep_num) +{ + if (msc_bbb_status == BBB_STATUS_ERROR)/* bad CBW signature */ { + usbd_ep_stall(pudev, MSC_IN_EP); + + msc_bbb_status = BBB_STATUS_NORMAL; + } else if(((ep_num & 0x80) == 0x80) && (msc_bbb_status != BBB_STATUS_RECOVERY)) { + msc_bbb_csw_send (pudev, CSW_CMD_FAILED); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_core.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_core.c new file mode 100644 index 0000000..1b9df70 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_core.c @@ -0,0 +1,277 @@ +/*! + \file usbd_msc_core.c + \brief USB MSC device class core functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_msc_mem.h" +#include "usbd_msc_core.h" +#include "usbd_msc_bbb.h" +#include "usbd_enum.h" + +#define USBD_VID 0x28E9U +#define USBD_PID 0x028FU + +static uint8_t msc_core_init (usb_dev *pudev, uint8_t config_index); +static uint8_t msc_core_deinit (usb_dev *pudev, uint8_t config_index); +static uint8_t msc_core_req (usb_dev *pudev, usb_req *req); +static uint8_t msc_core_in (usb_dev *pudev, uint8_t ep_num); +static uint8_t msc_core_out (usb_dev *pudev, uint8_t ep_num); + +usb_class_core msc_class = +{ + .init = msc_core_init, + .deinit = msc_core_deinit, + + .req_proc = msc_core_req, + + .data_in = msc_core_in, + .data_out = msc_core_out +}; + +/* note: it should use the C99 standard when compiling the below codes */ +/* USB standard device descriptor */ +const usb_desc_dev msc_dev_desc = +{ + .header = { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200U, + .bDeviceClass = 0x00U, + .bDeviceSubClass = 0x00U, + .bDeviceProtocol = 0x00U, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = 0x0100U, + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +/* USB device configuration descriptor */ +const usb_desc_config_set msc_config_desc = +{ + .config = + { + .header = { + .bLength = sizeof(usb_desc_config), + .bDescriptorType = USB_DESCTYPE_CONFIG + }, + .wTotalLength = USB_MSC_CONFIG_DESC_SIZE, + .bNumInterfaces = 0x01U, + .bConfigurationValue = 0x01U, + .iConfiguration = 0x00U, + .bmAttributes = 0xC0U, + .bMaxPower = 0x32U + }, + + .msc_itf = + { + .header = { + .bLength = sizeof(usb_desc_itf), + .bDescriptorType = USB_DESCTYPE_ITF + }, + .bInterfaceNumber = 0x00U, + .bAlternateSetting = 0x00U, + .bNumEndpoints = 0x02U, + .bInterfaceClass = USB_CLASS_MSC, + .bInterfaceSubClass = USB_MSC_SUBCLASS_SCSI, + .bInterfaceProtocol = USB_MSC_PROTOCOL_BBB, + .iInterface = 0x00U + }, + + .msc_epin = + { + .header = { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = MSC_IN_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = MSC_EPIN_SIZE, + .bInterval = 0x00U + }, + + .msc_epout = + { + .header = { + .bLength = sizeof(usb_desc_ep), + .bDescriptorType = USB_DESCTYPE_EP + }, + .bEndpointAddress = MSC_OUT_EP, + .bmAttributes = USB_EP_ATTR_BULK, + .wMaxPacketSize = MSC_EPOUT_SIZE, + .bInterval = 0x00U + } +}; + +/* USB language ID descriptor */ +const usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +/* usb string descriptor */ +void *const usbd_msc_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = USBD_STRING_DESC("GigaDevice"), + [STR_IDX_PRODUCT] = USBD_STRING_DESC("GD32 USB MSC in FS Mode"), + [STR_IDX_SERIAL] = USBD_STRING_DESC("GD32VF103-V1.0.0-ka4db5ec") +}; + +static uint8_t usbd_msc_maxlun = 0; + +/*! + \brief initialize the MSC device + \param[in] udev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t msc_core_init (usb_dev *pudev, uint8_t config_index) +{ + /* configure MSC Tx endpoint */ + usbd_ep_setup (pudev, &(msc_config_desc.msc_epin)); + + /* configure MSC Rx endpoint */ + usbd_ep_setup (pudev, &(msc_config_desc.msc_epout)); + + /* init the BBB layer */ + msc_bbb_init(pudev); + + return USBD_OK; +} + +/*! + \brief de-initialize the MSC device + \param[in] pudev: pointer to USB device instance + \param[in] config_index: configuration index + \param[out] none + \retval USB device operation status +*/ +static uint8_t msc_core_deinit (usb_dev *pudev, uint8_t config_index) +{ + /* clear MSC endpoints */ + usbd_ep_clear (pudev, MSC_IN_EP); + usbd_ep_clear (pudev, MSC_OUT_EP); + + /* un-init the BBB layer */ + msc_bbb_deinit(pudev); + + return USBD_OK; +} + +/*! + \brief handle the MSC class-specific and standard requests + \param[in] pudev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t msc_core_req (usb_dev *pudev, usb_req *req) +{ + usb_transc *transc = &pudev->dev.transc_in[0]; + + switch (req->bRequest) { + case BBB_GET_MAX_LUN : + if((0U == req->wValue) && + (1U == req->wLength) && + (0x80U == (req->bmRequestType & 0x80U))) { + usbd_msc_maxlun = usbd_mem_fops->mem_maxlun(); + + transc->xfer_buf = &usbd_msc_maxlun; + transc->remain_len = 1; + } else { + return USBD_FAIL; + } + break; + + case BBB_RESET : + if((0U == req->wValue) && + (0U == req->wLength) && + (0x80U != (req->bmRequestType & 0x80U))) { + msc_bbb_reset(pudev); + } else { + return USBD_FAIL; + } + break; + + case USB_CLEAR_FEATURE: + msc_bbb_clrfeature (pudev, (uint8_t)req->wIndex); + break; + + default: + return USBD_FAIL; + } + + return USBD_OK; +} + +/*! + \brief handle data in stage + \param[in] pudev: pointer to USB device instance + \param[in] ep_num: the endpoint number + \param[out] none + \retval none +*/ +static uint8_t msc_core_in (usb_dev *pudev, uint8_t ep_num) +{ + if ((MSC_IN_EP & 0x7FU) == ep_num) { + msc_bbb_data_in(pudev, ep_num); + } + + return USBD_OK; +} + +/*! + \brief handle data out stage + \param[in] pudev: pointer to USB device instance + \param[in] ep_num: the endpoint number + \param[out] none + \retval none +*/ +static uint8_t msc_core_out (usb_dev *pudev, uint8_t ep_num) +{ + if (MSC_OUT_EP == ep_num) { + msc_bbb_data_out (pudev, ep_num); + } + + return USBD_OK; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_data.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_data.c new file mode 100644 index 0000000..f90fcba --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_data.c @@ -0,0 +1,73 @@ +/*! + \file usbd_msc_data.c + \brief USB MSC vital inquiry pages and sense data + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_msc_data.h" + +/* USB mass storage page 0 inquiry data */ +const uint8_t msc_page00_inquiry_data[] = +{ + 0x00, + 0x00, + 0x00, + (INQUIRY_PAGE00_LENGTH - 4), + 0x00, + 0x80, + 0x83 +}; + +/* USB mass storage sense 6 data */ +const uint8_t msc_mode_sense6_data[] = +{ + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 +}; + +/* USB mass storage sense 10 data */ +const uint8_t msc_mode_sense10_data[] = +{ + 0x00, + 0x06, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00, + 0x00 +}; diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_scsi.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_scsi.c new file mode 100644 index 0000000..2d45c70 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_msc_scsi.c @@ -0,0 +1,650 @@ +/*! + \file usbd_msc_scsi.c + \brief USB SCSI layer functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_msc_bbb.h" +#include "usbd_msc_scsi.h" +#include "usbd_msc_mem.h" +#include "usbd_msc_data.h" +#include "usbd_enum.h" + +msc_scsi_sense scsi_sense[SENSE_LIST_DEEPTH]; + +uint8_t scsi_sense_head; +uint8_t scsi_sense_tail; + +uint32_t scsi_blk_size[MEM_LUN_NUM]; +uint32_t scsi_blk_nbr[MEM_LUN_NUM]; + +uint32_t scsi_blk_addr; +uint32_t scsi_blk_len; + +usb_core_driver *cdev; + +static int8_t scsi_test_unit_ready (uint8_t lun, uint8_t *params); +static int8_t scsi_inquiry (uint8_t lun, uint8_t *params); +static int8_t scsi_read_format_capacity (uint8_t lun, uint8_t *params); +static int8_t scsi_read_capacity10 (uint8_t lun, uint8_t *params); +static int8_t scsi_request_sense (uint8_t lun, uint8_t *params); +static int8_t scsi_start_stop_unit (uint8_t lun, uint8_t *params); +static int8_t scsi_allow_medium_removal (uint8_t lun, uint8_t *params); +static int8_t scsi_mode_sense6 (uint8_t lun, uint8_t *params); +static int8_t scsi_toc_cmd_read (uint8_t lun, uint8_t *params); +static int8_t scsi_mode_sense10 (uint8_t lun, uint8_t *params); +static int8_t scsi_write10 (uint8_t lun, uint8_t *params); +static int8_t scsi_read10 (uint8_t lun, uint8_t *params); +static int8_t scsi_verify10 (uint8_t lun, uint8_t *params); +static int8_t scsi_check_address_range (uint8_t lun, uint32_t blk_offset, uint16_t blk_nbr); +static int8_t scsi_process_read (uint8_t lun); +static int8_t scsi_process_write (uint8_t lun); +static int8_t scsi_format_cmd (uint8_t lun); + +/*! + \brief process SCSI commands + \param[in] udev: pointer to USB device instance + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +int8_t scsi_process_cmd(usb_core_driver *pudev, uint8_t lun, uint8_t *params) +{ + cdev = pudev; + + switch (params[0]) { + case SCSI_TEST_UNIT_READY: + return scsi_test_unit_ready (lun, params); + + case SCSI_REQUEST_SENSE: + return scsi_request_sense (lun, params); + + case SCSI_INQUIRY: + return scsi_inquiry (lun, params); + + case SCSI_START_STOP_UNIT: + return scsi_start_stop_unit (lun, params); + + case SCSI_ALLOW_MEDIUM_REMOVAL: + return scsi_allow_medium_removal (lun, params); + + case SCSI_MODE_SENSE6: + return scsi_mode_sense6 (lun, params); + + case SCSI_MODE_SENSE10: + return scsi_mode_sense10 (lun, params); + + case SCSI_READ_FORMAT_CAPACITIES: + return scsi_read_format_capacity (lun, params); + + case SCSI_READ_CAPACITY10: + return scsi_read_capacity10 (lun, params); + + case SCSI_READ10: + return scsi_read10 (lun, params); + + case SCSI_WRITE10: + return scsi_write10 (lun, params); + + case SCSI_VERIFY10: + return scsi_verify10 (lun, params); + + case SCSI_FORMAT_UNIT: + return scsi_format_cmd (lun); + + case SCSI_READ_TOC_DATA: + return scsi_toc_cmd_read (lun, params); + + default: + scsi_sense_code (lun, ILLEGAL_REQUEST, INVALID_CDB); + return -1; + } +} + +/*! + \brief process SCSI Test Unit Ready command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_test_unit_ready (uint8_t lun, uint8_t *params) +{ + /* case 9 : Hi > D0 */ + if (0U != bbb_cbw.dCBWDataTransferLength) { + scsi_sense_code (bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + if (0U != usbd_mem_fops->mem_ready(lun)) { + scsi_sense_code(lun, NOT_READY, MEDIUM_NOT_PRESENT); + + return -1; + } + + msc_bbb_datalen = 0; + + return 0; +} + +/*! + \brief process Inquiry command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_inquiry (uint8_t lun, uint8_t *params) +{ + uint8_t *page = NULL; + + uint16_t len = 0U; + + if (params[1] & 0x01U) { + /* Evpd is set */ + page = (uint8_t *)msc_page00_inquiry_data; + + len = INQUIRY_PAGE00_LENGTH; + } else { + page = (uint8_t *)usbd_mem_fops->mem_inquiry_data[lun]; + + len = page[4] + 5; + + if (params[4] <= len) { + len = params[4]; + } + } + + msc_bbb_datalen = len; + + while (len) { + len--; + msc_bbb_data[len] = page[len]; + } + + return 0; +} + +/*! + \brief process Read Capacity 10 command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_read_capacity10 (uint8_t lun, uint8_t *params) +{ + uint32_t blk_num = usbd_mem_fops->mem_block_len[lun] - 1; + + scsi_blk_nbr[lun] = usbd_mem_fops->mem_block_len[lun]; + scsi_blk_size[lun] = usbd_mem_fops->mem_block_size[lun]; + + msc_bbb_data[0] = (uint8_t)(blk_num >> 24); + msc_bbb_data[1] = (uint8_t)(blk_num >> 16); + msc_bbb_data[2] = (uint8_t)(blk_num >> 8); + msc_bbb_data[3] = (uint8_t)(blk_num); + + msc_bbb_data[4] = (uint8_t)(scsi_blk_size[lun] >> 24); + msc_bbb_data[5] = (uint8_t)(scsi_blk_size[lun] >> 16); + msc_bbb_data[6] = (uint8_t)(scsi_blk_size[lun] >> 8); + msc_bbb_data[7] = (uint8_t)(scsi_blk_size[lun]); + + msc_bbb_datalen = 8; + + return 0; +} + +/*! + \brief process Read Format Capacity command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_read_format_capacity (uint8_t lun, uint8_t *params) +{ + uint32_t blk_size = usbd_mem_fops->mem_block_size[lun]; + uint32_t blk_num = usbd_mem_fops->mem_block_len[lun]; + + uint16_t i = 0U; + + for (i = 0U; i < 12U; i++) { + msc_bbb_data[i] = 0; + } + + uint32_t blk_nbr = blk_num - 1; + + msc_bbb_data[3] = 0x08U; + msc_bbb_data[4] = (uint8_t)(blk_nbr >> 24); + msc_bbb_data[5] = (uint8_t)(blk_nbr >> 16); + msc_bbb_data[6] = (uint8_t)(blk_nbr >> 8); + msc_bbb_data[7] = (uint8_t)(blk_nbr); + + msc_bbb_data[8] = 0x02U; + msc_bbb_data[9] = (uint8_t)(blk_size >> 16); + msc_bbb_data[10] = (uint8_t)(blk_size >> 8); + msc_bbb_data[11] = (uint8_t)(blk_size); + + msc_bbb_datalen = 12U; + + return 0; +} + +/*! + \brief process Mode Sense6 command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_mode_sense6 (uint8_t lun, uint8_t *params) +{ + uint16_t len = 8U; + + msc_bbb_datalen = len; + + while (len) { + len--; + msc_bbb_data[len] = msc_mode_sense6_data[len]; + } + + return 0; +} + +/*! + \brief process Mode Sense10 command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_mode_sense10 (uint8_t lun, uint8_t *params) +{ + uint16_t len = 8; + + msc_bbb_datalen = len; + + while (len) { + len--; + msc_bbb_data[len] = msc_mode_sense10_data[len]; + } + + return 0; +} + +/*! + \brief process Request Sense command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_request_sense (uint8_t lun, uint8_t *params) +{ + uint8_t i = 0U; + + for (i = 0U; i < REQUEST_SENSE_DATA_LEN; i++) { + msc_bbb_data[i] = 0U; + } + + msc_bbb_data[0] = 0x70U; + msc_bbb_data[7] = REQUEST_SENSE_DATA_LEN - 6U; + + if ((scsi_sense_head != scsi_sense_tail)) { + msc_bbb_data[2] = scsi_sense[scsi_sense_head].SenseKey; + msc_bbb_data[12] = scsi_sense[scsi_sense_head].ASCQ; + msc_bbb_data[13] = scsi_sense[scsi_sense_head].ASC; + scsi_sense_head++; + + if (scsi_sense_head == SENSE_LIST_DEEPTH) { + scsi_sense_head = 0U; + } + } + + msc_bbb_datalen = USB_MIN(REQUEST_SENSE_DATA_LEN, params[4]); + + return 0; +} + +/*! + \brief load the last error code in the error list + \param[in] lun: logical unit number + \param[in] skey: sense key + \param[in] asc: additional aense key + \param[out] none + \retval none +*/ +void scsi_sense_code (uint8_t lun, uint8_t skey, uint8_t asc) +{ + scsi_sense[scsi_sense_tail].SenseKey = skey; + scsi_sense[scsi_sense_tail].ASC = asc << 8; + scsi_sense_tail++; + + if (SENSE_LIST_DEEPTH == scsi_sense_tail) { + scsi_sense_tail = 0; + } +} + +/*! + \brief process Start Stop Unit command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_start_stop_unit (uint8_t lun, uint8_t *params) +{ + msc_bbb_datalen = 0; + + return 0; +} + +/*! + \brief process Allow Medium Removal command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_allow_medium_removal (uint8_t lun, uint8_t *params) +{ + msc_bbb_datalen = 0; + + return 0; +} + +/*! + \brief process Read10 command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_read10 (uint8_t lun, uint8_t *params) +{ + if (msc_bbb_state == BBB_IDLE) { + /* direction is from device to host */ + if (0x80U != (bbb_cbw.bmCBWFlags & 0x80U)) { + scsi_sense_code (bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + if (0U != usbd_mem_fops->mem_ready(lun)) { + scsi_sense_code (lun, NOT_READY, MEDIUM_NOT_PRESENT); + + return -1; + } + + scsi_blk_addr = (params[2] << 24) | (params[3] << 16) | \ + (params[4] << 8) | params[5]; + + scsi_blk_len = (params[7] << 8) | params[8]; + + if (scsi_check_address_range (lun, scsi_blk_addr, scsi_blk_len) < 0) { + return -1; /* error */ + } + + msc_bbb_state = BBB_DATA_IN; + + scsi_blk_addr *= scsi_blk_size[lun]; + scsi_blk_len *= scsi_blk_size[lun]; + + /* cases 4,5 : Hi <> Dn */ + if (bbb_cbw.dCBWDataTransferLength != scsi_blk_len) { + scsi_sense_code (bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + } + + msc_bbb_datalen = MSC_MEDIA_PACKET_SIZE; + + return scsi_process_read (lun); +} + +/*! + \brief process Write10 command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_write10 (uint8_t lun, uint8_t *params) +{ + if (BBB_IDLE == msc_bbb_state) { + /* case 8 : Hi <> Do */ + if (0x80U == (bbb_cbw.bmCBWFlags & 0x80U)) { + scsi_sense_code (bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + /* check whether media is ready */ + if (0U != usbd_mem_fops->mem_ready(lun)) { + scsi_sense_code (lun, NOT_READY, MEDIUM_NOT_PRESENT); + + return -1; + } + + /* check if media is write-protected */ + if (0U != usbd_mem_fops->mem_protected(lun)) { + scsi_sense_code (lun, NOT_READY, WRITE_PROTECTED); + + return -1; + } + + scsi_blk_addr = (params[2] << 24) | (params[3] << 16) | \ + (params[4] << 8) | params[5]; + + scsi_blk_len = (params[7] << 8) | params[8]; + + /* check if LBA address is in the right range */ + if (scsi_check_address_range (lun, scsi_blk_addr, scsi_blk_len) < 0) { + return -1; /* error */ + } + + scsi_blk_addr *= scsi_blk_size[lun]; + scsi_blk_len *= scsi_blk_size[lun]; + + /* cases 3,11,13 : Hn,Ho <> D0 */ + if (bbb_cbw.dCBWDataTransferLength != scsi_blk_len) { + scsi_sense_code (bbb_cbw.bCBWLUN, ILLEGAL_REQUEST, INVALID_CDB); + + return -1; + } + + /* prepare endpoint to receive first data packet */ + msc_bbb_state = BBB_DATA_OUT; + + usbd_ep_recev (cdev, + MSC_OUT_EP, + msc_bbb_data, + USB_MIN (scsi_blk_len, MSC_MEDIA_PACKET_SIZE)); + } else { /* write process ongoing */ + return scsi_process_write (lun); + } + + return 0; +} + +/*! + \brief process Verify10 command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_verify10 (uint8_t lun, uint8_t *params) +{ + if (0x02U == (params[1] & 0x02U)) { + scsi_sense_code (lun, ILLEGAL_REQUEST, INVALID_FIELED_IN_COMMAND); + + return -1; /* error, verify mode not supported*/ + } + + if (scsi_check_address_range (lun, scsi_blk_addr, scsi_blk_len) < 0) { + return -1; /* error */ + } + + msc_bbb_datalen = 0U; + + return 0; +} + +/*! + \brief check address range + \param[in] lun: logical unit number + \param[in] blk_offset: block offset + \param[in] blk_nbr: number of block to be processed + \param[out] none + \retval none +*/ +static int8_t scsi_check_address_range (uint8_t lun, uint32_t blk_offset, uint16_t blk_nbr) +{ + if ((blk_offset + blk_nbr) > scsi_blk_nbr[lun]) { + scsi_sense_code (lun, ILLEGAL_REQUEST, ADDRESS_OUT_OF_RANGE); + + return -1; + } + + return 0; +} + +/*! + \brief handle read process + \param[in] lun: logical unit number + \param[out] none + \retval none +*/ +static int8_t scsi_process_read (uint8_t lun) +{ + uint32_t len = USB_MIN(scsi_blk_len, MSC_MEDIA_PACKET_SIZE); + + if (usbd_mem_fops->mem_read(lun, + msc_bbb_data, + scsi_blk_addr, + len / scsi_blk_size[lun]) < 0) { + scsi_sense_code(lun, HARDWARE_ERROR, UNRECOVERED_READ_ERROR); + + return -1; + } + + usbd_ep_send (cdev, MSC_IN_EP, msc_bbb_data, len); + + scsi_blk_addr += len; + scsi_blk_len -= len; + + /* case 6 : Hi = Di */ + bbb_csw.dCSWDataResidue -= len; + + if (0U == scsi_blk_len) { + msc_bbb_state = BBB_LAST_DATA_IN; + } + + return 0; +} + +/*! + \brief handle write process + \param[in] lun: logical unit number + \param[out] none + \retval status +*/ +static int8_t scsi_process_write (uint8_t lun) +{ + uint32_t len = USB_MIN(scsi_blk_len, MSC_MEDIA_PACKET_SIZE); + + if (usbd_mem_fops->mem_write (lun, + msc_bbb_data, + scsi_blk_addr, + len / scsi_blk_size[lun]) < 0) { + scsi_sense_code(lun, HARDWARE_ERROR, WRITE_FAULT); + + return -1; + } + + scsi_blk_addr += len; + scsi_blk_len -= len; + + /* case 12 : Ho = Do */ + bbb_csw.dCSWDataResidue -= len; + + if (0U == scsi_blk_len) { + msc_bbb_csw_send (cdev, CSW_CMD_PASSED); + } else { + /* prapare endpoint to receive next packet */ + usbd_ep_recev (cdev, + MSC_OUT_EP, + msc_bbb_data, + USB_MIN (scsi_blk_len, MSC_MEDIA_PACKET_SIZE)); + } + + return 0; +} + +/*! + \brief process Format Unit command + \param[in] lun: logical unit number + \param[out] none + \retval status +*/ +static int8_t scsi_format_cmd (uint8_t lun) +{ + return 0; +} + +/*! + \brief process Read_Toc command + \param[in] lun: logical unit number + \param[in] params: command parameters + \param[out] none + \retval none +*/ +static int8_t scsi_toc_cmd_read (uint8_t lun, uint8_t *params) +{ + uint8_t* pPage; + uint16_t len; + + pPage = (uint8_t *)&usbd_mem_fops->mem_toc_data[lun * READ_TOC_CMD_LEN]; + len = pPage[1] + 2; + + msc_bbb_datalen = len; + + while (len) { + len--; + msc_bbb_data[len] = pPage[len]; + } + + return 0; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_storage_msd.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_storage_msd.c new file mode 100644 index 0000000..cfca536 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/Source/usbd_storage_msd.c @@ -0,0 +1,224 @@ +/*! + \file usbd_storage_msd.c + \brief disk operations functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usb_conf.h" +//#include "sram_msd.h" +#include "flash_msd.h" +#include "usbd_msc_mem.h" + +/* USB Mass storage Standard Inquiry Data */ + +const int8_t STORAGE_InquiryData[] = +{ +#ifdef SRAM_STORAGE + /* LUN 0 */ + 0x00, + 0x80, + 0x00, + 0x01, + (USBD_STD_INQUIRY_LENGTH - 5), + 0x00, + 0x00, + 0x00, + 'G', 'D', '3', '2', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */ + 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', /* Product : 16 Bytes */ + ' ', 's', 'r', 'a', 'm', ' ', ' ', ' ', + '1', '.', '0' ,'0', /* Version : 4 Bytes */ +#else + /* LUN 0 */ + 0x00, + 0x80, + 0x00, + 0x01, + (USBD_STD_INQUIRY_LENGTH - 5), + 0x00, + 0x00, + 0x00, + 'G', 'D', '3', '2', ' ', ' ', ' ', ' ', /* Manufacturer : 8 bytes */ + 'I', 'n', 't', 'e', 'r', 'n', 'a', 'l', /* Product : 16 Bytes */ + ' ', 'f', 'l', 'a', 's', 'h', ' ', ' ', + '1', '.', '0' ,'0', /* Version : 4 Bytes */ +#endif +}; + +static int8_t STORAGE_Init (uint8_t Lun); +static int8_t STORAGE_IsReady (uint8_t Lun); +static int8_t STORAGE_IsWriteProtected (uint8_t Lun); +static int8_t STORAGE_GetMaxLun (void); + +static int8_t STORAGE_Read (uint8_t Lun, + uint8_t *buf, + uint32_t BlkAddr, + uint16_t BlkLen); + +static int8_t STORAGE_Write (uint8_t Lun, + uint8_t *buf, + uint32_t BlkAddr, + uint16_t BlkLen); + + +usbd_mem_cb USBD_Internal_Storage_fops = +{ + .mem_init = STORAGE_Init, + .mem_ready = STORAGE_IsReady, + .mem_protected = STORAGE_IsWriteProtected, + .mem_read = STORAGE_Read, + .mem_write = STORAGE_Write, + .mem_maxlun = STORAGE_GetMaxLun, + + .mem_inquiry_data = {(uint8_t *)STORAGE_InquiryData}, + +#ifdef SRAM_STORAGE + .mem_block_size = {ISRAM_BLOCK_SIZE}, + .mem_block_len = {ISRAM_BLOCK_NUM} +#else + .mem_block_size = {ISFLASH_BLOCK_SIZE}, + .mem_block_len = {ISFLASH_BLOCK_NUM} +#endif /* SRAM_STORAGE */ +}; + +usbd_mem_cb *usbd_mem_fops = &USBD_Internal_Storage_fops; + + +/** + * @brief Initialize the storage medium + * @param Lun: logical unit number + * @retval Status + */ +static int8_t STORAGE_Init (uint8_t Lun) +{ +#ifdef SRAM_STORAGE + +#else + flash_init (); +#endif + return 0; +} + +/** + * @brief Check whether the medium is ready + * @param Lun: Logical unit number + * @retval Status + */ +static int8_t STORAGE_IsReady (uint8_t Lun) +{ + return 0; +} + +/** + * @brief Check whether the medium is write-protected + * @param Lun: logical unit number + * @retval Status + */ +static int8_t STORAGE_IsWriteProtected (uint8_t Lun) +{ + return 0; +} + +/** + * @brief Read data from the medium + * @param Lun: logical unit number + * @param buf: pointer to the buffer to save data + * @param BlkAddr: address of 1st block to be read + * @param BlkLen: number of blocks to be read + * @retval Status + */ +static int8_t STORAGE_Read (uint8_t Lun, + uint8_t *buf, + uint32_t BlkAddr, + uint16_t BlkLen) +{ +#ifdef SRAM_STORAGE + if(SRAM_ReadMultiBlocks(buf, + BlkAddr, + ISRAM_BLOCK_SIZE, + BlkLen) != 0) + { + return 5; + } +#else + if(flash_multi_blocks_read (buf, + BlkAddr, + ISFLASH_BLOCK_SIZE, + BlkLen) != 0) + { + return 5; + } +#endif + return 0; +} + +/** + * @brief Write data to the medium + * @param Lun: logical unit number + * @param buf: pointer to the buffer to write + * @param BlkAddr: address of blocks to be written + * @param BlkLen: number of blocks to be read + * @retval Status + */ +static int8_t STORAGE_Write (uint8_t Lun, + uint8_t *buf, + uint32_t BlkAddr, + uint16_t BlkLen) +{ +#ifdef SRAM_STORAGE + if(SRAM_WriteMultiBlocks(buf, + BlkAddr, + ISRAM_BLOCK_SIZE, + BlkLen) != 0) + { + return 5; + } +#else + if(flash_multi_blocks_write (buf, + BlkAddr, + ISFLASH_BLOCK_SIZE, + BlkLen) != 0) + { + return 5; + } + +#endif + return (0); +} + +/** + * @brief Get number of supported logical unit + * @param None + * @retval Number of logical unit + */ +static int8_t STORAGE_GetMaxLun (void) +{ + return (MEM_LUN_NUM - 1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/readme.txt new file mode 100644 index 0000000..a15c91a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Device/MSC_Internal_flash/readme.txt @@ -0,0 +1,62 @@ +/*! + \file readme.txt + \brief description of the USB MSC device(Udisk) demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board,it provides a description of +how to use the USB device application based on the Mass Storage Class (MSC). + + The GD32 MCU is enumerated as a MSC device using the native PC Host MSC driver +to which the GD32VF103V-EVAL-V1.0 board is connected. + + It illustrates an implementation of the MSC class which uses the bulk transfer +while the internal sram is used as storage media. + + This example supports the BOT (bulk only transfer) protocol and all needed SCSI +(small computer system interface) commands, and is compatible with Windows platform. + + After running the example, the user just has to plug the USB cable into a PC host +and the device is automatically detected. One new removable drives appear in the +system window and write/read/format operations can be performed as with any other +removable drive. + + To select the appropriate USB Core to work with, user must add the following macro +defines within the compiler preprocessor (already done in the preconfigured projects +provided with this application): + - "USE_USB_FS" when using USB Full Speed (FS) Core + + In order to make the program work, you must do the following : + - Open your preferred toolchain + + - Rebuild all files and load your image into target memory + + - Run the application diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Eclipse/usbh_hid/.cproject b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Eclipse/usbh_hid/.cproject new file mode 100644 index 0000000..f03b2a3 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Eclipse/usbh_hid/.cproject @@ -0,0 +1,210 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Eclipse/usbh_hid/.project b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Eclipse/usbh_hid/.project new file mode 100644 index 0000000..040e5aa --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Eclipse/usbh_hid/.project @@ -0,0 +1,678 @@ + + + usbh_hid + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + Examples + 2 + virtual:/virtual + + + Firmware + 2 + virtual:/virtual + + + Utilities + 2 + virtual:/virtual + + + Examples/USBFS + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver + 2 + virtual:/virtual + + + Firmware/RSICV + 2 + virtual:/virtual + + + Utilities/gd32vf103v_eval.c + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.c + + + Utilities/gd32vf103v_eval.h + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.h + + + Utilities/gd32vf103v_lcd_eval.c + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_lcd_eval.c + + + Utilities/gd32vf103v_lcd_eval.h + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_lcd_eval.h + + + Examples/USBFS/USB_Host + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Source + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/gd32vf103.h + + + Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + + + Firmware/GD32VF103_usbfs_driver/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver/Source + 2 + virtual:/virtual + + + Firmware/RSICV/drivers + 2 + virtual:/virtual + + + Firmware/RSICV/env_Eclipse + 2 + virtual:/virtual + + + Firmware/RSICV/stubs + 2 + virtual:/virtual + + + Examples/USBFS/USB_Host/HID_Host + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_host.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_host.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usbh_int.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usbh_int.h + + + Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbh_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbh_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbh_enum.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbh_enum.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbh_pipe.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbh_pipe.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbh_transc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbh_transc.h + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_host.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_host.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usbh_int.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usbh_int.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbh_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbh_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbh_enum.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbh_enum.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbh_pipe.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbh_pipe.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbh_transc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbh_transc.c + + + Firmware/RSICV/drivers/n200_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_eclic.h + + + Firmware/RSICV/drivers/n200_func.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.c + + + Firmware/RSICV/drivers/n200_func.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.h + + + Firmware/RSICV/drivers/n200_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_timer.h + + + Firmware/RSICV/drivers/riscv_bits.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_bits.h + + + Firmware/RSICV/drivers/riscv_const.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_const.h + + + Firmware/RSICV/drivers/riscv_encoding.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_encoding.h + + + Firmware/RSICV/env_Eclipse/GD32VF103x4.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103x4.lds + + + Firmware/RSICV/env_Eclipse/GD32VF103x6.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103x6.lds + + + Firmware/RSICV/env_Eclipse/GD32VF103x8.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103x8.lds + + + Firmware/RSICV/env_Eclipse/GD32VF103xB.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + + + Firmware/RSICV/env_Eclipse/entry.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/entry.S + + + Firmware/RSICV/env_Eclipse/handlers.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/handlers.c + + + Firmware/RSICV/env_Eclipse/init.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/init.c + + + Firmware/RSICV/env_Eclipse/start.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/start.S + + + Firmware/RSICV/env_Eclipse/your_printf.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/your_printf.c + + + Firmware/RSICV/stubs/_exit.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/_exit.c + + + Firmware/RSICV/stubs/close.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/close.c + + + Firmware/RSICV/stubs/fstat.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/fstat.c + + + Firmware/RSICV/stubs/isatty.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/isatty.c + + + Firmware/RSICV/stubs/lseek.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/lseek.c + + + Firmware/RSICV/stubs/read.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/read.c + + + Firmware/RSICV/stubs/sbrk.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/sbrk.c + + + Firmware/RSICV/stubs/stub.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/stub.h + + + Firmware/RSICV/stubs/write.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write.c + + + Firmware/RSICV/stubs/write_hex.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write_hex.c + + + Examples/USBFS/USB_Host/HID_Host/Include + 2 + virtual:/virtual + + + Examples/USBFS/USB_Host/HID_Host/Source + 2 + virtual:/virtual + + + Examples/USBFS/USB_Host/HID_Host/Include/gd32vf103_it.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_it.h + + + Examples/USBFS/USB_Host/HID_Host/Include/gd32vf103_libopt.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_libopt.h + + + Examples/USBFS/USB_Host/HID_Host/Include/lcd_font.h + 1 + PARENT-2-PROJECT_LOC/Include/lcd_font.h + + + Examples/USBFS/USB_Host/HID_Host/Include/lcd_log.h + 1 + PARENT-2-PROJECT_LOC/Include/lcd_log.h + + + Examples/USBFS/USB_Host/HID_Host/Include/usb_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usb_conf.h + + + Examples/USBFS/USB_Host/HID_Host/Include/usb_hid.h + 1 + PARENT-2-PROJECT_LOC/Include/usb_hid.h + + + Examples/USBFS/USB_Host/HID_Host/Include/usbh_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usbh_conf.h + + + Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_core.h + 1 + PARENT-2-PROJECT_LOC/Include/usbh_hid_core.h + + + Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_keybd.h + 1 + PARENT-2-PROJECT_LOC/Include/usbh_hid_keybd.h + + + Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_mouse.h + 1 + PARENT-2-PROJECT_LOC/Include/usbh_hid_mouse.h + + + Examples/USBFS/USB_Host/HID_Host/Include/usbh_usr.h + 1 + PARENT-2-PROJECT_LOC/Include/usbh_usr.h + + + Examples/USBFS/USB_Host/HID_Host/Source/app.c + 1 + PARENT-2-PROJECT_LOC/Source/app.c + + + Examples/USBFS/USB_Host/HID_Host/Source/gd32vf103_it.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_it.c + + + Examples/USBFS/USB_Host/HID_Host/Source/gd32vf103_usb_hw.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_usb_hw.c + + + Examples/USBFS/USB_Host/HID_Host/Source/lcd_font.c + 1 + PARENT-2-PROJECT_LOC/Source/lcd_font.c + + + Examples/USBFS/USB_Host/HID_Host/Source/lcd_log.c + 1 + PARENT-2-PROJECT_LOC/Source/lcd_log.c + + + Examples/USBFS/USB_Host/HID_Host/Source/system_gd32vf103.c + 1 + PARENT-2-PROJECT_LOC/Source/system_gd32vf103.c + + + Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_core.c + 1 + PARENT-2-PROJECT_LOC/Source/usbh_hid_core.c + + + Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_keybd.c + 1 + PARENT-2-PROJECT_LOC/Source/usbh_hid_keybd.c + + + Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_mouse.c + 1 + PARENT-2-PROJECT_LOC/Source/usbh_hid_mouse.c + + + Examples/USBFS/USB_Host/HID_Host/Source/usbh_usr.c + 1 + PARENT-2-PROJECT_LOC/Source/usbh_usr.c + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Eclipse/usbh_hid/.settings/language.settings.xml b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Eclipse/usbh_hid/.settings/language.settings.xml new file mode 100644 index 0000000..c6c3708 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Eclipse/usbh_hid/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/gd32vf103_it.h new file mode 100644 index 0000000..91215b6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/gd32vf103_it.h @@ -0,0 +1,46 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* this function handles USB wakeup interrupt handler */ +void USBFS_WKUP_IRQHandler(void); +/* this function handles USBFS IRQ Handler */ +void USBFS_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/lcd_font.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/lcd_font.h new file mode 100644 index 0000000..f70a41c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/lcd_font.h @@ -0,0 +1,44 @@ +/*! + \file lcd_font.h + \brief the header file of LCD font + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef LCD_FONT_H +#define LCD_FONT_H + +#include + +extern unsigned char const ascii_8x16[1536]; + +extern const uint16_t ASCII_Table_16x24[]; + +#endif /* LCD_FONT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/lcd_log.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/lcd_log.h new file mode 100644 index 0000000..4f1fa8f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/lcd_log.h @@ -0,0 +1,52 @@ +/*! + \file lcd_log.h + \brief the header file of LCD log + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "stdint.h" +#include "lcd_font.h" + +/* initialize the LCD log module */ +void lcd_log_init (void); +/* de-initialize the LCD log module */ +void lcd_log_deinit (void); +/* display the application header (title) on the LCD screen */ +void lcd_log_header_set (uint8_t *p_title, uint16_t start_x); +/* display the application footer (status) on the LCD screen */ +void lcd_log_footer_set (uint8_t *p_status, uint16_t start_x); +/* redirect the printf to the lcd */ +void lcd_log_print (uint8_t *p_str, uint16_t offset, uint16_t char_color); +/* clear the text zone */ +void lcd_log_text_zone_clear (uint16_t start_x, + uint16_t start_y, + uint16_t width, + uint16_t height); diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usb_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usb_conf.h new file mode 100644 index 0000000..04d2c46 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usb_conf.h @@ -0,0 +1,93 @@ +/*! + \file usb_conf.h + \brief general low level driver configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_CONF_H +#define __USB_CONF_H + + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include "gd32vf103v_lcd_eval.h" + +#include + +#ifdef USE_USB_FS + #define USB_FS_CORE +#endif + +#ifdef USB_FS_CORE + #define USB_RX_FIFO_FS_SIZE 128 + #define USB_HTX_NPFIFO_FS_SIZE 96 + #define USB_HTX_PFIFO_FS_SIZE 96 +#endif + +#define USB_SOF_OUTPUT 0 +#define USB_LOW_POWER 0 + +#define USE_HOST_MODE +//#define USE_DEVICE_MODE +//#define USE_OTG_MODE + +#ifndef USB_FS_CORE + #ifndef USB_HS_CORE + #error "USB_HS_CORE or USB_FS_CORE should be defined" + #endif +#endif + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_HS + #ifndef USE_USB_FS + #error "USE_USB_HS or USE_USB_FS should be defined" + #endif +#endif + +/****************** C Compilers dependant keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned(4))) + #define __ALIGN_BEGIN + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + +#endif /* __USB_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usb_hid.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usb_hid.h new file mode 100644 index 0000000..c105cf5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usb_hid.h @@ -0,0 +1,83 @@ +/*! + \file usb_hid.h + \brief definitions for the USB HID class + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_HID_H +#define __USB_HID_H + +#include "usb_ch9_std.h" + +#define USB_HID_CLASS 0x03U + +#define USB_DESCTYPE_HID 0x21U +#define USB_DESCTYPE_REPORT 0x22U + +/* HID subclass code */ +#define USB_HID_SUBCLASS_BOOT_ITF 0x01U + +/* HID protocol codes */ +#define USB_HID_PROTOCOL_KEYBOARD 0x01U +#define USB_HID_PROTOCOL_MOUSE 0x02U + +#define GET_REPORT 0x01U +#define GET_IDLE 0x02U +#define GET_PROTOCOL 0x03U +#define SET_REPORT 0x09U +#define SET_IDLE 0x0AU +#define SET_PROTOCOL 0x0BU + +#pragma pack(1) + +typedef struct +{ + usb_desc_header header; /*!< regular descriptor header containing the descriptor's type and length */ + + uint16_t bcdHID; /*!< BCD encoded version that the HID descriptor and device complies to */ + uint8_t bCountryCode; /*!< country code of the localized device, or zero if universal */ + uint8_t bNumDescriptors; /*!< total number of HID report descriptors for the interface */ + uint8_t bDescriptorType; /*!< type of HID report */ + uint16_t wDescriptorLength; /*!< length of the associated HID report descriptor, in bytes */ +} usb_desc_hid; + +#pragma pack() + +typedef struct +{ + usb_desc_config config; + usb_desc_itf hid_itf; + usb_desc_hid hid_vendor; + usb_desc_ep hid_epin; + usb_desc_ep hid_epout; +}usb_hid_desc_config_set; + +#endif /* __USB_HID_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_conf.h new file mode 100644 index 0000000..ae12fd4 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_conf.h @@ -0,0 +1,42 @@ +/*! + \file usbh_conf.h + \brief general low level driver configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBH_CONF_H +#define __USBH_CONF_H + +#define USBH_MAX_EP_NUM 2 +#define USBH_MAX_INTERFACES_NUM 2 +#define USBH_MSC_MPS_SIZE 0x200 + +#endif /* __USBH_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_core.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_core.h new file mode 100644 index 0000000..ed0854b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_core.h @@ -0,0 +1,126 @@ +/*! + \file usbh_hid_core.h + \brief header file for usbh_hid_core.c + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBH_HID_CORE_H +#define __USBH_HID_CORE_H + +#include "usb_hid.h" +#include "usbh_enum.h" +#include "usbh_transc.h" + +#define HID_MIN_POLL 10U + +#define USB_HID_DESC_SIZE 9U + +/* States for HID State Machine */ +typedef enum { + HID_IDLE = 0U, + HID_SEND_DATA, + HID_BUSY, + HID_GET_DATA, + HID_SYNC, + HID_POLL, + HID_ERROR, +}hid_state; + +typedef enum { + HID_REQ_IDLE = 0U, + HID_REQ_GET_REPORT_DESC, + HID_REQ_GET_HID_DESC, + HID_REQ_SET_IDLE, + HID_REQ_SET_PROTOCOL, + HID_REQ_SET_REPORT, +}hid_ctlstate; + +typedef struct +{ + void (*Init) (void); + void (*Decode) (uint8_t *data); +}hid_proc; + +typedef struct +{ + uint8_t ReportID; + uint8_t ReportType; + uint16_t UsagePage; + uint32_t Usage[2]; + uint32_t NbrUsage; + uint32_t UsageMin; + uint32_t UsageMax; + int32_t LogMin; + int32_t LogMax; + int32_t PhyMin; + int32_t PhyMax; + int32_t UnitExp; + uint32_t Unit; + uint32_t ReportSize; + uint32_t ReportCnt; + uint32_t Flag; + uint32_t PhyUsage; + uint32_t AppUsage; + uint32_t LogUsage; +}usb_desc_report; + +/* structure for HID process */ +typedef struct +{ + uint8_t buf[64]; + + uint8_t pipe_in; + uint8_t pipe_out; + + uint8_t ep_addr; + uint8_t ep_out; + uint8_t ep_in; + + uint16_t len; + uint16_t poll; + + __IO uint16_t timer; + + hid_state state; + hid_ctlstate ctlstate; + hid_proc *proc; +}hid_machine_struct; + +extern usbh_class_cb usbh_hid_cb; + +usbh_status usbh_set_report (usb_core_driver *pudev, + usbh_host *phost, + uint8_t report_type, + uint8_t report_id, + uint8_t report_len, + uint8_t *report_buff); + +#endif /* __USBH_HID_CORE_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_keybd.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_keybd.h new file mode 100644 index 0000000..4fb808c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_keybd.h @@ -0,0 +1,63 @@ +/*! + \file usbh_hid_keybd.h + \brief this file contains all the prototypes for the usbh_hid_keybd.c + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_HID_KEYBD_H +#define USBH_HID_KEYBD_H + +#include "usb_conf.h" +#include "usbh_hid_core.h" + +//#define AZERTY_KEYBOARD +#define QWERTY_KEYBOARD + +#define KBD_LEFT_CTRL 0x01U +#define KBD_LEFT_SHIFT 0x02U +#define KBD_LEFT_ALT 0x04U +#define KBD_LEFT_GUI 0x08U +#define KBD_RIGHT_CTRL 0x10U +#define KBD_RIGHT_SHIFT 0x20U +#define KBD_RIGHT_ALT 0x40U +#define KBD_RIGHT_GUI 0x80U + +#define KBR_MAX_NBR_PRESSED 6U + +extern hid_proc HID_KEYBRD_cb; + +/* function declarations */ +/* init keyboard window */ +void usr_keybrd_init (void); +/* process keyboard data */ +void usr_keybrd_process_data (uint8_t pbuf); + +#endif /* USBH_HID_KEYBD_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_mouse.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_mouse.h new file mode 100644 index 0000000..f41ce83 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_hid_mouse.h @@ -0,0 +1,79 @@ +/*! + \file usbh_hid_mouse.h + \brief this file contains all the prototypes for the usbh_hid_mouse.c + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_HID_MOUSE_H +#define USBH_HID_MOUSE_H + +#include "usbh_hid_core.h" + +/* Left Button: Report data: 0x00*/ +#define HID_MOUSE_LEFTBUTTON 0x00 + +/* Right Button: Report data: 0x01*/ +#define HID_MOUSE_RIGHTBUTTON 0x01 + +/* Middle Button: Report data: 0x02*/ +#define HID_MOUSE_MIDDLEBUTTON 0x02 + +#define MOUSE_WINDOW_X 190 +#define MOUSE_WINDOW_Y 40 +#define MOUSE_WINDOW_X_MAX 181 +#define MOUSE_WINDOW_Y_MIN 101 +#define MOUSE_WINDOW_HEIGHT 110 +#define MOUSE_WINDOW_WIDTH 240 + +typedef struct +{ + uint8_t x; + uint8_t y; + uint8_t z; /* not supported */ + uint8_t button; +}hid_mouse_data_struct; + +extern hid_proc hid_mouse_cb; +extern hid_mouse_data_struct hid_mouse_data; + +/* function declarations */ +/* init mouse window */ +void usr_mouse_init (void); +/* process mouse data */ +void usr_mouse_process_data (hid_mouse_data_struct *data); + +void hid_mouse_update_position (int8_t X, int8_t Y); + +void hid_mouse_button_released (uint8_t ButtonIdx); + +void hid_mouse_button_pressed (uint8_t ButtonIdx); + +#endif /* USBH_HID_MOUSE_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_usr.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_usr.h new file mode 100644 index 0000000..8f11561 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Include/usbh_usr.h @@ -0,0 +1,83 @@ +/*! + \file usbh_usr.h + \brief user application layer header file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_USR_H +#define USBH_USR_H + +#include "usbh_core.h" +#include "usbh_hid_core.h" +#include "usb_conf.h" +#include + +extern usbh_user_cb user_callback_funs; + +/* function declarations */ +/* user operation for host-mode initialization */ +void usbh_user_init (void); +/* de-int user state and associated variables */ +void usbh_user_deinit (void); +/* user operation for device attached */ +void usbh_user_device_connected (void); +/* user operation for reset USB Device */ +void usbh_user_device_reset (void); +/* user operation for device disconnect event */ +void usbh_user_device_disconnected (void); +/* user operation for device overcurrent detection event */ +void usbh_user_over_current_detected (void); +/* user operation for detectting device speed */ +void usbh_user_device_speed_detected (uint32_t DeviceSpeed); +/* user operation when device descriptor is available */ +void usbh_user_device_descavailable (void *dev_desc); +/* USB device is successfully assigned the address */ +void usbh_user_device_address_assigned (void); +/* user operation when configuration descriptor is available */ +void usbh_user_configuration_descavailable (usb_desc_config *cfgDesc, + usb_desc_itf *itfDesc, + usb_desc_ep *epDesc); +/* user operation when manufacturer string exists */ +void usbh_user_manufacturer_string (void *mfc_string); +/* user operation when product string exists */ +void usbh_user_product_string (void *prod_string); +/* user operatin when serialNum string exists */ +void usbh_user_serialnum_string (void *serialnum_string); +/* user response request is displayed to ask for application jump to class */ +void usbh_user_enumeration_finish (void); +/* user action for application state entry */ +usbh_user_status usbh_user_userinput (void); +/* user operation when device is not supported */ +void usbh_user_device_not_supported (void); +/* user operation when unrecoveredError happens */ +void usbh_user_unrecovered_error (void); + +#endif /* USBH_USR_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/app.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/app.c new file mode 100644 index 0000000..2b52137 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/app.c @@ -0,0 +1,79 @@ +/*! + \file main.c + \brief this file realizes the HID host + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "drv_usb_core.h" +#include "usbh_usr.h" +#include "usbh_hid_core.h" +#include "gd32vf103v_eval.h" +#include +#include +#include + + +usb_core_driver usb_hid_core; + +usbh_host usb_host = { + .class_cb = &usbh_hid_cb, + .usr_cb = &user_callback_funs +}; + +/** + * @brief Main routine for HID mouse / keyboard class application + * @param None + * @retval None + */ +int main(void) +{ + eclic_global_interrupt_enable(); + + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); + + usb_rcu_config(); + + usb_timer_init(); + + /* configure GPIO pin used for switching VBUS power and charge pump I/O */ + usb_vbus_config(); + + usbh_init (&usb_hid_core, USB_CORE_ENUM_FS, &usb_host); + + /* enable interrupts */ + usb_intr_config(); + + while (1) { + /* Host state handler */ + usbh_core_task (&usb_hid_core, &usb_host); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/gd32vf103_it.c new file mode 100644 index 0000000..1de19df --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/gd32vf103_it.c @@ -0,0 +1,63 @@ +/*! + \file gd32vf103_it.c + \brief main interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usbh_int.h" +#include "drv_usb_hw.h" +#include "gd32vf103_it.h" + +extern usb_core_driver usb_hid_core; + +extern void usb_timer_irq (void); + +/*! + \brief this function handles USBD interrupt + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_IRQHandler (void) +{ + usbh_isr (&usb_hid_core); +} + +/*! + \brief this function handles timer2 updata interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void TIMER2_IRQHandler(void) +{ + usb_timer_irq(); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/gd32vf103_usb_hw.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/gd32vf103_usb_hw.c new file mode 100644 index 0000000..7e5c736 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/gd32vf103_usb_hw.c @@ -0,0 +1,259 @@ +/*! + \file gd32vf103_usb_hw.c + \brief this file implements the board support package for the USB host library + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include +#include +#include + + +#define TIM_MSEC_DELAY 0x01 +#define TIM_USEC_DELAY 0x02 + +#define HOST_POWERSW_PORT_RCC RCU_GPIOD +#define HOST_POWERSW_PORT GPIOD +#define HOST_POWERSW_VBUS GPIO_PIN_13 + +__IO uint32_t delay_time = 0; +__IO uint32_t usbfs_prescaler = 0; +__IO uint32_t timer_prescaler = 5; + +static void hwp_time_set (uint8_t unit); +static void hwp_delay (uint32_t ntime, uint8_t unit); + +/*! + \brief configure USB clock + \param[in] none + \param[out] none + \retval none +*/ +void usb_rcu_config (void) +{ + uint32_t system_clock = rcu_clock_freq_get(CK_SYS); + + if (system_clock == 48000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1; + timer_prescaler = 3; + } else if (system_clock == 72000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1_5; + timer_prescaler = 5; + } else if (system_clock == 96000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV2; + timer_prescaler = 7; + } else { + /* reserved */ + } + + rcu_usb_clock_config(usbfs_prescaler); + rcu_periph_clock_enable(RCU_USBFS); +} + +/*! + \brief configure USB global interrupt + \param[in] none + \param[out] none + \retval none +*/ +void usb_intr_config (void) +{ + eclic_irq_enable((uint8_t)USBFS_IRQn, 1, 0); + +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + + /* enable the power module clock */ + rcu_periph_clock_enable(RCU_PMU); + + /* USB wakeup EXTI line configuration */ + exti_interrupt_flag_clear(EXTI_18); + exti_init(EXTI_18, EXTI_INTERRUPT, EXTI_TRIG_RISING); + exti_interrupt_enable(EXTI_18); + + eclic_irq_enable((uint8_t)USBFS_WKUP_IRQn, 3U, 0U); + +#endif /* USBHS_LOW_PWR_MGMT_SUPPORT */ +} + +/*! + \brief drives the VBUS signal through gpio + \param[in] state: VBUS states + \param[out] none + \retval none +*/ +void usb_vbus_drive (uint8_t state) +{ + if (0 == state) + { + /* DISABLE is needed on output of the Power Switch */ + gpio_bit_reset(HOST_POWERSW_PORT, HOST_POWERSW_VBUS); + } + else + { + /*ENABLE the Power Switch by driving the Enable LOW */ + gpio_bit_set(HOST_POWERSW_PORT, HOST_POWERSW_VBUS); + } +} + +/*! + \brief configures the GPIO for the VBUS + \param[in] none + \param[out] none + \retval none +*/ +void usb_vbus_config (void) +{ + rcu_periph_clock_enable(HOST_POWERSW_PORT_RCC); + + gpio_init(HOST_POWERSW_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, HOST_POWERSW_VBUS); + + /* by default, disable is needed on output of the power switch */ + gpio_bit_set(HOST_POWERSW_PORT, HOST_POWERSW_VBUS); + + /* Delay is need for stabilising the Vbus Low in Reset Condition, + * when Vbus=1 and Reset-button is pressed by user + */ + //usb_mdelay (1); + usb_mdelay (2); +} + +/*! + \brief initializes delay unit using Timer2 + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_init (void) +{ + rcu_periph_clock_enable(RCU_TIMER2); + + eclic_irq_enable(TIMER2_IRQn, 2, 0); +} + +/*! + \brief delay in micro seconds + \param[in] usec: value of delay required in micro seconds + \param[out] none + \retval none +*/ +void usb_udelay (const uint32_t usec) +{ + hwp_delay(usec, TIM_USEC_DELAY); +} + +/*! + \brief delay in milli seconds + \param[in] msec: value of delay required in milli seconds + \param[out] none + \retval none +*/ +void usb_mdelay (const uint32_t msec) +{ + hwp_delay(msec, TIM_MSEC_DELAY); +} + +/*! + \brief timer base IRQ + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_irq (void) +{ + if (timer_interrupt_flag_get(TIMER2, TIMER_INT_UP) != RESET){ + timer_interrupt_flag_clear(TIMER2, TIMER_INT_UP); + + if (delay_time > 0x00U){ + delay_time--; + } else { + timer_disable(TIMER2); + } + } +} + +/*! + \brief delay routine based on TIM2 + \param[in] ntime: delay Time + \param[in] unit: delay Time unit = mili sec / micro sec + \param[out] none + \retval none +*/ +static void hwp_delay(uint32_t ntime, uint8_t unit) +{ + delay_time = ntime; + hwp_time_set(unit); + + while(delay_time != 0); + + timer_disable(TIMER2); +} + +/*! + \brief configures TIM2 for delay routine based on TIM2 + \param[in] unit: msec /usec + \param[out] none + \retval none +*/ +static void hwp_time_set(uint8_t unit) +{ + timer_parameter_struct timer_basestructure; + + timer_disable(TIMER2); + timer_interrupt_disable(TIMER2, TIMER_INT_UP); + + if (unit == TIM_USEC_DELAY) { + timer_basestructure.period = 11; + } else if(unit == TIM_MSEC_DELAY) { + timer_basestructure.period = 11999; + } else { + /* no operation */ + } + + timer_basestructure.prescaler = timer_prescaler; + timer_basestructure.alignedmode = TIMER_COUNTER_EDGE; + timer_basestructure.counterdirection = TIMER_COUNTER_UP; + timer_basestructure.clockdivision = TIMER_CKDIV_DIV1; + timer_basestructure.repetitioncounter = 0; + + timer_init(TIMER2, &timer_basestructure); + + timer_interrupt_flag_clear(TIMER2, TIMER_INT_UP); + + timer_auto_reload_shadow_enable(TIMER2); + + /* timer2 interrupt enable */ + timer_interrupt_enable(TIMER2, TIMER_INT_UP); + + /* timer2 enable counter */ + timer_enable(TIMER2); +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/lcd_font.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/lcd_font.c new file mode 100644 index 0000000..b53596c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/lcd_font.c @@ -0,0 +1,711 @@ +/*! + \file lcd_font.c + \brief text fonts driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "lcd_font.h" + +unsigned char const ascii_8x16[1536] = { +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00, +0x18,0x18,0x7C,0xC6,0xC2,0xC0,0x7C,0x06,0x86,0xC6,0x7C,0x18,0x18,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xC2,0xC6,0x0C,0x18,0x30,0x60,0xC6,0x86,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0x6C,0x38,0x76,0xDC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x0C,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0C,0x00,0x00,0x00,0x00, +0x00,0x00,0x30,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6,0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0x0C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xDC,0xC0,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xDE,0xC6,0xC6,0x66,0x3A,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0xE6,0x66,0x6C,0x6C,0x78,0x78,0x6C,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xDE,0x7C,0x0C,0x0E,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x0C,0x06,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x7E,0x7E,0x5A,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x10,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0x6C,0x6C,0x38,0x38,0x6C,0x6C,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC6,0x86,0x0C,0x18,0x30,0x60,0xC2,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x06,0x02,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00,0x00, +0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, +0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0xE0,0x60,0x60,0x78,0x6C,0x66,0x66,0x66,0x66,0xDC,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC0,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x1C,0x0C,0x0C,0x3C,0x6C,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0xCC,0x78,0x00, +0x00,0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, +0x00,0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xEC,0xFE,0xD6,0xD6,0xD6,0xD6,0xD6,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0x0C,0x1E,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x76,0x62,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0x60,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x10,0x30,0x30,0xFC,0x30,0x30,0x30,0x30,0x36,0x1C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0xF8,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0xCC,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00, +0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xC6,0xFE,0x00,0x00,0x00,0x00,0x00 +}; + + + +/* ASCII Table: each character is 16 column (16dots large) and 24 raw (24 dots high) */ +const uint16_t ASCII_Table_16x24[] = +{ +/** + * @brief Space ' ' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '!' + */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '"' + */ + 0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '#' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60, + 0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318, + 0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000, +/** + * @brief '$' + */ + 0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C, + 0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C, + 0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, +/** + * @brief '%' + */ + 0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611, + 0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460, + 0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000, +/** + * @brief '&' + */ + 0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0, + 0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06, + 0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ''' + */ + 0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '(' + */ + 0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000, +/** + * @brief ')' + */ + 0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300, + 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000, +/** + * @brief '*' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '+' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ',' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, +/** + * @brief '-' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '.' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '/' + */ + 0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300, + 0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0, + 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '0' + */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C, + 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '1' + */ + 0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '2' + */ + 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800, + 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, + 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '3' + */ + 0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600, + 0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18, + 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '4' + */ + 0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60, + 0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00, + 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '5' + */ + 0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC, + 0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18, + 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '6' + */ + 0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC, + 0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '7' + */ + 0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380, + 0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030, + 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '8' + */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638, + 0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38, + 0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '9' + */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C, + 0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C, + 0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ':' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ';' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000, +/** + * @brief '<' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0, + 0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '=' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '>' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0, + 0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '?' + */ + 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00, + 0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '@' + */ + 0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411, + 0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004, + 0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'A' + */ + 0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60, + 0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C, + 0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'B' + */ + 0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C, + 0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C, + 0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'C' + */ + 0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C, + 0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'D' + */ + 0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006, + 0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06, + 0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'E' + */ + 0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'F' + */ + 0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'G' + */ + 0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003, + 0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C, + 0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'H' + */ + 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'I' + */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'J' + */ + 0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738, + 0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'K' + */ + 0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6, + 0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806, + 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'L' + */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'M' + */ + 0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836, + 0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6, + 0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'N' + */ + 0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC, + 0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C, + 0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'O' + */ + 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003, + 0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C, + 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'P' + */ + 0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'Q' + */ + 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003, + 0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C, + 0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'R' + */ + 0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806, + 0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006, + 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'S' + */ + 0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C, + 0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C, + 0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'T' + */ + 0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'U' + */ + 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818, + 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'V' + */ + 0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C, + 0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360, + 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'W' + */ + 0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366, + 0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C, + 0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'X' + */ + 0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0, + 0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C, + 0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'Y' + */ + 0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660, + 0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'Z' + */ + 0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600, + 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006, + 0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '[' + */ + 0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000, +/** + * @brief '\' + */ + 0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0, + 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300, + 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ']' + */ + 0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000, +/** + * @brief '^' + */ + 0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630, + 0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '_' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ''' + */ + 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'a' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8, + 0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C, + 0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'b' + */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8, + 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, + 0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'c' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0, + 0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30, + 0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'd' + */ + 0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0, + 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, + 0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'e' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, + 0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30, + 0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'f' + */ + 0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'g' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8, + 0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18, + 0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000, +/** + * @brief 'h' + */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8, + 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, + 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'i' + */ + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'j' + */ + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000, +/** + * @brief 'k' + */ + 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C, + 0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C, + 0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'l' + */ + 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'm' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF, + 0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, + 0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'n' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8, + 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, + 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'o' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, + 0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30, + 0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'p' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8, + 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, + 0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000, +/** + * @brief 'q' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0, + 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, + 0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000, +/** + * @brief 'r' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0, + 0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 's' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0, + 0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 't' + */ + 0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'u' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818, + 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38, + 0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'v' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18, + 0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360, + 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'w' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1, + 0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C, + 0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'x' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38, + 0x0C30, 0x0660, 0x0360, 0x0360, 0x0360, 0x0360, 0x0660, 0x0C30, + 0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'y' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830, + 0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380, + 0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000, +/** + * @brief 'z' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC, + 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, + 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '{' + */ + 0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000, +/** + * @brief '|' + */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, +/** + * @brief '}' + */ + 0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000, +/** + * @brief '~' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/lcd_log.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/lcd_log.c new file mode 100644 index 0000000..9a344a0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/lcd_log.c @@ -0,0 +1,168 @@ +/*! + \file lcd_log.c + \brief LCD log driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "lcd_log.h" +#include "string.h" + +#include "gd32vf103v_lcd_eval.h" + +uint16_t LINE; + +char_format_struct charform = { + .font = CHAR_FONT_8_16, + .direction = CHAR_DIRECTION_HORIZONTAL, + .char_color = LCD_COLOR_RED, + .bk_color = LCD_COLOR_BLACK +}; + +/*! + \brief initialize the LCD log module + \param[in] none + \param[out] none + \retval none +*/ +void lcd_log_init (void) +{ + lcd_clear(LCD_COLOR_BLACK); +} + +/*! + \brief de-initialize the LCD log module + \param[in] none + \param[out] none + \retval none +*/ +void lcd_log_deinit (void) +{ +} + +/*! + \brief display the application header (title) on the LCD screen + \param[in] p_title: pointer to the string to be displayed + \param[in] start_x: the start x position + \param[out] none + \retval none +*/ +void lcd_log_header_set (uint8_t *p_title, uint16_t start_x) +{ + uint16_t i = 0; + uint16_t str_len = strlen((const char *)p_title); + + lcd_rectangle_fill(210, 0, 240, 320, LCD_COLOR_BLUE); + + charform.bk_color = LCD_COLOR_BLUE; + + for (i = 0; i < str_len; i++) { + lcd_char_display (230, (start_x + 8 * i), p_title[i], charform); + } + +} + +/*! + \brief display the application footer (status) on the LCD screen + \param[in] p_status: pointer to the string to be displayed + \param[in] start_x: the start x position + \param[out] none + \retval none +*/ +void lcd_log_footer_set (uint8_t *p_status, uint16_t start_x) +{ + uint16_t i = 0; + uint16_t str_len = strlen((const char *)p_status); + + lcd_rectangle_fill(0, 0, 30, 320, LCD_COLOR_BLUE); + + + charform.bk_color = LCD_COLOR_BLUE; + + for (i = 0; i < str_len; i++) { + lcd_char_display (20, (start_x + 8 * i), p_status[i], charform); + } + +} + +/*! + \brief clear the text zone + \param[in] start_x: the start x position + \param[in] start_y: the start y position + \param[in] width: the width to clear text zone + \param[in] height: the heitht to clear text zone + \param[out] none + \retval none +*/ +void lcd_log_text_zone_clear(uint16_t start_x, + uint16_t start_y, + uint16_t width, + uint16_t height) +{ + lcd_rectangle_fill(start_x, start_y, width, height, LCD_COLOR_BLACK); +} + +/*! + \brief redirect the printf to the lcd + \param[in] p_str: pointer to string to be displayed + \param[in] offset: the offset to set + \param[in] char_color: the clar color to set + \param[out] none + \retval none +*/ +void lcd_log_print (uint8_t *p_str, uint16_t offset, uint16_t char_color) +{ + uint16_t i; + +#if defined(USE_HOST_MODE) && defined(USE_DEVICE_MODE) + if(LINE <= 60) + { + LINE = 190; + + lcd_rectangle_fill(60, 0, 210, 320, BLACK); + } +#else + if(LINE <= 30) + { + LINE = 190; + + lcd_rectangle_fill(30, 0, 210, 320, LCD_COLOR_BLACK); + } +#endif + + charform.bk_color = LCD_COLOR_BLACK; + charform.char_color = char_color; + + for (i = 0; i < offset; i++) { + lcd_char_display(LINE, (10 + 8 * i), *p_str++, charform); + } + + LINE -= 20; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/system_gd32vf103.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/system_gd32vf103.c new file mode 100644 index 0000000..05e5205 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/system_gd32vf103.c @@ -0,0 +1,998 @@ +/*! + \file system_gd32vf103.h + \brief RISC-V Device Peripheral Access Layer Source File for + GD32VF103 Device Series + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* This file refers the RISC-V standard, some adjustments are made according to GigaDevice chips */ + +#include "gd32vf103.h" + +/* system frequency define */ +#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */ + +/* select a system clock by uncommenting the following line */ +/* use IRC8M */ +//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000) + +/********************************************************************/ +//#define __SYSTEM_CLOCK_HXTAL (HXTAL_VALUE) +//#define __SYSTEM_CLOCK_24M_PLL_HXTAL (uint32_t)(24000000) +/********************************************************************/ + +//#define __SYSTEM_CLOCK_36M_PLL_HXTAL (uint32_t)(36000000) +//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_56M_PLL_HXTAL (uint32_t)(56000000) +//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000) +#define __SYSTEM_CLOCK_96M_PLL_HXTAL (uint32_t)(96000000) +//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000) + +#define SEL_IRC8M 0x00U +#define SEL_HXTAL 0x01U +#define SEL_PLL 0x02U + +/* set the system clock frequency and declare the system clock configuration function */ +#ifdef __SYSTEM_CLOCK_48M_PLL_IRC8M +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_IRC8M; +static void system_clock_48m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M; +static void system_clock_72m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_IRC8M; +static void system_clock_108m_irc8m(void); + +#elif defined (__SYSTEM_CLOCK_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; +static void system_clock_hxtal(void); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_24M_PLL_HXTAL; +static void system_clock_24m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_36M_PLL_HXTAL; +static void system_clock_36m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_HXTAL; +static void system_clock_48m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_56M_PLL_HXTAL; +static void system_clock_56m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL; +static void system_clock_72m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_HXTAL; +static void system_clock_96m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL; +static void system_clock_108m_hxtal(void); +#else +uint32_t SystemCoreClock = IRC8M_VALUE; +#endif /* __SYSTEM_CLOCK_48M_PLL_IRC8M */ + +/* configure the system clock */ +static void system_clock_config(void); + +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ +#ifdef __SYSTEM_CLOCK_HXTAL + system_clock_hxtal(); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) + system_clock_24m_hxtal(); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) + system_clock_36m_hxtal(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) + system_clock_48m_hxtal(); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) + system_clock_56m_hxtal(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) + system_clock_72m_hxtal(); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) + system_clock_96m_hxtal(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) + system_clock_108m_hxtal(); + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) + system_clock_48m_irc8m(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) + system_clock_72m_irc8m(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) + system_clock_108m_irc8m(); +#endif /* __SYSTEM_CLOCK_HXTAL */ +} + +/*! + \brief setup the microcontroller system, initialize the system + \param[in] none + \param[out] none + \retval none +*/ +void SystemInit(void) +{ + /* reset the RCC clock configuration to the default reset state */ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* reset SCS, AHBPSC, APB1PSC, APB2PSC, ADCPSC, CKOUT0SEL bits */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_ADCPSC_2 | RCU_CFG0_CKOUT0SEL); + + /* reset HXTALEN, CKMEN, PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + + /* Reset HXTALBPS bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* reset PLLSEL, PREDV0_LSB, PLLMF, USBFSPSC bits */ + + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_PLLMF_4); + RCU_CFG1 = 0x00000000U; + + /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x00FF0000U; + + /* Configure the System clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */ + system_clock_config(); +} + +/*! + \brief update the SystemCoreClock with current core clock retrieved from cpu registers + \param[in] none + \param[out] none + \retval none +*/ +void SystemCoreClockUpdate(void) +{ + uint32_t scss; + uint32_t pllsel, predv0sel, pllmf, ck_src; + uint32_t predv0, predv1, pll1mf; + + scss = GET_BITS(RCU_CFG0, 2, 3); + + switch (scss) + { + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + SystemCoreClock = IRC8M_VALUE; + break; + + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + + if(RCU_PLLSRC_IRC8M_DIV2 == pllsel){ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE / 2U; + }else{ + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + + if(pllmf >= 15U){ + pllmf += 1U; + }else{ + pllmf += 2U; + } + + SystemCoreClock = ck_src * pllmf; + + if(15U == pllmf){ + /* PLL source clock multiply by 6.5 */ + SystemCoreClock = ck_src * 6U + ck_src / 2U; + } + + break; + + /* IRC8M is selected as CK_SYS */ + default: + SystemCoreClock = IRC8M_VALUE; + break; + } +} + +#ifdef __SYSTEM_CLOCK_HXTAL +/*! + \brief configure the system clock to HXTAL + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select HXTAL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; + + /* wait until HXTAL is selected as system clock */ + while(0 == (RCU_CFG0 & RCU_SCSS_HXTAL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +/*! + \brief configure the system clock to 24M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_24m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 6 = 24 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +/*! + \brief configure the system clock to 36M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_36m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 9 = 36 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +/*! + \brief configure the system clock to 48M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL12); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +/*! + \brief configure the system clock to 56M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_56m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 14 = 56 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL14); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +/*! + \brief configure the system clock to 72M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL18); + + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +/*! + \brief configure the system clock to 96M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_96m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + if(HXTAL_VALUE==25000000){ + + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +/*! + \brief configure the system clock to 108M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ + +static void system_clock_108m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL27); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PREDV1_DIV5 | RCU_PLL1_MUL8 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 | RCU_PREDV1_DIV2 | RCU_PLL1_MUL20 | RCU_PLL2_MUL20); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL2 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + + } + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +/*! + \brief configure the system clock to 48M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL12; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +/*! + \brief configure the system clock to 72M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL18; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +/*! + \brief configure the system clock to 108M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL27; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_core.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_core.c new file mode 100644 index 0000000..c8a2489 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_core.c @@ -0,0 +1,492 @@ +/*! + \file usbh_hid_core.c + \brief this file implements the functions for the HID core state process + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_pipe.h" +#include "drv_usb_hw.h" +#include "usbh_hid_core.h" +#include "usbh_hid_mouse.h" +#include "usbh_hid_keybd.h" +#include + +hid_machine_struct hid_machine; + +usb_desc_hid hid_desc; +usb_desc_report hid_report; + +__IO uint8_t start_toggle = 0; + +static void usbh_hiddesc_parse (usb_desc_hid *hid_desc, uint8_t *buf); + +static void usbh_hid_itf_deinit (usb_core_driver *pudev, void *phost); + +static usbh_status usbh_hid_itf_init (usb_core_driver *pudev, void *phost); + +static usbh_status usbh_hid_handle (usb_core_driver *pudev, void *phost); + +static usbh_status usbh_hid_class_req (usb_core_driver *pudev, void *phost); + +static usbh_status usbh_hid_reportdesc_get (usb_core_driver *pudev, + usbh_host *phost, + uint16_t Len); + +static usbh_status usbh_hid_desc_get (usb_core_driver *pudev, usbh_host *phost, uint16_t Len); + +static usbh_status usbh_set_idle (usb_core_driver *pudev, + usbh_host *phost, + uint8_t Duration, + uint8_t ReportId); + +static usbh_status usbh_set_protocol (usb_core_driver *pudev, + usbh_host *phost, + uint8_t Protocol); + +usbh_class_cb usbh_hid_cb = +{ + usbh_hid_itf_init, + usbh_hid_itf_deinit, + usbh_hid_class_req, + usbh_hid_handle +}; + +/*! + \brief initialize the hid class + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_hid_itf_init (usb_core_driver *pudev, void *phost) +{ + uint8_t num = 0; + uint8_t ep_num = 0; + + usbh_host *pphost = phost; + + usbh_status status = USBH_BUSY; + + usb_desc_itf *itf_desc = &pphost->dev_prop.itf_desc[0]; + + hid_machine.state = HID_ERROR; + + if (itf_desc->bInterfaceSubClass == USB_HID_SUBCLASS_BOOT_ITF) { + /* decode bootclass protocl: mouse or keyboard */ + if (itf_desc->bInterfaceProtocol == USB_HID_PROTOCOL_KEYBOARD) { + hid_machine.proc = &HID_KEYBRD_cb; + } else if (itf_desc->bInterfaceProtocol == USB_HID_PROTOCOL_MOUSE) { + hid_machine.proc = &hid_mouse_cb; + } else { + return status; + } + + hid_machine.state = HID_IDLE; + hid_machine.ctlstate = HID_REQ_IDLE; + + hid_machine.poll = pphost->dev_prop.ep_desc[0][0].bInterval; + + if (hid_machine.poll < HID_MIN_POLL) { + hid_machine.poll = HID_MIN_POLL; + } + + /* check fo available number of endpoints */ + /* find the number of endpoints in the interface descriptor */ + /* choose the lower number in order not to overrun the buffer allocated */ + ep_num = USB_MIN(itf_desc->bNumEndpoints, USBH_MAX_EP_NUM); + + /* decode endpoint IN and OUT address from interface descriptor */ + for (num = 0; num < ep_num; num++) { + usb_desc_ep *ep_desc = &pphost->dev_prop.ep_desc[0][num]; + + uint8_t ep_addr = ep_desc->bEndpointAddress; + + hid_machine.len = ep_desc->wMaxPacketSize; + + if (ep_addr & 0x80) { + hid_machine.ep_in = ep_addr; + hid_machine.pipe_in = usbh_pipe_allocate (pudev, ep_addr); + + /* open channel for IN endpoint */ + usbh_pipe_create (pudev, + &pphost->dev_prop, + hid_machine.pipe_in, + USB_EPTYPE_INTR, + hid_machine.len); + } else { + hid_machine.ep_out = ep_addr; + hid_machine.pipe_out = usbh_pipe_allocate (pudev, ep_addr); + + /* open channel for OUT endpoint */ + usbh_pipe_create (pudev, + &pphost->dev_prop, + hid_machine.pipe_out, + USB_EPTYPE_INTR, + hid_machine.len); + } + } + + start_toggle = 0; + status = USBH_OK; + } else { + pphost->usr_cb->dev_not_supported(); + } + + return status; +} + +/*! + \brief de-initialize the host pipes used for the HID class + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[out] none + \retval operation status +*/ +void usbh_hid_itf_deinit (usb_core_driver *pudev, void *phost) +{ + if (0x00U != hid_machine.pipe_in) { + usb_pipe_halt (pudev, hid_machine.pipe_in); + + usbh_pipe_free (pudev, hid_machine.pipe_in); + + hid_machine.pipe_in = 0; /* reset the pipe as free */ + } + + if (0x00U != hid_machine.pipe_out) { + usb_pipe_halt (pudev, hid_machine.pipe_out); + + usbh_pipe_free (pudev, hid_machine.pipe_out); + + hid_machine.pipe_out = 0; /* reset the channel as free */ + } + + start_toggle = 0; +} + +/*! + \brief handle HID class requests for HID class + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_hid_class_req (usb_core_driver *pudev, void *phost) +{ + usbh_host *pphost = phost; + + usbh_status status = USBH_BUSY; + usbh_status class_req_status = USBH_BUSY; + + /* handle HID control state machine */ + switch (hid_machine.ctlstate) { + case HID_REQ_IDLE: + case HID_REQ_GET_HID_DESC: + /* get HID descriptor */ + if (usbh_hid_desc_get (pudev, pphost, USB_HID_DESC_SIZE) == USBH_OK) { + usbh_hiddesc_parse(&hid_desc, pudev->host.rx_buf); + + hid_machine.ctlstate = HID_REQ_GET_REPORT_DESC; + } + break; + + case HID_REQ_GET_REPORT_DESC: + /* get report descriptor */ + if (usbh_hid_reportdesc_get(pudev, pphost, hid_desc.wDescriptorLength) == USBH_OK) { + hid_machine.ctlstate = HID_REQ_SET_IDLE; + } + break; + + case HID_REQ_SET_IDLE: + class_req_status = usbh_set_idle (pudev, pphost, 0, 0); + + /* set idle */ + if (class_req_status == USBH_OK) { + hid_machine.ctlstate = HID_REQ_SET_PROTOCOL; + } else if(class_req_status == USBH_NOT_SUPPORTED) { + hid_machine.ctlstate = HID_REQ_SET_PROTOCOL; + } + break; + + case HID_REQ_SET_PROTOCOL: + /* set protocol */ + if (usbh_set_protocol (pudev, pphost, 0) == USBH_OK) { + hid_machine.ctlstate = HID_REQ_IDLE; + + /* all requests performed */ + status = USBH_OK; + } + break; + + default: + break; + } + + return status; +} + +/*! + \brief manage state machine for HID data transfers + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_hid_handle (usb_core_driver *pudev, void *phost) +{ + usbh_host *pphost = phost; + usbh_status status = USBH_OK; + + static uint32_t frame_count; + + switch (hid_machine.state) { + case HID_IDLE: + hid_machine.proc->Init(); + hid_machine.state = HID_SYNC; + break; + + case HID_SYNC: + /* sync with start of even frame */ + if (usb_frame_even(pudev) == TRUE) { + hid_machine.state = HID_GET_DATA; + } + break; + + case HID_GET_DATA: + + usbh_data_recev (pudev, hid_machine.buf, hid_machine.pipe_in, hid_machine.len); + + start_toggle = 1; + hid_machine.state = HID_POLL; + hid_machine.timer = usb_curframe_get (pudev); + break; + + case HID_POLL: + frame_count = usb_curframe_get (pudev); + + if ((frame_count > hid_machine.timer) && ((frame_count - hid_machine.timer) >= hid_machine.poll)) { + hid_machine.state = HID_GET_DATA; + } else if ((frame_count < hid_machine.timer) && ((frame_count + 0x3FFFU - hid_machine.timer) >= hid_machine.poll)) { + hid_machine.state = HID_GET_DATA; + } else if (usbh_urbstate_get (pudev, hid_machine.pipe_in) == URB_DONE) { + if (start_toggle == 1) { /* handle data once */ + start_toggle = 0; + hid_machine.proc->Decode(hid_machine.buf); + } + } else if (usbh_urbstate_get (pudev, hid_machine.pipe_in) == URB_STALL) { /* IN endpoint stalled */ + /* issue clear feature on interrupt in endpoint */ + if ((usbh_clrfeature (pudev, pphost, hid_machine.ep_addr, hid_machine.pipe_in)) == USBH_OK) { + /* change state to issue next in token */ + hid_machine.state = HID_GET_DATA; + } + } + break; + + default: + break; + } + + return status; +} + +/*! + \brief send get report descriptor command to the device + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] len: HID report descriptor length + \param[out] none + \retval operation status +*/ +static usbh_status usbh_hid_reportdesc_get (usb_core_driver *pudev, usbh_host *puhost, uint16_t len) +{ + usbh_status status = USBH_BUSY; + + if (puhost->control.ctl_state == CTL_IDLE) { + puhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_RECPTYPE_ITF | USB_REQTYPE_STRD, + .bRequest = USB_GET_DESCRIPTOR, + .wValue = USBH_DESC(USB_DESCTYPE_REPORT), + .wIndex = 0, + .wLength = len + }; + + usbh_ctlstate_config (puhost, pudev->host.rx_buf, len); + } + + status = usbh_ctl_handler (pudev, puhost); + + return status; +} + +/*! + \brief send get HID descriptor command to the device + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] len: HID descriptor length + \param[out] none + \retval operation status +*/ +static usbh_status usbh_hid_desc_get (usb_core_driver *pudev, usbh_host *puhost, uint16_t len) +{ + usbh_status status = USBH_BUSY; + + if (puhost->control.ctl_state == CTL_IDLE) { + puhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_RECPTYPE_ITF | USB_REQTYPE_STRD, + .bRequest = USB_GET_DESCRIPTOR, + .wValue = USBH_DESC(USB_DESCTYPE_HID), + .wIndex = 0, + .wLength = len + }; + + usbh_ctlstate_config (puhost, pudev->host.rx_buf, len); + } + + status = usbh_ctl_handler (pudev, puhost); + + return status; +} + +/*! + \brief set idle state + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] duration: duration for HID set idle request + \param[in] report_ID: targetted report ID for HID set idle request + \param[out] none + \retval operation status +*/ +static usbh_status usbh_set_idle (usb_core_driver *pudev, + usbh_host *puhost, + uint8_t duration, + uint8_t report_ID) +{ + usbh_status status = USBH_BUSY; + + if (puhost->control.ctl_state == CTL_IDLE) { + puhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_ITF | USB_REQTYPE_CLASS, + .bRequest = SET_IDLE, + .wValue = (duration << 8) | report_ID, + .wIndex = 0, + .wLength = 0 + }; + + usbh_ctlstate_config (puhost, NULL, 0); + } + + status = usbh_ctl_handler (pudev, puhost); + + return status; +} + +/*! + \brief set report + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] report_type: duration for HID set idle request + \param[in] report_ID: targetted report ID for HID set idle request + \param[in] report_len: length of data report to be send + \param[in] report_buf: report buffer + \param[out] none + \retval operation status +*/ +usbh_status usbh_set_report (usb_core_driver *pudev, + usbh_host *puhost, + uint8_t report_type, + uint8_t report_ID, + uint8_t report_len, + uint8_t *report_buf) +{ + usbh_status status = USBH_BUSY; + + if (puhost->control.ctl_state == CTL_IDLE) { + puhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_ITF | USB_REQTYPE_CLASS, + .bRequest = SET_REPORT, + .wValue = (report_type << 8) | report_ID, + .wIndex = 0, + .wLength = report_len + }; + + usbh_ctlstate_config (puhost, report_buf, report_len); + } + + status = usbh_ctl_handler (pudev, puhost); + + return status; +} + +/*! + \brief set protocol state + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] protocol: boot/report protocol + \param[out] none + \retval operation status +*/ +static usbh_status usbh_set_protocol (usb_core_driver *pudev, usbh_host *puhost, uint8_t protocol) +{ + usbh_status status = USBH_BUSY; + + if (puhost->control.ctl_state == CTL_IDLE) { + puhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_ITF | USB_REQTYPE_CLASS, + .bRequest = SET_PROTOCOL, + .wValue = !protocol, + .wIndex = 0, + .wLength = 0 + }; + + usbh_ctlstate_config (puhost, NULL, 0); + } + + status = usbh_ctl_handler (pudev, puhost); + + return status; +} + +/*! + \brief parse the HID descriptor + \param[in] hid_desc: pointer to HID descriptor + \param[in] buf: pointer to buffer where the source descriptor is available + \param[out] none + \retval operation status +*/ +static void usbh_hiddesc_parse (usb_desc_hid *hid_desc, uint8_t *buf) +{ + hid_desc->header.bLength = *(uint8_t *)(buf + 0); + hid_desc->header.bDescriptorType = *(uint8_t *)(buf + 1); + hid_desc->bcdHID = BYTE_SWAP(buf + 2); + hid_desc->bCountryCode = *(uint8_t *)(buf + 4); + hid_desc->bNumDescriptors = *(uint8_t *)(buf + 5); + hid_desc->bDescriptorType = *(uint8_t *)(buf + 6); + hid_desc->wDescriptorLength = BYTE_SWAP(buf + 7); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_keybd.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_keybd.c new file mode 100644 index 0000000..db5a3f9 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_keybd.c @@ -0,0 +1,250 @@ +/*! + \file usbh_hid_keybd.c + \brief this file is the application layer for usb host hid keyboard handling + qwerty and azerty keyboard are supported as per the selection in + usbh_hid_keybd.h + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_hid_keybd.h" +#include + +static void keybrd_init (void); +static void keybrd_decode (uint8_t *pbuf); + +hid_proc HID_KEYBRD_cb= +{ + keybrd_init, + keybrd_decode +}; + +/* LOCAL CONSTANTS */ +static const uint8_t HID_KEYBRD_Codes[] = +{ + 0, 0, 0, 0, 31, 50, 48, 33, + 19, 34, 35, 36, 24, 37, 38, 39, /* 0x00 - 0x0F */ + 52, 51, 25, 26, 17, 20, 32, 21, + 23, 49, 18, 47, 22, 46, 2, 3, /* 0x10 - 0x1F */ + 4, 5, 6, 7, 8, 9, 10, 11, + 43, 110, 15, 16, 61, 12, 13, 27, /* 0x20 - 0x2F */ + 28, 29, 42, 40, 41, 1, 53, 54, + 55, 30, 112, 113, 114, 115, 116, 117, /* 0x30 - 0x3F */ + 118, 119, 120, 121, 122, 123, 124, 125, + 126, 75, 80, 85, 76, 81, 86, 89, /* 0x40 - 0x4F */ + 79, 84, 83, 90, 95, 100, 105, 106, + 108, 93, 98, 103, 92, 97, 102, 91, /* 0x50 - 0x5F */ + 96, 101, 99, 104, 45, 129, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x60 - 0x6F */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x70 - 0x7F */ + 0, 0, 0, 0, 0, 107, 0, 56, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x80 - 0x8F */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0x90 - 0x9F */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xA0 - 0xAF */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xB0 - 0xBF */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xC0 - 0xCF */ + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, /* 0xD0 - 0xDF */ + 58, 44, 60, 127, 64, 57, 62, 128 /* 0xE0 - 0xE7 */ +}; + +#ifdef QWERTY_KEYBOARD +static const int8_t HID_KEYBRD_Key[] = +{ + '\0', '`', '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', '-', '=', '\0', '\r', + '\t', 'q', 'w', 'e', 'r', 't', 'y', 'u', + 'i', 'o', 'p', '[', ']', '\\', + '\0', 'a', 's', 'd', 'f', 'g', 'h', 'j', + 'k', 'l', ';', '\'', '\0', '\n', + '\0', '\0', 'z', 'x', 'c', 'v', 'b', 'n', + 'm', ',', '.', '/', '\0', '\0', + '\0', '\0', '\0', ' ', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '7', '4', '1', + '\0', '/', '8', '5', '2', + '0', '*', '9', '6', '3', + '.', '-', '+', '\0', '\n', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0' +}; + +static const int8_t HID_KEYBRD_ShiftKey[] = { + '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', + '_', '+', '\0', '\0', '\0', 'Q', 'W', 'E', 'R', 'T', 'Y', 'U', + 'I', 'O', 'P', '{', '}', '|', '\0', 'A', 'S', 'D', 'F', 'G', + 'H', 'J', 'K', 'L', ':', '"', '\0', '\n', '\0', '\0', 'Z', 'X', + 'C', 'V', 'B', 'N', 'M', '<', '>', '?', '\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', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' +}; + +#else + +static const int8_t HID_KEYBRD_Key[] = { + '\0', '`', '1', '2', '3', '4', '5', '6', '7', '8', '9', '0', + '-', '=', '\0', '\r', '\t', 'a', 'z', 'e', 'r', 't', 'y', 'u', + 'i', 'o', 'p', '[', ']', '\\', '\0', 'q', 's', 'd', 'f', 'g', + 'h', 'j', 'k', 'l', 'm', '\0', '\0', '\n', '\0', '\0', 'w', 'x', + 'c', 'v', 'b', 'n', ',', ';', ':', '!', '\0', '\0', '\0', '\0', + '\0', ' ', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\r', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '7', '4', '1', '\0', '/', + '8', '5', '2', '0', '*', '9', '6', '3', '.', '-', '+', '\0', + '\n', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' +}; + +static const int8_t HID_KEYBRD_ShiftKey[] = { + '\0', '~', '!', '@', '#', '$', '%', '^', '&', '*', '(', ')', '_', + '+', '\0', '\0', '\0', 'A', 'Z', 'E', 'R', 'T', 'Y', 'U', 'I', 'O', + 'P', '{', '}', '*', '\0', 'Q', 'S', 'D', 'F', 'G', 'H', 'J', 'K', + 'L', 'M', '%', '\0', '\n', '\0', '\0', 'W', 'X', 'C', 'V', 'B', 'N', + '?', '.', '/', '\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', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', + '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0', '\0' +}; +#endif + +/*! + \brief initialize the keyboard function. + \param[in] none + \param[out] none + \retval none +*/ +static void keybrd_init (void) +{ + /* call user init*/ + usr_keybrd_init(); +} + +/*! + \brief decode the pressed keys. + \param[in] pbuf: pointer to the HID IN report data buffer + \param[out] none + \retval none +*/ +static void keybrd_decode(uint8_t *pbuf) +{ + static uint8_t shift; + static uint8_t keys[KBR_MAX_NBR_PRESSED]; + static uint8_t keys_new[KBR_MAX_NBR_PRESSED]; + static uint8_t keys_last[KBR_MAX_NBR_PRESSED]; + static uint8_t key_newest; + static uint8_t nbr_keys; + static uint8_t nbr_keys_new; + static uint8_t nbr_keys_last; + uint8_t ix; + uint8_t jx; + uint8_t error; + uint8_t output; + + nbr_keys = 0U; + nbr_keys_new = 0U; + nbr_keys_last = 0U; + key_newest = 0x00U; + + /* check if shift key is pressed */ + if ((KBD_LEFT_SHIFT == pbuf[0]) || (KBD_RIGHT_SHIFT == pbuf[0])) { + shift = TRUE; + } else { + shift = FALSE; + } + + error = FALSE; + + /* check for the value of pressed key */ + for (ix = 2U; ix < 2U + KBR_MAX_NBR_PRESSED; ix++) { + if ((0x01U == pbuf[ix]) || (0x02U == pbuf[ix]) || (0x03U == pbuf[ix])) { + error = TRUE; + } + } + + if (TRUE == error) { + return; + } + + nbr_keys = 0U; + nbr_keys_new = 0U; + + for (ix = 2U; ix < 2U + KBR_MAX_NBR_PRESSED; ix++) { + if (0U != pbuf[ix]) { + keys[nbr_keys] = pbuf[ix]; + nbr_keys++; + + for (jx = 0U; jx < nbr_keys_last; jx++) { + if (pbuf[ix] == keys_last[jx]) { + break; + } + } + + if (jx == nbr_keys_last) { + keys_new[nbr_keys_new] = pbuf[ix]; + nbr_keys_new++; + } + } + } + + if (1U == nbr_keys_new) { + key_newest = keys_new[0]; + + if (TRUE == shift) { + output = (uint8_t)HID_KEYBRD_ShiftKey[HID_KEYBRD_Codes[key_newest]]; + } else { + output = (uint8_t)HID_KEYBRD_Key[HID_KEYBRD_Codes[key_newest]]; + } + + /* call user process handle */ + usr_keybrd_process_data(output); + } else { + key_newest = 0x00U; + } + + nbr_keys_last = nbr_keys; + + for (ix = 0U; ix < KBR_MAX_NBR_PRESSED; ix++) { + keys_last[ix] = keys[ix]; + } +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_mouse.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_mouse.c new file mode 100644 index 0000000..c567d16 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_hid_mouse.c @@ -0,0 +1,181 @@ +/*! + \file usbh_hid_mouse.c + \brief this file is the application layer for usb host hid mouse handling + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_hid_mouse.h" + +int16_t x_loc = 0, y_loc = 0; +int16_t prev_x = 0, prev_y = 0; + +static void mouse_init (void); +static void mouse_decode (uint8_t *data); + +extern char_format_struct charform; + +hid_mouse_data_struct hid_mouse_data; + +hid_proc hid_mouse_cb = +{ + mouse_init, + mouse_decode, +}; + +/*! + \brief init mouse state. + \param[in] none + \param[out] none + \retval none +*/ +static void mouse_init (void) +{ + /* call user init */ + usr_mouse_init(); +} + +/*! + \brief decode mouse data + \param[in] data: pointer to mouse hid data buffer + \param[out] none + \retval none +*/ +static void mouse_decode(uint8_t *data) +{ + hid_mouse_data.button = data[0]; + + hid_mouse_data.x = data[1]; + hid_mouse_data.y = data[2]; + + usr_mouse_process_data(&hid_mouse_data); +} + +/*! + \brief the function is to handle mouse button press + \param[in] button_idx : mouse button pressed + \param[out] none + \retval none +*/ +void hid_mouse_button_pressed(uint8_t button_idx) +{ + /* change the color of button pressed to indicate button press*/ + switch (button_idx) { + /* left button pressed */ + case HID_MOUSE_LEFTBUTTON: + lcd_rectangle_fill(40, 40, 70, 110, LCD_COLOR_MAGENTA); + break; + + /* right button pressed */ + case HID_MOUSE_RIGHTBUTTON: + lcd_rectangle_fill(40, 210, 70, 280, LCD_COLOR_MAGENTA); + break; + + /* middle button pressed */ + case HID_MOUSE_MIDDLEBUTTON: + lcd_rectangle_fill(40, 130, 70, 190, LCD_COLOR_MAGENTA); + break; + + default: + break; + } +} + +/*! + \brief the function is to handle mouse button release + \param[in] button_idx : mouse button released + \param[out] none + \retval none +*/ +void hid_mouse_button_released(uint8_t button_idx) +{ + /* change the color of button released to default button color*/ + switch (button_idx) { + /* left button released */ + case HID_MOUSE_LEFTBUTTON: + lcd_rectangle_fill(40, 40, 70, 110, LCD_COLOR_WHITE); + break; + + /* right button released */ + case HID_MOUSE_RIGHTBUTTON: + lcd_rectangle_fill(40, 210, 70, 280, LCD_COLOR_WHITE); + break; + + /* middle button released */ + case HID_MOUSE_MIDDLEBUTTON: + lcd_rectangle_fill(40, 130, 70, 190, LCD_COLOR_WHITE); + break; + + default: + break; + } +} + +/*! + \brief the function is to handle mouse scroll to upadte the mouse position on display window + \param[in] x: USB HID mouse X co-ordinate + \param[in] y: USB HID mouse Y co-ordinate + \param[out] none + \retval none +*/ +void hid_mouse_update_position (int8_t x, int8_t y) +{ + if ((x != 0) || (y != 0)) { + x_loc += x / 2; + y_loc += y / 2; + + if(y_loc > MOUSE_WINDOW_HEIGHT - 16) { + y_loc = MOUSE_WINDOW_HEIGHT - 16; + } + + if(x_loc > MOUSE_WINDOW_WIDTH - 8) { + x_loc = MOUSE_WINDOW_WIDTH - 8; + } + + if(y_loc < 2) { + y_loc = 2; + } + + if(x_loc < 2) { + x_loc = 2; + } + + lcd_rectangle_fill(81, 41, 190, 280, LCD_COLOR_BLACK); + + charform.char_color = LCD_COLOR_GREEN; + + lcd_char_display (MOUSE_WINDOW_X - y_loc, + MOUSE_WINDOW_Y + x_loc, + 'x', charform); + + prev_x = x_loc; + prev_y = x_loc; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_usr.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_usr.c new file mode 100644 index 0000000..3bda9f2 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/Source/usbh_usr.c @@ -0,0 +1,527 @@ +/*! + \file usbh_usr.c + \brief the user callback function definitions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "usbh_usr.h" +#include "usbh_hid_mouse.h" +#include "usbh_hid_keybd.h" +#include "lcd_log.h" +#include +#include "gd32vf103v_lcd_eval.h" + +#define SMALL_FONT_COLUMN_WIDTH 8 +#define SMALL_FONT_LINE_WIDTH 16 + +#define KYBRD_FIRST_COLUMN (uint16_t)0 +#define KYBRD_LAST_COLUMN (uint16_t)320 +#define KYBRD_FIRST_LINE (uint16_t)144 +#define KYBRD_LAST_LINE (uint16_t)40 + +uint16_t keybrd_char_xpos = 0; +uint16_t keybrd_char_ypos = 0; +uint8_t need_clear = 0; +uint8_t user_input_flag = 0; +uint8_t button_pressed_flag = 0; + +extern int16_t x_loc, y_loc; +extern __IO int16_t prev_x, prev_y; +extern uint16_t LINE; + +extern char_format_struct charform; + +/* points to the DEVICE_PROP structure of current device */ +usbh_user_cb user_callback_funs = +{ + usbh_user_init, + usbh_user_deinit, + usbh_user_device_connected, + usbh_user_device_reset, + usbh_user_device_disconnected, + usbh_user_over_current_detected, + usbh_user_device_speed_detected, + usbh_user_device_descavailable, + usbh_user_device_address_assigned, + usbh_user_configuration_descavailable, + usbh_user_manufacturer_string, + usbh_user_product_string, + usbh_user_serialnum_string, + usbh_user_enumeration_finish, + usbh_user_userinput, + NULL, + usbh_user_device_not_supported, + usbh_user_unrecovered_error +}; + +/* printf messages */ +const uint8_t MSG_HOST_INIT[] = "> Host Library Initialized."; +const uint8_t MSG_DEV_ATTACHED[] = "> Device Attached."; +const uint8_t MSG_DEV_DISCONNECTED[] = "> Device Disconnected."; +const uint8_t MSG_DEV_ENUMERATED[] = "> Enumeration completed."; +const uint8_t MSG_DEV_HIGHSPEED[] = "> High speed device detected."; +const uint8_t MSG_DEV_FULLSPEED[] = "> Full speed device detected."; +const uint8_t MSG_DEV_LOWSPEED[] = "> Low speed device detected."; +const uint8_t MSG_DEV_ERROR[] = "> Device fault."; + +const uint8_t MSG_MSC_CLASS[] = "> Mass storage device connected."; +const uint8_t MSG_HID_CLASS[] = "> HID device connected."; + +const uint8_t USB_HID_MouseStatus[] = "> HID Demo Device : Mouse."; +const uint8_t USB_HID_KeybrdStatus[] = "> HID Demo Device : Keyboard."; +const uint8_t MSG_UNREC_ERROR[] = "> UNRECOVERED ERROR STATE."; + +const uint8_t MSG_HOST_HEADER[] = "USBFS HID Host"; +const uint8_t MSG_HOST_FOOTER[] = "USB Host Library v2.0.0"; + +const uint8_t MSG_LIB_START[] = "##### USB Host library started #####"; +const uint8_t MSG_DEV_NOSUP[] = "> Device not supported."; +const uint8_t MSG_OVERCURRENT[] = "> Overcurrent detected."; +const uint8_t MSG_USE_KYBD[] = "> Use Keyboard to tape characters: "; +const uint8_t MSG_RESET_DEV[] = "> Reset the USB device."; + +const uint8_t MSG_WAIT_INPUT[] = "> Wait for user input!"; +const uint8_t MSG_USER_INPUT[] = "> User has input!"; + +/*! + \brief user operation for host-mode initialization + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_init(void) +{ + static uint8_t startup = 0; + + if (0U == startup) { + startup = 1U; + + /* configure the User key */ + gd_eval_key_init(KEY_CET, KEY_MODE_GPIO); + + exmc_lcd_init(); + + usb_mdelay(50); + + lcd_init(); + + lcd_log_init(); + + lcd_log_header_set((uint8_t *)MSG_HOST_HEADER, 80); + + lcd_log_print((uint8_t *)MSG_LIB_START, sizeof(MSG_LIB_START) - 1, LCD_COLOR_WHITE); + + charform.char_color = LCD_COLOR_RED; + + lcd_log_footer_set((uint8_t *)MSG_HOST_FOOTER, 60); + } +} + +/*! + \brief user operation for device attached + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_device_connected(void) +{ + if (need_clear != 0) { + lcd_log_text_zone_clear(30, 0, 210, 320); + + need_clear = 0; + } + + lcd_log_print((uint8_t *)MSG_DEV_ATTACHED, sizeof(MSG_DEV_ATTACHED) - 1, LCD_COLOR_WHITE); +} + +/*! + \brief user operation when unrecoveredError happens + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_unrecovered_error (void) +{ + lcd_log_print((uint8_t *)MSG_UNREC_ERROR, sizeof(MSG_UNREC_ERROR) - 1, LCD_COLOR_WHITE); +} + +/*! + \brief user operation for device disconnect event + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_device_disconnected (void) +{ + LINE = 30; + + lcd_log_text_zone_clear(30, 0, 210, 320); + + lcd_log_print((uint8_t *)MSG_DEV_DISCONNECTED, sizeof(MSG_DEV_DISCONNECTED) - 1, LCD_COLOR_WHITE); + + need_clear = 1; +} + +/*! + \brief user operation for reset USB device + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_device_reset(void) +{ + lcd_log_print((uint8_t *)MSG_RESET_DEV, sizeof(MSG_RESET_DEV) - 1, LCD_COLOR_WHITE); +} + +/*! + \brief user operation for detectting device speed + \param[in] device_speed: the device speed + \param[out] none + \retval none +*/ +void usbh_user_device_speed_detected(uint32_t device_speed) +{ + if (PORT_SPEED_HIGH == device_speed) { + lcd_log_print((uint8_t *)MSG_DEV_HIGHSPEED, sizeof(MSG_DEV_HIGHSPEED) - 1, LCD_COLOR_WHITE); + } else if (PORT_SPEED_FULL == device_speed) { + lcd_log_print((uint8_t *)MSG_DEV_FULLSPEED, sizeof(MSG_DEV_FULLSPEED) - 1, LCD_COLOR_WHITE); + } else if (PORT_SPEED_LOW == device_speed) { + lcd_log_print((uint8_t *)MSG_DEV_LOWSPEED, sizeof(MSG_DEV_LOWSPEED) - 1, LCD_COLOR_WHITE); + } else { + lcd_log_print((uint8_t *)MSG_DEV_ERROR, sizeof(MSG_DEV_ERROR) - 1, LCD_COLOR_WHITE); + } +} + +/*! + \brief user operation when device descriptor is available + \param[in] device_desc: the device descripter + \param[out] none + \retval none +*/ +void usbh_user_device_descavailable(void *device_desc) +{ + uint8_t TempStr[64], str_len = 0; + usb_desc_dev *pDevStr = device_desc; + + sprintf((char *)TempStr, "VID: %04Xh", (uint32_t)pDevStr->idVendor); + str_len = strlen((const char *)TempStr); + lcd_log_print((uint8_t *)TempStr, str_len, LCD_COLOR_WHITE); + + sprintf((char *)TempStr, "PID: %04Xh" , (uint32_t)pDevStr->idProduct); + str_len = strlen((const char *)TempStr); + lcd_log_print((uint8_t *)TempStr, str_len, LCD_COLOR_WHITE); +} + +/*! + \brief USB device is successfully assigned the address + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_device_address_assigned(void) +{ + +} + +/*! + \brief user operation when configuration descriptor is available + \param[in] cfg_desc: pointer to configuration descriptor + \param[in] itf_desc: pointer to interface descriptor + \param[in] ep_desc: pointer to endpoint descriptor + \param[out] none + \retval none +*/ +void usbh_user_configuration_descavailable(usb_desc_config *cfg_desc, + usb_desc_itf *itf_desc, + usb_desc_ep *ep_desc) +{ + usb_desc_itf *id = itf_desc; + + if (0x08U == (*id).bInterfaceClass) { + lcd_log_print((uint8_t *)MSG_MSC_CLASS, sizeof(MSG_MSC_CLASS) - 1, LCD_COLOR_WHITE); + } else if (0x03U == (*id).bInterfaceClass) { + lcd_log_print((uint8_t *)MSG_HID_CLASS, sizeof(MSG_HID_CLASS) - 1, LCD_COLOR_WHITE); + } +} + +/*! + \brief user operation when manufacturer string exists + \param[in] manufacturer_string: manufacturer string of usb device + \param[out] none + \retval none +*/ +void usbh_user_manufacturer_string(void *manufacturer_string) +{ + uint8_t TempStr[64], str_len = 0; + + sprintf((char *)TempStr, "Manufacturer: %s", (char *)manufacturer_string); + str_len = strlen((const char *)TempStr); + lcd_log_print((uint8_t *)TempStr, str_len, LCD_COLOR_WHITE); +} + +/*! + \brief user operation when product string exists + \param[in] product_string: product string of usb device + \param[out] none + \retval none +*/ +void usbh_user_product_string(void *product_string) +{ + uint8_t TempStr[64], str_len = 0; + + sprintf((char *)TempStr, "Product: %s", (char *)product_string); + str_len = strlen((const char *)TempStr); + lcd_log_print((uint8_t *)TempStr, str_len, LCD_COLOR_WHITE); +} + +/*! + \brief user operatin when serialNum string exists + \param[in] serial_num_string: serialNum string of usb device + \param[out] none + \retval none +*/ +void usbh_user_serialnum_string(void *serial_num_string) +{ + uint8_t TempStr[64], str_len = 0; + + sprintf((char *)TempStr, "Serial Number: %s", (char *)serial_num_string); + str_len = strlen((const char *)TempStr); + lcd_log_print((uint8_t *)TempStr, str_len, LCD_COLOR_WHITE); +} + +/*! + \brief user response request is displayed to ask for application jump to class + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_enumeration_finish(void) +{ + /* enumeration complete */ + uint8_t Str1[] = "To start the HID class operations: "; + uint8_t Str2[] = "Press CET Key... "; + + lcd_log_print((uint8_t *)MSG_DEV_ENUMERATED, sizeof(MSG_DEV_ENUMERATED) - 1, LCD_COLOR_WHITE); + lcd_log_print((uint8_t *)Str1, sizeof(Str1) - 1, LCD_COLOR_GREEN); + lcd_log_print((uint8_t *)Str2, sizeof(Str2) - 1, LCD_COLOR_GREEN); +} + +/*! + \brief user operation when device is not supported + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_device_not_supported(void) +{ + lcd_log_print((uint8_t *)MSG_DEV_NOSUP, sizeof(MSG_DEV_NOSUP) - 1, LCD_COLOR_WHITE); +} + +/*! + \brief user action for application state entry + \param[in] none + \param[out] none + \retval none +*/ +usbh_user_status usbh_user_userinput(void) +{ + usbh_user_status usbh_usr_status = USBH_USER_NO_RESP; + + /*key B3 is in polling mode to detect user action */ + if (SET != gd_eval_key_state_get(KEY_CET)) { + usbh_usr_status = USBH_USER_RESP_OK; + } + + return usbh_usr_status; +} + +/*! + \brief user operation for device overcurrent detection event + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_over_current_detected (void) +{ + lcd_log_print((uint8_t *)MSG_OVERCURRENT, sizeof(MSG_OVERCURRENT) - 1, LCD_COLOR_WHITE); +} + +/*! + \brief init mouse window + \param[in] none + \param[out] none + \retval none +*/ +void usr_mouse_init (void) +{ + lcd_log_print((uint8_t *)USB_HID_MouseStatus, sizeof(USB_HID_MouseStatus) - 1, LCD_COLOR_WHITE); + + lcd_rectangle_fill(30, 0, 210, 320, LCD_COLOR_BLACK); + + lcd_rectangle_draw(80, 40, 190, 280, LCD_COLOR_YELLOW); + + lcd_rectangle_fill(40, 40, 70, 110, LCD_COLOR_WHITE); + lcd_rectangle_fill(40, 130, 70, 190, LCD_COLOR_WHITE); + lcd_rectangle_fill(40, 210, 70, 280, LCD_COLOR_WHITE); + + hid_mouse_button_released(0); + hid_mouse_button_released(1); + hid_mouse_button_released(2); + + charform.char_color = LCD_COLOR_GREEN; + charform.bk_color = LCD_COLOR_BLACK; + + lcd_char_display (184, 44, 'x', charform); + + x_loc = 0; + y_loc = 0; + prev_x = 0; + prev_y = 0; +} + +/*! + \brief process mouse data + \param[in] data: mouse data to be displayed + \param[out] none + \retval none +*/ +void usr_mouse_process_data(hid_mouse_data_struct *data) +{ + uint8_t idx = 1; + static uint8_t b_state[3] = {0}; + + if ((data->x != 0) && (data->y != 0)) { + hid_mouse_update_position(data->x, data->y); + } + + for (idx = 0; idx < 3; idx ++) { + if (data->button & 1 << idx) { + if (b_state[idx] == 0) { + hid_mouse_button_pressed(idx); + b_state[idx] = 1; + } + } else { + if (b_state[idx] == 1) { + hid_mouse_button_released(idx); + b_state[idx] = 0; + } + } + } +} + +/*! + \brief init keyboard window + \param[in] none + \param[out] none + \retval none +*/ +void usr_keybrd_init (void) +{ + LINE = 190; + + lcd_rectangle_fill(30, 0, 210, 320, LCD_COLOR_BLACK); + + lcd_log_print((uint8_t *)USB_HID_KeybrdStatus, sizeof(USB_HID_KeybrdStatus) - 1, LCD_COLOR_WHITE); + + lcd_log_print((uint8_t *)MSG_USE_KYBD, sizeof(MSG_USE_KYBD) - 1, LCD_COLOR_WHITE); + + lcd_hline_draw(150, 0, 320, LCD_COLOR_GREEN, 2); + + keybrd_char_xpos = KYBRD_FIRST_LINE; + keybrd_char_ypos = KYBRD_FIRST_COLUMN; + + lcd_hline_draw(30, 0, 320, LCD_COLOR_GREEN, 2); +} + +/*! + \brief process keyboard data + \param[in] data: keyboard data to be displayed + \param[out] none + \retval none +*/ +void usr_keybrd_process_data (uint8_t data) +{ + if (data == '\n') { + keybrd_char_ypos = KYBRD_FIRST_COLUMN; + + /* increment char x position */ + keybrd_char_xpos -= SMALL_FONT_LINE_WIDTH; + } else if (data == '\r') { + /* manage deletion of charactter and upadte cursor location */ + if (keybrd_char_ypos == KYBRD_FIRST_COLUMN) { + /* first character of first line to be deleted */ + if (keybrd_char_xpos == KYBRD_FIRST_LINE) { + keybrd_char_ypos = KYBRD_FIRST_COLUMN; + } else { + keybrd_char_xpos -= SMALL_FONT_LINE_WIDTH; + keybrd_char_ypos =(KYBRD_LAST_COLUMN + SMALL_FONT_COLUMN_WIDTH); + } + } else { + keybrd_char_ypos += SMALL_FONT_COLUMN_WIDTH; + } + + charform.char_color = LCD_COLOR_BLACK; + + lcd_char_display(keybrd_char_xpos, keybrd_char_ypos, ' ', charform); + } else { + charform.char_color = LCD_COLOR_WHITE; + lcd_char_display(keybrd_char_xpos, keybrd_char_ypos, data, charform); + + /* update the cursor position on lcd */ + /* check if the y position has reached the last column*/ + if(keybrd_char_ypos == KYBRD_LAST_COLUMN) { + keybrd_char_ypos = KYBRD_FIRST_COLUMN; + + /* increment char X position */ + keybrd_char_xpos -= SMALL_FONT_LINE_WIDTH; + } else { + /* increment char Y position */ + keybrd_char_ypos += SMALL_FONT_COLUMN_WIDTH; + } + } + + if (keybrd_char_xpos <= KYBRD_LAST_LINE) { + lcd_rectangle_fill(32, 0, 144, 320, LCD_COLOR_BLACK); + + keybrd_char_xpos = KYBRD_FIRST_LINE; + } +} + +/*! + \brief deinit user state and associated variables + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_deinit(void) +{ +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/readme.txt new file mode 100644 index 0000000..7d288cc --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/HID_Host/readme.txt @@ -0,0 +1,53 @@ +/*! + \file readme.txt + \brief description of the usb host mode to control hid device + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, and it provides a description of +how to use the USBFS host peripheral on the GD32VF103V devices. + + When an USB Device is attached to the Host port, the device is enumerated and checked +whether it can support HID device, if the attached device is HID one, when the user +press the CET key, the mouse or the keyboard application is launched. + + If a mouse has been attached, moving the mouse will print the position of the mouse and +the state of botton through the serial port. + + If a keyboard has been attached, pressing the keyboard will print the state of the button +through the serial port. + +Note: In the USB Host HID class, two layouts are defined in the usbh_hid_keybd.h file + and could be used (Azerty and Querty) + //#define QWERTY_KEYBOARD + #define AZERTY_KEYBOARD + The User can eventually add his own layout by editing the HID_KEYBRD_Key array + in the usbh_hid_keybd.c file. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Eclipse/usbh_msc/.cproject b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Eclipse/usbh_msc/.cproject new file mode 100644 index 0000000..682c61d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Eclipse/usbh_msc/.cproject @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Eclipse/usbh_msc/.project b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Eclipse/usbh_msc/.project new file mode 100644 index 0000000..0610e29 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Eclipse/usbh_msc/.project @@ -0,0 +1,728 @@ + + + usbh_msc + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + Examples + 2 + virtual:/virtual + + + Firmware + 2 + virtual:/virtual + + + Utilities + 2 + virtual:/virtual + + + Examples/USBFS + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver + 2 + virtual:/virtual + + + Firmware/RSICV + 2 + virtual:/virtual + + + Utilities/gd32vf103v_eval.c + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.c + + + Utilities/gd32vf103v_eval.h + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_eval.h + + + Utilities/gd32vf103v_lcd_eval.c + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_lcd_eval.c + + + Utilities/gd32vf103v_lcd_eval.h + 1 + PARENT-6-PROJECT_LOC/Utilities/gd32vf103v_lcd_eval.h + + + Examples/USBFS/USB_Host + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Source + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/gd32vf103.h + + + Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h + + + Firmware/GD32VF103_usbfs_driver/Include + 2 + virtual:/virtual + + + Firmware/GD32VF103_usbfs_driver/Source + 2 + virtual:/virtual + + + Firmware/RSICV/drivers + 2 + virtual:/virtual + + + Firmware/RSICV/env_Eclipse + 2 + virtual:/virtual + + + Firmware/RSICV/stubs + 2 + virtual:/virtual + + + Examples/USBFS/USB_Host/MSC_Host + 2 + virtual:/virtual + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h + + + Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + + + Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_host.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_host.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h + + + Firmware/GD32VF103_usbfs_driver/Include/drv_usbh_int.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/drv_usbh_int.h + + + Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbh_core.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbh_core.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbh_enum.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbh_enum.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbh_pipe.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbh_pipe.h + + + Firmware/GD32VF103_usbfs_driver/Include/usbh_transc.h + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Include/usbh_transc.h + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usb_host.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_host.c + + + Firmware/GD32VF103_usbfs_driver/Source/drv_usbh_int.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/drv_usbh_int.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbh_core.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbh_core.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbh_enum.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbh_enum.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbh_pipe.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbh_pipe.c + + + Firmware/GD32VF103_usbfs_driver/Source/usbh_transc.c + 1 + PARENT-6-PROJECT_LOC/Firmware/GD32VF103_usbfs_driver/Source/usbh_transc.c + + + Firmware/RSICV/drivers/n200_eclic.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_eclic.h + + + Firmware/RSICV/drivers/n200_func.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.c + + + Firmware/RSICV/drivers/n200_func.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.h + + + Firmware/RSICV/drivers/n200_timer.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/n200_timer.h + + + Firmware/RSICV/drivers/riscv_bits.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_bits.h + + + Firmware/RSICV/drivers/riscv_const.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_const.h + + + Firmware/RSICV/drivers/riscv_encoding.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/drivers/riscv_encoding.h + + + Firmware/RSICV/env_Eclipse/GD32VF103x4.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103x4.lds + + + Firmware/RSICV/env_Eclipse/GD32VF103x6.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103x6.lds + + + Firmware/RSICV/env_Eclipse/GD32VF103x8.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103x8.lds + + + Firmware/RSICV/env_Eclipse/GD32VF103xB.lds + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + + + Firmware/RSICV/env_Eclipse/entry.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/entry.S + + + Firmware/RSICV/env_Eclipse/handlers.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/handlers.c + + + Firmware/RSICV/env_Eclipse/init.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/init.c + + + Firmware/RSICV/env_Eclipse/start.S + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/start.S + + + Firmware/RSICV/env_Eclipse/your_printf.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/env_Eclipse/your_printf.c + + + Firmware/RSICV/stubs/_exit.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/_exit.c + + + Firmware/RSICV/stubs/close.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/close.c + + + Firmware/RSICV/stubs/fstat.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/fstat.c + + + Firmware/RSICV/stubs/isatty.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/isatty.c + + + Firmware/RSICV/stubs/lseek.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/lseek.c + + + Firmware/RSICV/stubs/read.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/read.c + + + Firmware/RSICV/stubs/sbrk.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/sbrk.c + + + Firmware/RSICV/stubs/stub.h + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/stub.h + + + Firmware/RSICV/stubs/write.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write.c + + + Firmware/RSICV/stubs/write_hex.c + 1 + PARENT-6-PROJECT_LOC/Firmware/RISCV/stubs/write_hex.c + + + Examples/USBFS/USB_Host/MSC_Host/Include + 2 + virtual:/virtual + + + Examples/USBFS/USB_Host/MSC_Host/Source + 2 + virtual:/virtual + + + Examples/USBFS/USB_Host/MSC_Host/Include/diskio.h + 1 + PARENT-2-PROJECT_LOC/Include/diskio.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/fattime.h + 1 + PARENT-2-PROJECT_LOC/Include/fattime.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/ff.h + 1 + PARENT-2-PROJECT_LOC/Include/ff.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/ffconf.h + 1 + PARENT-2-PROJECT_LOC/Include/ffconf.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/gd32vf103_it.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_it.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/gd32vf103_libopt.h + 1 + PARENT-2-PROJECT_LOC/Include/gd32vf103_libopt.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/integer.h + 1 + PARENT-2-PROJECT_LOC/Include/integer.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/lcd_font.h + 1 + PARENT-2-PROJECT_LOC/Include/lcd_font.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/lcd_log.h + 1 + PARENT-2-PROJECT_LOC/Include/lcd_log.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/msc_bbb.h + 1 + PARENT-2-PROJECT_LOC/Include/msc_bbb.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/msc_scsi.h + 1 + PARENT-2-PROJECT_LOC/Include/msc_scsi.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/usb_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usb_conf.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/usb_msc.h + 1 + PARENT-2-PROJECT_LOC/Include/usb_msc.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/usbh_conf.h + 1 + PARENT-2-PROJECT_LOC/Include/usbh_conf.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_bbb.h + 1 + PARENT-2-PROJECT_LOC/Include/usbh_msc_bbb.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_core.h + 1 + PARENT-2-PROJECT_LOC/Include/usbh_msc_core.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_scsi.h + 1 + PARENT-2-PROJECT_LOC/Include/usbh_msc_scsi.h + + + Examples/USBFS/USB_Host/MSC_Host/Include/usbh_usr.h + 1 + PARENT-2-PROJECT_LOC/Include/usbh_usr.h + + + Examples/USBFS/USB_Host/MSC_Host/Source/app.c + 1 + PARENT-2-PROJECT_LOC/Source/app.c + + + Examples/USBFS/USB_Host/MSC_Host/Source/fattime.c + 1 + PARENT-2-PROJECT_LOC/Source/fattime.c + + + Examples/USBFS/USB_Host/MSC_Host/Source/ff.c + 1 + PARENT-2-PROJECT_LOC/Source/ff.c + + + Examples/USBFS/USB_Host/MSC_Host/Source/gd32vf103_it.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_it.c + + + Examples/USBFS/USB_Host/MSC_Host/Source/gd32vf103_usb_hw.c + 1 + PARENT-2-PROJECT_LOC/Source/gd32vf103_usb_hw.c + + + Examples/USBFS/USB_Host/MSC_Host/Source/lcd_font.c + 1 + PARENT-2-PROJECT_LOC/Source/lcd_font.c + + + Examples/USBFS/USB_Host/MSC_Host/Source/lcd_log.c + 1 + PARENT-2-PROJECT_LOC/Source/lcd_log.c + + + Examples/USBFS/USB_Host/MSC_Host/Source/system_gd32vf103.c + 1 + PARENT-2-PROJECT_LOC/Source/system_gd32vf103.c + + + Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_bbb.c + 1 + PARENT-2-PROJECT_LOC/Source/usbh_msc_bbb.c + + + Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_core.c + 1 + PARENT-2-PROJECT_LOC/Source/usbh_msc_core.c + + + Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_fatfs.c + 1 + PARENT-2-PROJECT_LOC/Source/usbh_msc_fatfs.c + + + Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_scsi.c + 1 + PARENT-2-PROJECT_LOC/Source/usbh_msc_scsi.c + + + Examples/USBFS/USB_Host/MSC_Host/Source/usbh_usr.c + 1 + PARENT-2-PROJECT_LOC/Source/usbh_usr.c + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Eclipse/usbh_msc/.settings/language.settings.xml b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Eclipse/usbh_msc/.settings/language.settings.xml new file mode 100644 index 0000000..d5f8aa4 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Eclipse/usbh_msc/.settings/language.settings.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/diskio.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/diskio.h new file mode 100644 index 0000000..26fe9cd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/diskio.h @@ -0,0 +1,68 @@ +/*----------------------------------------------------------------------- +/ Low level disk interface modlue include file R0.07 (C)ChaN, 2009 +/-----------------------------------------------------------------------*/ + +#ifndef _DISKIO + +#define _READONLY 0 /* 1: Read-only mode */ +#define _USE_IOCTL 1 + +#include "integer.h" + +/* Status of Disk Functions */ +typedef BYTE DSTATUS; + +/* Results of Disk Functions */ +typedef enum { + RES_OK = 0, /* 0: Successful */ + RES_ERROR, /* 1: R/W Error */ + RES_WRPRT, /* 2: Write Protected */ + RES_NOTRDY, /* 3: Not Ready */ + RES_PARERR /* 4: Invalid Parameter */ +} DRESULT; + + +/*---------------------------------------*/ +/* Prototypes for disk control functions */ + +bool assign_drives (int argc, char *argv[]); +DSTATUS disk_initialize (BYTE); +DSTATUS disk_status (BYTE); +DRESULT disk_read (BYTE, BYTE*, DWORD, BYTE); +#if _READONLY == 0 +DRESULT disk_write (BYTE, const BYTE*, DWORD, BYTE); +#endif +DRESULT disk_ioctl (BYTE, BYTE, void*); + + + +/* Disk Status Bits (DSTATUS) */ + +#define STA_NOINIT 0x01 /* Drive not initialized */ +#define STA_NODISK 0x02 /* No medium in the drive */ +#define STA_PROTECT 0x04 /* Write protected */ + + +/* Command code for disk_ioctrl() */ + +/* Generic command */ +#define CTRL_SYNC 0 /* Mandatory for write functions */ +#define GET_SECTOR_COUNT 1 /* Mandatory for only f_mkfs() */ +#define GET_SECTOR_SIZE 2 +#define GET_BLOCK_SIZE 3 /* Mandatory for only f_mkfs() */ +#define CTRL_POWER 4 +#define CTRL_LOCK 5 +#define CTRL_EJECT 6 +/* MMC/SDC command */ +#define MMC_GET_TYPE 10 +#define MMC_GET_CSD 11 +#define MMC_GET_CID 12 +#define MMC_GET_OCR 13 +#define MMC_GET_SDSTAT 14 +/* ATA/CF command */ +#define ATA_GET_REV 20 +#define ATA_GET_MODEL 21 +#define ATA_GET_SN 22 + +#define _DISKIO +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/fattime.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/fattime.h new file mode 100644 index 0000000..94b7068 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/fattime.h @@ -0,0 +1,7 @@ +#ifndef FATTIME_H_ + +#include "integer.h" + +DWORD get_fattime (void); + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/ff.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/ff.h new file mode 100644 index 0000000..91c4b6b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/ff.h @@ -0,0 +1,596 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module include file R0.07e (C)ChaN, 2009 +/----------------------------------------------------------------------------/ +/ FatFs module is a generic FAT file system module for small embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following terms. +/ +/ Copyright (C) 2009, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial product UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/----------------------------------------------------------------------------*/ + +#ifndef _FATFS +#define _FATFS 0x007E + +#include "integer.h" /* Basic integer types */ +#include "ffconf.h" /* FatFs configuration options */ + +#if _FATFS != _FFCONFIG +#error Wrong configuration file (ffconf.h). +#endif + + +/* DBCS code ranges and SBCS extend char conversion table */ + +#if _CODE_PAGE == 932 /* Japanese Shift-JIS */ +#define _DF1S 0x81 /* DBC 1st byte range 1 start */ +#define _DF1E 0x9F /* DBC 1st byte range 1 end */ +#define _DF2S 0xE0 /* DBC 1st byte range 2 start */ +#define _DF2E 0xFC /* DBC 1st byte range 2 end */ +#define _DS1S 0x40 /* DBC 2nd byte range 1 start */ +#define _DS1E 0x7E /* DBC 2nd byte range 1 end */ +#define _DS2S 0x80 /* DBC 2nd byte range 2 start */ +#define _DS2E 0xFC /* DBC 2nd byte range 2 end */ + +#elif _CODE_PAGE == 936 /* Simplified Chinese GBK */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0x80 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 949 /* Korean */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x41 +#define _DS1E 0x5A +#define _DS2S 0x61 +#define _DS2E 0x7A +#define _DS3S 0x81 +#define _DS3E 0xFE + +#elif _CODE_PAGE == 950 /* Traditional Chinese Big5 */ +#define _DF1S 0x81 +#define _DF1E 0xFE +#define _DS1S 0x40 +#define _DS1E 0x7E +#define _DS2S 0xA1 +#define _DS2E 0xFE + +#elif _CODE_PAGE == 437 /* U.S. (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0x41,0x8E,0x41,0x8F,0x80,0x45,0x45,0x45,0x49,0x49,0x49,0x8E,0x8F,0x90,0x92,0x92,0x4F,0x99,0x4F,0x55,0x55,0x59,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 720 /* Arabic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x45,0x41,0x84,0x41,0x86,0x43,0x45,0x45,0x45,0x49,0x49,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x49,0x49,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 737 /* Greek (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x92,0x92,0x93,0x94,0x95,0x96,0x97,0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87, \ + 0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0xAA,0x92,0x93,0x94,0x95,0x96,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x97,0xEA,0xEB,0xEC,0xE4,0xED,0xEE,0xE7,0xE8,0xF1,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 775 /* Baltic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x91,0xA0,0x8E,0x95,0x8F,0x80,0xAD,0xED,0x8A,0x8A,0xA1,0x8D,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0x95,0x96,0x97,0x97,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xE0,0xA3,0xA3,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xB5,0xB6,0xB7,0xB8,0xBD,0xBE,0xC6,0xC7,0xA5,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE3,0xE8,0xE8,0xEA,0xEA,0xEE,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 850 /* Multilingual Latin 1 (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 852 /* Latin 2 (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xDE,0x8F,0x80,0x9D,0xD3,0x8A,0x8A,0xD7,0x8D,0x8E,0x8F,0x90,0x91,0x91,0xE2,0x99,0x95,0x95,0x97,0x97,0x99,0x9A,0x9B,0x9B,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA4,0xA4,0xA6,0xA6,0xA8,0xA8,0xAA,0x8D,0xAC,0xB8,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBD,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC6,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD2,0xD5,0xD6,0xD7,0xB7,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE3,0xD5,0xE6,0xE6,0xE8,0xE9,0xE8,0xEB,0xED,0xED,0xDD,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xEB,0xFC,0xFC,0xFE,0xFF} + +#elif _CODE_PAGE == 855 /* Cyrillic (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x81,0x81,0x83,0x83,0x85,0x85,0x87,0x87,0x89,0x89,0x8B,0x8B,0x8D,0x8D,0x8F,0x8F,0x91,0x91,0x93,0x93,0x95,0x95,0x97,0x97,0x99,0x99,0x9B,0x9B,0x9D,0x9D,0x9F,0x9F, \ + 0xA1,0xA1,0xA3,0xA3,0xA5,0xA5,0xA7,0xA7,0xA9,0xA9,0xAB,0xAB,0xAD,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB6,0xB6,0xB8,0xB8,0xB9,0xBA,0xBB,0xBC,0xBE,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD3,0xD3,0xD5,0xD5,0xD7,0xD7,0xDD,0xD9,0xDA,0xDB,0xDC,0xDD,0xE0,0xDF, \ + 0xE0,0xE2,0xE2,0xE4,0xE4,0xE6,0xE6,0xE8,0xE8,0xEA,0xEA,0xEC,0xEC,0xEE,0xEE,0xEF,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF8,0xFA,0xFA,0xFC,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 857 /* Turkish (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0x98,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x98,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9E, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA6,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xDE,0x59,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 858 /* Multilingual Latin 1 + Euro (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x9A,0x90,0xB6,0x8E,0xB7,0x8F,0x80,0xD2,0xD3,0xD4,0xD8,0xD7,0xDE,0x8E,0x8F,0x90,0x92,0x92,0xE2,0x99,0xE3,0xEA,0xEB,0x59,0x99,0x9A,0x9D,0x9C,0x9D,0x9E,0x9F, \ + 0xB5,0xD6,0xE0,0xE9,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC7,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD1,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE5,0xE5,0xE6,0xE7,0xE7,0xE9,0xEA,0xEB,0xED,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 862 /* Hebrew (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x41,0x49,0x4F,0x55,0xA5,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0x21,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 866 /* Russian (OEM) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x90,0x91,0x92,0x93,0x9d,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F,0xF0,0xF0,0xF2,0xF2,0xF4,0xF4,0xF6,0xF6,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 874 /* Thai (OEM, Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1250 /* Central Europe (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xA3,0xB4,0xB5,0xB6,0xB7,0xB8,0xA5,0xAA,0xBB,0xBC,0xBD,0xBC,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} + +#elif _CODE_PAGE == 1251 /* Cyrillic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x82,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x80,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x8D,0x8E,0x8F, \ + 0xA0,0xA2,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB2,0xA5,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xA3,0xBD,0xBD,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF} + +#elif _CODE_PAGE == 1252 /* Latin 1 (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0xAd,0x9B,0x8C,0x9D,0xAE,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} + +#elif _CODE_PAGE == 1253 /* Greek (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xA2,0xB8,0xB9,0xBA, \ + 0xE0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xFB,0xBC,0xFD,0xBF,0xFF} + +#elif _CODE_PAGE == 1254 /* Turkish (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x8A,0x9B,0x8C,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0x9F} + +#elif _CODE_PAGE == 1255 /* Hebrew (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xE0,0xE1,0xE2,0xE3,0xE4,0xE5,0xE6,0xE7,0xE8,0xE9,0xEA,0xEB,0xEC,0xED,0xEE,0xEF,0xF0,0xF1,0xF2,0xF3,0xF4,0xF5,0xF6,0xF7,0xF8,0xF9,0xFA,0xFB,0xFC,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1256 /* Arabic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x8C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0x41,0xE1,0x41,0xE3,0xE4,0xE5,0xE6,0x43,0x45,0x45,0x45,0x45,0xEC,0xED,0x49,0x49,0xF0,0xF1,0xF2,0xF3,0x4F,0xF5,0xF6,0xF7,0xF8,0x55,0xFA,0x55,0x55,0xFD,0xFE,0xFF} + +#elif _CODE_PAGE == 1257 /* Baltic (Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0x9C,0x9D,0x9E,0x9F, \ + 0xA0,0xA1,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xA8,0xB9,0xAA,0xBB,0xBC,0xBD,0xBE,0xAF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xFF} + +#elif _CODE_PAGE == 1258 /* Vietnam (OEM, Windows) */ +#define _DF1S 0 +#define _EXCVT {0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,0x88,0x89,0x8A,0x8B,0x8C,0x8D,0x8E,0x8F,0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,0x98,0x99,0x9A,0x9B,0xAC,0x9D,0x9E,0x9F, \ + 0xA0,0x21,0xA2,0xA3,0xA4,0xA5,0xA6,0xA7,0xA8,0xA9,0xAA,0xAB,0xAC,0xAD,0xAE,0xAF,0xB0,0xB1,0xB2,0xB3,0xB4,0xB5,0xB6,0xB7,0xB8,0xB9,0xBA,0xBB,0xBC,0xBD,0xBE,0xBF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xCC,0xCD,0xCE,0xCF,0xD0,0xD1,0xD2,0xD3,0xD4,0xD5,0xD6,0xD7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xDE,0xDF, \ + 0xC0,0xC1,0xC2,0xC3,0xC4,0xC5,0xC6,0xC7,0xC8,0xC9,0xCA,0xCB,0xEC,0xCD,0xCE,0xCF,0xD0,0xD1,0xF2,0xD3,0xD4,0xD5,0xD6,0xF7,0xD8,0xD9,0xDA,0xDB,0xDC,0xDD,0xFE,0x9F} + +#elif _CODE_PAGE == 1 /* ASCII (for only non-LFN cfg) */ +#define _DF1S 0 + +#else +#error Unknown code page + +#endif + + + +/* Character code support macros */ + +#define IsUpper(c) (((c)>='A')&&((c)<='Z')) +#define IsLower(c) (((c)>='a')&&((c)<='z')) + +#if _DF1S /* DBCS configuration */ + +#ifdef _DF2S /* Two 1st byte areas */ +#define IsDBCS1(c) (((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) || ((BYTE)(c) >= _DF2S && (BYTE)(c) <= _DF2E)) +#else /* One 1st byte area */ +#define IsDBCS1(c) ((BYTE)(c) >= _DF1S && (BYTE)(c) <= _DF1E) +#endif + +#ifdef _DS3S /* Three 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E) || ((BYTE)(c) >= _DS3S && (BYTE)(c) <= _DS3E)) +#else /* Two 2nd byte areas */ +#define IsDBCS2(c) (((BYTE)(c) >= _DS1S && (BYTE)(c) <= _DS1E) || ((BYTE)(c) >= _DS2S && (BYTE)(c) <= _DS2E)) +#endif + +#else /* SBCS configuration */ + +#define IsDBCS1(c) 0 +#define IsDBCS2(c) 0 + +#endif /* _DF1S */ + + + +/* Definitions corresponds to multi partition */ + +#if _MULTI_PARTITION /* Multiple partition configuration */ + +typedef struct _PARTITION { + BYTE pd; /* Physical drive# */ + BYTE pt; /* Partition # (0-3) */ +} PARTITION; + +extern +const PARTITION Drives[]; /* Logical drive# to physical location conversion table */ +#define LD2PD(drv) (Drives[drv].pd) /* Get physical drive# */ +#define LD2PT(drv) (Drives[drv].pt) /* Get partition# */ + +#else /* Single partition configuration */ + +#define LD2PD(drv) (drv) /* Physical drive# is equal to the logical drive# */ +#define LD2PT(drv) 0 /* Always mounts the 1st partition */ + +#endif + + + +/* Definitions corresponds to multiple sector size */ + +#if _MAX_SS == 512 /* Single sector size */ +#define SS(fs) 512U + +#elif _MAX_SS == 1024 || _MAX_SS == 2048 || _MAX_SS == 4096 /* Multiple sector size */ +#define SS(fs) ((fs)->s_size) + +#else +#error Sector size must be 512, 1024, 2048 or 4096. + +#endif + + + +/* Type of file name on FatFs API */ + +#if _LFN_UNICODE && _USE_LFN +typedef WCHAR XCHAR; /* Unicode */ +#else +typedef char XCHAR; /* SBCS, DBCS */ +#endif + + + +/* File system object structure */ + +typedef struct _FATFS_ { + BYTE fs_type; /* FAT sub type */ + BYTE drive; /* Physical drive number */ + BYTE csize; /* Number of sectors per cluster */ + BYTE n_fats; /* Number of FAT copies */ + BYTE wflag; /* win[] dirty flag (1:must be written back) */ + BYTE fsi_flag; /* fsinfo dirty flag (1:must be written back) */ + WORD id; /* File system mount ID */ + WORD n_rootdir; /* Number of root directory entries (0 on FAT32) */ +#if _FS_REENTRANT + _SYNC_t sobj; /* Identifier of sync object */ +#endif +#if _MAX_SS != 512 + WORD s_size; /* Sector size */ +#endif +#if !_FS_READONLY + DWORD last_clust; /* Last allocated cluster */ + DWORD free_clust; /* Number of free clusters */ + DWORD fsi_sector; /* fsinfo sector */ +#endif +#if _FS_RPATH + DWORD cdir; /* Current directory (0:root)*/ +#endif + DWORD sects_fat; /* Sectors per fat */ + DWORD max_clust; /* Maximum cluster# + 1. Number of clusters is max_clust - 2 */ + DWORD fatbase; /* FAT start sector */ + DWORD dirbase; /* Root directory start sector (Cluster# on FAT32) */ + DWORD database; /* Data start sector */ + DWORD winsect; /* Current sector appearing in the win[] */ + BYTE win[_MAX_SS];/* Disk access window for Directory/FAT */ +} FATFS; + + + +/* Directory object structure */ + +typedef struct _DIR_ { + FATFS* fs; /* Pointer to the owner file system object */ + WORD id; /* Owner file system mount ID */ + WORD index; /* Current read/write index number */ + DWORD sclust; /* Table start cluster (0:Static table) */ + DWORD clust; /* Current cluster */ + DWORD sect; /* Current sector */ + BYTE* dir; /* Pointer to the current SFN entry in the win[] */ + BYTE* fn; /* Pointer to the SFN (in/out) {file[8],ext[3],status[1]} */ +#if _USE_LFN + WCHAR* lfn; /* Pointer to the LFN working buffer */ + WORD lfn_idx; /* Last matched LFN index number (0xFFFF:No LFN) */ +#endif +} DIR; + + + +/* File object structure */ + +typedef struct _FIL_ { + FATFS* fs; /* Pointer to the owner file system object */ + WORD id; /* Owner file system mount ID */ + BYTE flag; /* File status flags */ + BYTE csect; /* Sector address in the cluster */ + DWORD fptr; /* File R/W pointer */ + DWORD fsize; /* File size */ + DWORD org_clust; /* File start cluster */ + DWORD curr_clust; /* Current cluster */ + DWORD dsect; /* Current data sector */ +#if !_FS_READONLY + DWORD dir_sect; /* Sector containing the directory entry */ + BYTE* dir_ptr; /* Pointer to the directory entry in the window */ +#endif +#if !_FS_TINY + BYTE buf[_MAX_SS];/* File R/W buffer */ +#endif +} FIL; + + + +/* File status structure */ + +typedef struct _FILINFO_ { + DWORD fsize; /* File size */ + WORD fdate; /* Last modified date */ + WORD ftime; /* Last modified time */ + BYTE fattrib; /* Attribute */ + char fname[13]; /* Short file name (8.3 format) */ +#if _USE_LFN + XCHAR* lfname; /* Pointer to the LFN buffer */ + int lfsize; /* Size of LFN buffer [chrs] */ +#endif +} FILINFO; + + + +/* File function return code (FRESULT) */ + +typedef enum { + FR_OK = 0, /* 0 */ + FR_DISK_ERR, /* 1 */ + FR_INT_ERR, /* 2 */ + FR_NOT_READY, /* 3 */ + FR_NO_FILE, /* 4 */ + FR_NO_PATH, /* 5 */ + FR_INVALID_NAME, /* 6 */ + FR_DENIED, /* 7 */ + FR_EXIST, /* 8 */ + FR_INVALID_OBJECT, /* 9 */ + FR_WRITE_PROTECTED, /* 10 */ + FR_INVALID_DRIVE, /* 11 */ + FR_NOT_ENABLED, /* 12 */ + FR_NO_FILESYSTEM, /* 13 */ + FR_MKFS_ABORTED, /* 14 */ + FR_TIMEOUT /* 15 */ +} FRESULT; + + + +/*--------------------------------------------------------------*/ +/* FatFs module application interface */ + +FRESULT f_mount (BYTE, FATFS*); /* Mount/Unmount a logical drive */ +FRESULT f_open (FIL*, const XCHAR*, BYTE); /* Open or create a file */ +FRESULT f_read (FIL*, void*, UINT, UINT*); /* Read data from a file */ +FRESULT f_write (FIL*, const void*, UINT, UINT*); /* Write data to a file */ +FRESULT f_lseek (FIL*, DWORD); /* Move file pointer of a file object */ +FRESULT f_close (FIL*); /* Close an open file object */ +FRESULT f_opendir (DIR*, const XCHAR*); /* Open an existing directory */ +FRESULT f_readdir (DIR*, FILINFO*); /* Read a directory item */ +FRESULT f_stat (const XCHAR*, FILINFO*); /* Get file status */ +FRESULT f_getfree (const XCHAR*, DWORD*, FATFS**); /* Get number of free clusters on the drive */ +FRESULT f_truncate (FIL*); /* Truncate file */ +FRESULT f_sync (FIL*); /* Flush cached data of a writing file */ +FRESULT f_unlink (const XCHAR*); /* Delete an existing file or directory */ +FRESULT f_mkdir (const XCHAR*); /* Create a new directory */ +FRESULT f_chmod (const XCHAR*, BYTE, BYTE); /* Change attribute of the file/dir */ +FRESULT f_utime (const XCHAR*, const FILINFO*); /* Change time-stamp of the file/dir */ +FRESULT f_rename (const XCHAR*, const XCHAR*); /* Rename/Move a file or directory */ +FRESULT f_forward (FIL*, UINT(*)(const BYTE*,UINT), UINT, UINT*); /* Forward data to the stream */ +FRESULT f_mkfs (BYTE, BYTE, WORD); /* Create a file system on the drive */ +FRESULT f_chdir (const XCHAR*); /* Change current directory */ +FRESULT f_chdrive (BYTE); /* Change current drive */ + +#if _USE_STRFUNC +int f_putc (int, FIL*); /* Put a character to the file */ +int f_puts (const char*, FIL*); /* Put a string to the file */ +int f_printf (FIL*, const char*, ...); /* Put a formatted string to the file */ +char* f_gets (char*, int, FIL*); /* Get a string from the file */ +#define f_eof(fp) (((fp)->fptr == (fp)->fsize) ? 1 : 0) +#define f_error(fp) (((fp)->flag & FA__ERROR) ? 1 : 0) +#ifndef EOF +#define EOF -1 +#endif +#endif + + + +/*--------------------------------------------------------------*/ +/* User defined functions */ + +/* Real time clock */ +#if !_FS_READONLY +DWORD get_fattime (void); /* 31-25: Year(0-127 org.1980), 24-21: Month(1-12), 20-16: Day(1-31) */ + /* 15-11: Hour(0-23), 10-5: Minute(0-59), 4-0: Second(0-29 *2) */ +#endif + +/* Unicode - OEM code conversion */ +#if _USE_LFN +WCHAR ff_convert (WCHAR, UINT); +WCHAR ff_wtoupper (WCHAR); +#endif + +/* Sync functions */ +#if _FS_REENTRANT +BOOL ff_cre_syncobj(BYTE, _SYNC_t*); +BOOL ff_del_syncobj(_SYNC_t); +BOOL ff_req_grant(_SYNC_t); +void ff_rel_grant(_SYNC_t); +#endif + + + +/*--------------------------------------------------------------*/ +/* Flags and offset address */ + + +/* File access control and file status flags (FIL.flag) */ + +#define FA_READ 0x01 +#define FA_OPEN_EXISTING 0x00 +#if _FS_READONLY == 0 +#define FA_WRITE 0x02 +#define FA_CREATE_NEW 0x04 +#define FA_CREATE_ALWAYS 0x08 +#define FA_OPEN_ALWAYS 0x10 +#define FA__WRITTEN 0x20 +#define FA__DIRTY 0x40 +#endif +#define FA__ERROR 0x80 + + +/* FAT sub type (FATFS.fs_type) */ + +#define FS_FAT12 1 +#define FS_FAT16 2 +#define FS_FAT32 3 + + +/* File attribute bits for directory entry */ + +#define AM_RDO 0x01 /* Read only */ +#define AM_HID 0x02 /* Hidden */ +#define AM_SYS 0x04 /* System */ +#define AM_VOL 0x08 /* Volume label */ +#define AM_LFN 0x0F /* LFN entry */ +#define AM_DIR 0x10 /* Directory */ +#define AM_ARC 0x20 /* Archive */ +#define AM_MASK 0x3F /* Mask of defined bits */ + + +/* FatFs refers the members in the FAT structures with byte offset instead +/ of structure member because there are incompatibility of the packing option +/ between various compilers. */ + +#define BS_jmpBoot 0 +#define BS_OEMName 3 +#define BPB_BytsPerSec 11 +#define BPB_SecPerClus 13 +#define BPB_RsvdSecCnt 14 +#define BPB_NumFATs 16 +#define BPB_RootEntCnt 17 +#define BPB_TotSec16 19 +#define BPB_Media 21 +#define BPB_FATSz16 22 +#define BPB_SecPerTrk 24 +#define BPB_NumHeads 26 +#define BPB_HiddSec 28 +#define BPB_TotSec32 32 +#define BS_55AA 510 + +#define BS_DrvNum 36 +#define BS_BootSig 38 +#define BS_VolID 39 +#define BS_VolLab 43 +#define BS_FilSysType 54 + +#define BPB_FATSz32 36 +#define BPB_ExtFlags 40 +#define BPB_FSVer 42 +#define BPB_RootClus 44 +#define BPB_FSInfo 48 +#define BPB_BkBootSec 50 +#define BS_DrvNum32 64 +#define BS_BootSig32 66 +#define BS_VolID32 67 +#define BS_VolLab32 71 +#define BS_FilSysType32 82 + +#define FSI_LeadSig 0 +#define FSI_StrucSig 484 +#define FSI_Free_Count 488 +#define FSI_Nxt_Free 492 + +#define MBR_Table 446 + +#define DIR_Name 0 +#define DIR_Attr 11 +#define DIR_NTres 12 +#define DIR_CrtTime 14 +#define DIR_CrtDate 16 +#define DIR_FstClusHI 20 +#define DIR_WrtTime 22 +#define DIR_WrtDate 24 +#define DIR_FstClusLO 26 +#define DIR_FileSize 28 +#define LDIR_Ord 0 +#define LDIR_Attr 11 +#define LDIR_Type 12 +#define LDIR_Chksum 13 +#define LDIR_FstClusLO 26 + + + +/*--------------------------------*/ +/* Multi-byte word access macros */ + +#if _WORD_ACCESS == 1 /* Enable word access to the FAT structure */ +#define LD_WORD(ptr) (WORD)(*(WORD*)(BYTE*)(ptr)) +#define LD_DWORD(ptr) (DWORD)(*(DWORD*)(BYTE*)(ptr)) +#define ST_WORD(ptr,val) *(WORD*)(BYTE*)(ptr)=(WORD)(val) +#define ST_DWORD(ptr,val) *(DWORD*)(BYTE*)(ptr)=(DWORD)(val) +#else /* Use byte-by-byte access to the FAT structure */ +#define LD_WORD(ptr) (WORD)(((WORD)*(BYTE*)((ptr)+1)<<8)|(WORD)*(BYTE*)(ptr)) +#define LD_DWORD(ptr) (DWORD)(((DWORD)*(BYTE*)((ptr)+3)<<24)|((DWORD)*(BYTE*)((ptr)+2)<<16)|((WORD)*(BYTE*)((ptr)+1)<<8)|*(BYTE*)(ptr)) +#define ST_WORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8) +#define ST_DWORD(ptr,val) *(BYTE*)(ptr)=(BYTE)(val); *(BYTE*)((ptr)+1)=(BYTE)((WORD)(val)>>8); *(BYTE*)((ptr)+2)=(BYTE)((DWORD)(val)>>16); *(BYTE*)((ptr)+3)=(BYTE)((DWORD)(val)>>24) +#endif + + +#endif /* _FATFS */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/ffconf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/ffconf.h new file mode 100644 index 0000000..8154888 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/ffconf.h @@ -0,0 +1,166 @@ +/*---------------------------------------------------------------------------/ +/ FatFs - FAT file system module configuration file R0.07e (C)ChaN, 2009 +/----------------------------------------------------------------------------/ +/ +/ CAUTION! Do not forget to make clean the project after any changes to +/ the configuration options. +/ +/----------------------------------------------------------------------------*/ +#ifndef _FFCONFIG +#define _FFCONFIG 0x007E + + +/*---------------------------------------------------------------------------/ +/ Function and Buffer Configurations +/----------------------------------------------------------------------------*/ + +#define _FS_TINY 0 /* 0 or 1 */ +/* When _FS_TINY is set to 1, FatFs uses the sector buffer in the file system +/ object instead of the sector buffer in the individual file object for file +/ data transfer. This reduces memory consumption 512 bytes each file object. */ + + +#define _FS_READONLY 0 /* 0 or 1 */ +/* Setting _FS_READONLY to 1 defines read only configuration. This removes +/ writing functions, f_write, f_sync, f_unlink, f_mkdir, f_chmod, f_rename, +/ f_truncate and useless f_getfree. */ + + +#define _FS_MINIMIZE 0 /* 0, 1, 2 or 3 */ +/* The _FS_MINIMIZE option defines minimization level to remove some functions. +/ +/ 0: Full function. +/ 1: f_stat, f_getfree, f_unlink, f_mkdir, f_chmod, f_truncate and f_rename +/ are removed. +/ 2: f_opendir and f_readdir are removed in addition to level 1. +/ 3: f_lseek is removed in addition to level 2. */ + + +#define _USE_STRFUNC 2 /* 0, 1 or 2 */ +/* To enable string functions, set _USE_STRFUNC to 1 or 2. */ + + +#define _USE_MKFS 1 /* 0 or 1 */ +/* To enable f_mkfs function, set _USE_MKFS to 1 and set _FS_READONLY to 0 */ + + +#define _USE_FORWARD 0 /* 0 or 1 */ +/* To enable f_forward function, set _USE_FORWARD to 1 and set _FS_TINY to 1. */ + + + +/*---------------------------------------------------------------------------/ +/ Locale and Namespace Configurations +/----------------------------------------------------------------------------*/ + +#define _CODE_PAGE 1252 +/* The _CODE_PAGE specifies the OEM code page to be used on the target system. +/ Incorrect setting of the code page can cause a file open failure. +/ +/ 932 - Japanese Shift-JIS (DBCS, OEM, Windows) +/ 936 - Simplified Chinese GBK (DBCS, OEM, Windows) +/ 949 - Korean (DBCS, OEM, Windows) +/ 950 - Traditional Chinese Big5 (DBCS, OEM, Windows) +/ 1250 - Central Europe (Windows) +/ 1251 - Cyrillic (Windows) +/ 1252 - Latin 1 (Windows) +/ 1253 - Greek (Windows) +/ 1254 - Turkish (Windows) +/ 1255 - Hebrew (Windows) +/ 1256 - Arabic (Windows) +/ 1257 - Baltic (Windows) +/ 1258 - Vietnam (OEM, Windows) +/ 437 - U.S. (OEM) +/ 720 - Arabic (OEM) +/ 737 - Greek (OEM) +/ 775 - Baltic (OEM) +/ 850 - Multilingual Latin 1 (OEM) +/ 858 - Multilingual Latin 1 + Euro (OEM) +/ 852 - Latin 2 (OEM) +/ 855 - Cyrillic (OEM) +/ 866 - Russian (OEM) +/ 857 - Turkish (OEM) +/ 862 - Hebrew (OEM) +/ 874 - Thai (OEM, Windows) +/ 1 - ASCII only (Valid for non LFN cfg.) +*/ + + +#define _USE_LFN 0 /* 0, 1 or 2 */ +#define _MAX_LFN 255 /* Maximum LFN length to handle (12 to 255) */ +/* The _USE_LFN option switches the LFN support. +/ +/ 0: Disable LFN. _MAX_LFN and _LFN_UNICODE have no effect. +/ 1: Enable LFN with static working buffer on the bss. NOT REENTRANT. +/ 2: Enable LFN with dynamic working buffer on the STACK. +/ +/ The LFN working buffer occupies (_MAX_LFN + 1) * 2 bytes. When enable LFN, +/ two Unicode handling functions ff_convert() and ff_wtoupper() must be added +/ to the project. */ + + +#define _LFN_UNICODE 0 /* 0 or 1 */ +/* To switch the character code set on FatFs API to Unicode, +/ enable LFN feature and set _LFN_UNICODE to 1. +*/ + + +#define _FS_RPATH 0 /* 0 or 1 */ +/* When _FS_RPATH is set to 1, relative path feature is enabled and f_chdir, +/ f_chdrive function are available. +/ Note that output of the f_readdir function is affected by this option. */ + + + +/*---------------------------------------------------------------------------/ +/ Physical Drive Configurations +/----------------------------------------------------------------------------*/ + +#define _DRIVES 2 +/* Number of volumes (logical drives) to be used. */ + + +#define _MAX_SS 512 /* 512, 1024, 2048 or 4096 */ +/* Maximum sector size to be handled. +/ Always set 512 for memory card and hard disk but a larger value may be +/ required for floppy disk (512/1024) and optical disk (512/2048). +/ When _MAX_SS is larger than 512, GET_SECTOR_SIZE command must be implemented +/ to the disk_ioctl function. */ + + +#define _MULTI_PARTITION 0 /* 0 or 1 */ +/* When _MULTI_PARTITION is set to 0, each volume is bound to the same physical +/ drive number and can mount only first primary partition. When it is set to 1, +/ each volume is tied to the partitions listed in Drives[]. */ + + + +/*---------------------------------------------------------------------------/ +/ System Configurations +/----------------------------------------------------------------------------*/ + +#define _WORD_ACCESS 0 /* 0 or 1 */ +/* The _WORD_ACCESS option defines which access method is used to the word +/ data on the FAT volume. +/ +/ 0: Byte-by-byte access. Always compatible with all platforms. +/ 1: Word access. Do not choose this unless following condition is met. +/ +/ When the byte order on the memory is big-endian or address miss-aligned +/ word access results incorrect behavior, the _WORD_ACCESS must be set to 0. +/ If it is not the case, the value can also be set to 1 to improve the +/ performance and code size. */ + + +#define _FS_REENTRANT 0 /* 0 or 1 */ +#define _FS_TIMEOUT 1000 /* Timeout period in unit of time ticks */ +#define _SYNC_t HANDLE /* O/S dependent type of sync object. e.g. HANDLE, OS_EVENT*, ID and etc.. */ +/* The _FS_REENTRANT option switches the reentrancy of the FatFs module. +/ +/ 0: Disable reentrancy. _SYNC_t and _FS_TIMEOUT have no effect. +/ 1: Enable reentrancy. Also user provided synchronization handlers, +/ ff_req_grant, ff_rel_grant, ff_del_syncobj and ff_cre_syncobj +/ function must be added to the project. */ + + +#endif /* _FFCONFIG */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/gd32vf103_it.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/gd32vf103_it.h new file mode 100644 index 0000000..91215b6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/gd32vf103_it.h @@ -0,0 +1,46 @@ +/*! + \file gd32vf103_it.h + \brief the header file of the ISR + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_IT_H +#define GD32VF103_IT_H + +#include "gd32vf103.h" + +/* function declarations */ +/* this function handles USB wakeup interrupt handler */ +void USBFS_WKUP_IRQHandler(void); +/* this function handles USBFS IRQ Handler */ +void USBFS_IRQHandler(void); + +#endif /* GD32VF103_IT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/integer.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/integer.h new file mode 100644 index 0000000..2741b70 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/integer.h @@ -0,0 +1,46 @@ +/*-------------------------------------------*/ +/* Integer type definitions for FatFs module */ +/*-------------------------------------------*/ + +#ifndef _INTEGER + +#if 0 +#include +#else + +#include "usb_conf.h" + +/* These types must be 16-bit, 32-bit or larger integer */ +typedef int INT; +typedef unsigned int UINT; + +/* These types must be 8-bit integer */ +typedef signed char CHAR; +typedef unsigned char UCHAR; +typedef unsigned char BYTE; + +/* These types must be 16-bit integer */ +typedef short SHORT; +typedef unsigned short USHORT; +typedef unsigned short WORD; +typedef unsigned short WCHAR; + +/* These types must be 32-bit integer */ +typedef long LONG; +typedef unsigned long ULONG; +typedef unsigned long DWORD; + +/* Boolean type */ +// typedef enum { FALSE = 0, TRUE } BOOL; +#include +//typedef bool BOOL; +#ifndef FALSE +#define FALSE false +#define TRUE true +#endif + + +#endif + +#define _INTEGER +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/lcd_font.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/lcd_font.h new file mode 100644 index 0000000..00a44f2 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/lcd_font.h @@ -0,0 +1,45 @@ +/*! + \file lcd_font.h + \brief the header file of LCD font + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef LCD_FONT_H +#define LCD_FONT_H + +#include + +extern unsigned char const ascii_8x16[1536]; + +extern const uint16_t ASCII_Table_16x24[]; + +#endif /* LCD_FONT_H */ + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/lcd_log.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/lcd_log.h new file mode 100644 index 0000000..4f1fa8f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/lcd_log.h @@ -0,0 +1,52 @@ +/*! + \file lcd_log.h + \brief the header file of LCD log + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "stdint.h" +#include "lcd_font.h" + +/* initialize the LCD log module */ +void lcd_log_init (void); +/* de-initialize the LCD log module */ +void lcd_log_deinit (void); +/* display the application header (title) on the LCD screen */ +void lcd_log_header_set (uint8_t *p_title, uint16_t start_x); +/* display the application footer (status) on the LCD screen */ +void lcd_log_footer_set (uint8_t *p_status, uint16_t start_x); +/* redirect the printf to the lcd */ +void lcd_log_print (uint8_t *p_str, uint16_t offset, uint16_t char_color); +/* clear the text zone */ +void lcd_log_text_zone_clear (uint16_t start_x, + uint16_t start_y, + uint16_t width, + uint16_t height); diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/msc_bbb.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/msc_bbb.h new file mode 100644 index 0000000..0e2e171 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/msc_bbb.h @@ -0,0 +1,69 @@ +/*! + \file msc_bbb.h + \brief definitions for the USB MSC BBB(bulk/bulk/bulk) protocol + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __MSC_BBB_H +#define __MSC_BBB_H + +#include "usb_ch9_std.h" + +#define BBB_CBW_SIGNATURE 0x43425355U +#define BBB_CSW_SIGNATURE 0x53425355U +#define BBB_CBW_LENGTH 31U +#define BBB_CSW_LENGTH 13U + +typedef struct { + uint32_t dCBWSignature; + uint32_t dCBWTag; + uint32_t dCBWDataTransferLength; + uint8_t bmCBWFlags; + uint8_t bCBWLUN; + uint8_t bCBWCBLength; + uint8_t CBWCB[16]; +}msc_bbb_cbw; + +typedef struct { + uint32_t dCSWSignature; + uint32_t dCSWTag; + uint32_t dCSWDataResidue; + uint8_t bCSWStatus; +}msc_bbb_csw; + +/* CSW command status */ +enum msc_csw_status { + CSW_CMD_PASSED = 0, + CSW_CMD_FAILED, + CSW_PHASE_ERROR +}; + +#endif /* __MSC_BBB_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/msc_scsi.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/msc_scsi.h new file mode 100644 index 0000000..359aea6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/msc_scsi.h @@ -0,0 +1,117 @@ +/*! + \file msc_scsi.h + \brief definitions for the USB MSC SCSI commands + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __MSC_SCSI_H +#define __MSC_SCSI_H + +#include "usb_ch9_std.h" + +/* SCSI commands */ +#define SCSI_FORMAT_UNIT 0x04U +#define SCSI_INQUIRY 0x12U +#define SCSI_MODE_SELECT6 0x15U +#define SCSI_MODE_SELECT10 0x55U +#define SCSI_MODE_SENSE6 0x1AU +#define SCSI_READ_TOC_DATA 0x43U +#define SCSI_MODE_SENSE10 0x5AU +#define SCSI_ALLOW_MEDIUM_REMOVAL 0x1EU +#define SCSI_READ6 0x08U +#define SCSI_READ10 0x28U +#define SCSI_READ12 0xA8U +#define SCSI_READ16 0x88U + +#define SCSI_READ_CAPACITY10 0x25U +#define SCSI_READ_CAPACITY16 0x9EU + +#define SCSI_REQUEST_SENSE 0x03U +#define SCSI_START_STOP_UNIT 0x1BU +#define SCSI_TEST_UNIT_READY 0x00U +#define SCSI_WRITE6 0x0AU +#define SCSI_WRITE10 0x2AU +#define SCSI_WRITE12 0xAAU +#define SCSI_WRITE16 0x8AU + +#define SCSI_VERIFY10 0x2FU +#define SCSI_VERIFY12 0xAFU +#define SCSI_VERIFY16 0x8FU + +#define SCSI_SEND_DIAGNOSTIC 0x1DU +#define SCSI_READ_FORMAT_CAPACITIES 0x23U + +#define INVALID_CDB 0x20U +#define INVALID_FIELED_IN_COMMAND 0x24U +#define PARAMETER_LIST_LENGTH_ERROR 0x1AU +#define INVALID_FIELD_IN_PARAMETER_LIST 0x26U +#define ADDRESS_OUT_OF_RANGE 0x21U +#define MEDIUM_NOT_PRESENT 0x3AU +#define MEDIUM_HAVE_CHANGED 0x28U +#define WRITE_PROTECTED 0x27U +#define UNRECOVERED_READ_ERROR 0x11U +#define WRITE_FAULT 0x03U + +#define READ_FORMAT_CAPACITY_DATA_LEN 0x0CU +#define READ_CAPACITY10_DATA_LEN 0x08U +#define MODE_SENSE10_DATA_LEN 0x08U +#define MODE_SENSE6_DATA_LEN 0x04U +#define READ_TOC_CMD_LEN 0x14U +#define REQUEST_SENSE_DATA_LEN 0x12U +#define STANDARD_INQUIRY_DATA_LEN 0x24U +#define BLKVFY 0x04U + +enum sense_state { + NO_SENSE = 0U, + RECOVERED_ERROR, + NOT_READY, + MEDIUM_ERROR, + HARDWARE_ERROR, + ILLEGAL_REQUEST, + UNIT_ATTENTION, + DATA_PROTECT, + BLANK_CHECK, + VENDOR_SPECIFIC, + COPY_ABORTED, + ABORTED_COMMAND, + RESERVED, + VOLUME_OVERFLOW, + MISCOMPARE +}; + +typedef struct { + uint8_t SenseKey; + uint32_t Information; + uint8_t ASC; + uint8_t ASCQ; +} msc_scsi_sense; + +#endif /* __MSC_SCSI_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usb_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usb_conf.h new file mode 100644 index 0000000..3107009 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usb_conf.h @@ -0,0 +1,92 @@ +/*! + \file usb_conf.h + \brief general low level driver configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_CONF_H +#define __USB_CONF_H + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include "gd32vf103V_lcd_eval.h" + +#include + +#ifdef USE_USB_FS + #define USB_FS_CORE +#endif + +#ifdef USB_FS_CORE + #define USB_RX_FIFO_FS_SIZE 128 + #define USB_HTX_NPFIFO_FS_SIZE 96 + #define USB_HTX_PFIFO_FS_SIZE 96 +#endif + +#define USB_SOF_OUTPUT 0 +#define USB_LOW_POWER 0 + +#define USE_HOST_MODE +//#define USE_DEVICE_MODE +//#define USE_OTG_MODE + +#ifndef USB_FS_CORE + #ifndef USB_HS_CORE + #error "USB_HS_CORE or USB_FS_CORE should be defined" + #endif +#endif + +#ifndef USE_DEVICE_MODE + #ifndef USE_HOST_MODE + #error "USE_DEVICE_MODE or USE_HOST_MODE should be defined" + #endif +#endif + +#ifndef USE_USB_HS + #ifndef USE_USB_FS + #error "USE_USB_HS or USE_USB_FS should be defined" + #endif +#endif + +/****************** C Compilers dependant keywords ****************************/ +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ +#ifdef USB_OTG_HS_INTERNAL_DMA_ENABLED + #if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned(4))) + #define __ALIGN_BEGIN + #endif /* __GNUC__ */ +#else + #define __ALIGN_BEGIN + #define __ALIGN_END +#endif /* USB_OTG_HS_INTERNAL_DMA_ENABLED */ + +#endif /* __USB_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usb_msc.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usb_msc.h new file mode 100644 index 0000000..485e747 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usb_msc.h @@ -0,0 +1,66 @@ +/*! + \file usb_msc.h + \brief definitions for the USB MSC class + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_MSC_H +#define __USB_MSC_H + +#include "usb_ch9_std.h" + +/* mass storage device class code */ +#define USB_CLASS_MSC 0x08U + +/* mass storage subclass code */ +#define USB_MSC_SUBCLASS_RBC 0x01U +#define USB_MSC_SUBCLASS_ATAPI 0x02U +#define USB_MSC_SUBCLASS_UFI 0x04U +#define USB_MSC_SUBCLASS_SCSI 0x06U +#define USB_MSC_SUBCLASS_LOCKABLE 0x07U +#define USB_MSC_SUBCLASS_IEEE1667 0x08U + +/* mass storage interface class control protocol codes */ +#define USB_MSC_PROTOCOL_CBI 0x00U +#define USB_MSC_PROTOCOL_CBI_ALT 0x01U +#define USB_MSC_PROTOCOL_BBB 0x50U + +/* mass storage request codes */ +#define USB_MSC_REQ_CODES_ADSC 0x00U +#define USB_MSC_REQ_CODES_GET 0xFCU +#define USB_MSC_REQ_CODES_PUT 0xFDU +#define USB_MSC_REQ_CODES_GML 0xFEU +#define USB_MSC_REQ_CODES_BOMSR 0xFFU + +#define BBB_GET_MAX_LUN 0xFEU +#define BBB_RESET 0xFFU + +#endif /* __USB_MSC_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_conf.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_conf.h new file mode 100644 index 0000000..ae12fd4 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_conf.h @@ -0,0 +1,42 @@ +/*! + \file usbh_conf.h + \brief general low level driver configuration + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBH_CONF_H +#define __USBH_CONF_H + +#define USBH_MAX_EP_NUM 2 +#define USBH_MAX_INTERFACES_NUM 2 +#define USBH_MSC_MPS_SIZE 0x200 + +#endif /* __USBH_CONF_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_bbb.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_bbb.h new file mode 100644 index 0000000..42d71ab --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_bbb.h @@ -0,0 +1,127 @@ +/*! + \file usbh_msc_bbb.h + \brief header file for usbh_msc_bbb.c + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBH_MSC_BBB_H +#define __USBH_MSC_BBB_H + +#include "usbh_enum.h" +#include "msc_bbb.h" + +typedef union { + msc_bbb_cbw field; + + uint8_t CBWArray[31]; +}usbh_cbw_pkt; + +typedef union { + msc_bbb_csw field; + + uint8_t CSWArray[13]; +}usbh_csw_pkt; + +enum usbh_msc_state { + USBH_MSC_BOT_INIT_STATE = 0, + USBH_MSC_BOT_RESET, + USBH_MSC_GET_MAX_LUN, + USBH_MSC_TEST_UNIT_READY, + USBH_MSC_READ_CAPACITY10, + USBH_MSC_MODE_SENSE6, + USBH_MSC_REQUEST_SENSE, + USBH_MSC_BOT_USB_TRANSFERS, + USBH_MSC_DEFAULT_APPLI_STATE, + USBH_MSC_CTRL_ERROR_STATE, + USBH_MSC_UNRECOVERED_STATE +}; + +enum msc_bot_state { + USBH_MSC_SEND_CBW = 1U, + USBH_MSC_SENT_CBW, + USBH_MSC_BOT_DATAIN_STATE, + USBH_MSC_BOT_DATAOUT_STATE, + USBH_MSC_RECEIVE_CSW_STATE, + USBH_MSC_DECODE_CSW, + USBH_MSC_BOT_ERROR_IN, + USBH_MSC_BOT_ERROR_OUT +}; + +typedef struct { + uint8_t msc_state; + uint8_t msc_state_bkp; + uint8_t msc_state_current; + uint8_t cmd_state_machine; + uint8_t bot_state; + uint8_t bot_state_bkp; + + uint8_t *xfer_buf; + uint16_t data_len; + + uint8_t bot_xfer_status; +} usbh_botxfer; + + +#define USBH_MSC_BOT_CBW_TAG 0x20304050 + +#define USBH_MSC_CSW_MAX_LENGTH 63 + +#define USBH_MSC_SEND_CSW_DISABLE 0 +#define USBH_MSC_SEND_CSW_ENABLE 1 + +#define USBH_MSC_DIR_IN 0 +#define USBH_MSC_DIR_OUT 1 +#define USBH_MSC_BOTH_DIR 2 + +#define USBH_MSC_PAGE_LENGTH 512 + +#define CBW_CB_LENGTH 16 +#define CBW_LENGTH 10 +#define CBW_LENGTH_TEST_UNIT_READY 6 + +#define MAX_BULK_STALL_COUNT_LIMIT 0x04 /* If STALL is seen on Bulk + Endpoint continously, this means + that device and Host has phase error + Hence a Reset is needed */ + +extern usbh_botxfer msc_botxfer_param; +extern usbh_cbw_pkt msc_cbw_data; +extern usbh_csw_pkt msc_csw_data; + +void usbh_msc_init (usb_core_driver *pudev); + +void usbh_msc_botxfer (usb_core_driver *pudev, usbh_host *puhost); + +uint8_t usbh_msc_csw_decode (usb_core_driver *pudev, usbh_host *puhost); + +usbh_status usbh_msc_bot_abort (usb_core_driver *pudev, usbh_host *puhost, uint8_t direction); + +#endif /* __USBH_MSC_BOT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_core.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_core.h new file mode 100644 index 0000000..a14f67b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_core.h @@ -0,0 +1,58 @@ +/*! + \file usbh_msc_core.h + \brief header file for the usbh_msc_core.c + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBH_MSC_CORE_H +#define __USBH_MSC_CORE_H + +#include "usb_msc.h" +#include "usbh_msc_scsi.h" +#include "usbh_msc_bbb.h" + +/* structure for msc process */ +typedef struct { + uint8_t hc_num_in; + uint8_t hc_num_out; + uint8_t msc_bulk_epin; + uint8_t msc_bulk_epout; + uint16_t msc_bulk_epinsize; + uint16_t msc_bulk_epoutsize; + uint8_t buf[USBH_MSC_MPS_SIZE]; + uint8_t max_lun; +} usbh_msc_machine; + +extern usbh_class_cb usbh_msc_cb; +extern usbh_msc_machine msc_machine; +extern uint8_t msc_error_count; + +#endif /* __USBH_MSC_CORE_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_scsi.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_scsi.h new file mode 100644 index 0000000..1b5d651 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_msc_scsi.h @@ -0,0 +1,91 @@ +/*! + \file usbh_msc_scsi.h + \brief header file for usbh_msc_scsi.c + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBH_MSC_SCSI_H +#define __USBH_MSC_SCSI_H + +#include "msc_scsi.h" +#include "usbh_enum.h" + +typedef enum +{ + USBH_MSC_OK = 0U, + USBH_MSC_FAIL = 1U, + USBH_MSC_PHASE_ERROR = 2U, + USBH_MSC_BUSY = 3U +}usbh_msc_status; + +enum cmd_states { + CMD_UNINITIALIZED_STATE = 0, + CMD_SEND_STATE, + CMD_WAIT_STATUS +}; + +typedef struct +{ + uint32_t msc_capacity; + uint32_t msc_sense_key; + uint16_t msc_page_len; + uint8_t msc_write_protect; +}usbh_msc_parameter; + +#define DESC_REQUEST_SENSE 0x00U +#define ALLOCATION_LENGTH_REQUEST_SENSE 63U +#define XFER_LEN_MODE_SENSE6 63U + +#define MASK_MODE_SENSE_WRITE_PROTECT 0x80U +#define MODE_SENSE_PAGE_CONTROL_FIELD 0x00U +#define MODE_SENSE_PAGE_CODE 0x3FU +#define DISK_WRITE_PROTECTED 0x01U + +extern usbh_msc_parameter usbh_msc_param; + +uint8_t usbh_msc_test_unitready (usb_core_driver *pudev); +uint8_t usbh_msc_read_capacity10 (usb_core_driver *pudev); +uint8_t usbh_msc_mode_sense6 (usb_core_driver *pudev); +uint8_t usbh_msc_request_sense (usb_core_driver *pudev); + +uint8_t usbh_msc_write10 (usb_core_driver *pudev, + uint8_t *data_buf, + uint32_t addr, + uint32_t byte_num); + +uint8_t usbh_msc_read10 (usb_core_driver *pudev, + uint8_t *data_buf, + uint32_t addr, + uint32_t byte_num); + +void usbh_msc_state_machine (usb_core_driver *pudev); + +#endif /* __USBH_MSC_SCSI_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_usr.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_usr.h new file mode 100644 index 0000000..96988fd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Include/usbh_usr.h @@ -0,0 +1,94 @@ +/*! + \file usbh_usr.h + \brief user application layer header file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef USBH_USR_H +#define USBH_USR_H + +#include "ff.h" +#include "usbh_core.h" +#include "usb_conf.h" +#include "usbh_msc_core.h" +#include + +extern usbh_user_cb user_callback_funs; + +/* state machine for the usbh_usr_application_state */ +#define USBH_USR_FS_INIT 0 +#define USBH_USR_FS_READLIST 1 +#define USBH_USR_FS_WRITEFILE 2 +#define USBH_USR_FS_DEMOEND 3 + +extern uint8_t usbh_usr_application_state; + +/* function declarations */ +/* user operation for host-mode initialization */ +void usbh_user_init (void); +/* de-int user state and associated variables */ +void usbh_user_deinit (void); +/* user operation for device attached */ +void usbh_user_device_connected (void); +/* user operation for reset USB Device */ +void usbh_user_device_reset (void); +/* user operation for device disconnect event */ +void usbh_user_device_disconnected (void); +/* user operation for device overcurrent detection event */ +void usbh_user_over_current_detected (void); +/* user operation for detectting device speed */ +void usbh_user_device_speed_detected (uint32_t device_speed); +/* user operation when device descriptor is available */ +void usbh_user_device_desc_available (void *dev_desc); +/* USB device is successfully assigned the address */ +void usbh_user_device_address_assigned (void); +/* user operation when configuration descriptor is available */ +void usbh_user_configuration_descavailable (usb_desc_config *cfg_desc, + usb_desc_itf *itf_desc, + usb_desc_ep *ep_desc); +/* user operation when manufacturer string exists */ +void usbh_user_manufacturer_string (void *mfc_string); +/* user operation when product string exists */ +void usbh_user_product_string (void *prod_string); +/* user operatin when serialNum string exists */ +void usbh_user_serialnum_string (void *serialnum_string); +/* user response request is displayed to ask for application jump to class */ +void usbh_user_enumeration_finish (void); +/* user action for application state entry */ +usbh_user_status usbh_user_userinput (void); +/* user operation when device is not supported */ +void usbh_user_device_not_supported (void); +/* user operation when unrecoveredError happens */ +void usbh_user_unrecovered_error (void); +/* demo application for mass storage */ +int usbh_usr_msc_application (void); + +#endif /* USBH_USR_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/app.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/app.c new file mode 100644 index 0000000..6521e26 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/app.c @@ -0,0 +1,78 @@ +/*! + \file main.c + \brief this file realizes the MSC host + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "drv_usb_core.h" +#include "usbh_usr.h" +#include "usbh_msc_core.h" +#include "gd32vf103v_eval.h" +#include +#include +#include + +usb_core_driver usbh_msc_core; + +usbh_host usb_host = { + .class_cb = &usbh_msc_cb, + .usr_cb = &user_callback_funs +}; + +/** + * @brief Main routine for HID mouse / keyboard class application + * @param None + * @retval None + */ +int main(void) +{ + eclic_global_interrupt_enable(); + + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); + + usb_rcu_config(); + + usb_timer_init(); + + /* configure GPIO pin used for switching VBUS power and charge pump I/O */ + usb_vbus_config(); + + usbh_init (&usbh_msc_core, USB_CORE_ENUM_FS, &usb_host); + + /* enable interrupts */ + usb_intr_config(); + + while (1) { + /* Host state handler */ + usbh_core_task (&usbh_msc_core, &usb_host); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/fattime.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/fattime.c new file mode 100644 index 0000000..d9f2ebc --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/fattime.c @@ -0,0 +1,11 @@ + + +#include "integer.h" +#include "fattime.h" + + +DWORD get_fattime (void) +{ + return 0; +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/ff.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/ff.c new file mode 100644 index 0000000..de3bae1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/ff.c @@ -0,0 +1,3152 @@ +/*----------------------------------------------------------------------------/ +/ FatFs - FAT file system module R0.07e (C)ChaN, 2009 +/-----------------------------------------------------------------------------/ +/ FatFs module is a generic FAT file system module for small embedded systems. +/ This is a free software that opened for education, research and commercial +/ developments under license policy of following terms. +/ +/ Copyright (C) 2009, ChaN, all right reserved. +/ +/ * The FatFs module is a free software and there is NO WARRANTY. +/ * No restriction on use. You can use, modify and redistribute it for +/ personal, non-profit or commercial products UNDER YOUR RESPONSIBILITY. +/ * Redistributions of source code must retain the above copyright notice. +/ +/-----------------------------------------------------------------------------/ +/ Feb 26,'06 R0.00 Prototype. +/ +/ Apr 29,'06 R0.01 First stable version. +/ +/ Jun 01,'06 R0.02 Added FAT12 support. +/ Removed unbuffered mode. +/ Fixed a problem on small (<32M) partition. +/ Jun 10,'06 R0.02a Added a configuration option (_FS_MINIMUM). +/ +/ Sep 22,'06 R0.03 Added f_rename(). +/ Changed option _FS_MINIMUM to _FS_MINIMIZE. +/ Dec 11,'06 R0.03a Improved cluster scan algorithm to write files fast. +/ Fixed f_mkdir() creates incorrect directory on FAT32. +/ +/ Feb 04,'07 R0.04 Supported multiple drive system. +/ Changed some interfaces for multiple drive system. +/ Changed f_mountdrv() to f_mount(). +/ Added f_mkfs(). +/ Apr 01,'07 R0.04a Supported multiple partitions on a physical drive. +/ Added a capability of extending file size to f_lseek(). +/ Added minimization level 3. +/ Fixed an endian sensitive code in f_mkfs(). +/ May 05,'07 R0.04b Added a configuration option _USE_NTFLAG. +/ Added FSInfo support. +/ Fixed DBCS name can result FR_INVALID_NAME. +/ Fixed short seek (<= csize) collapses the file object. +/ +/ Aug 25,'07 R0.05 Changed arguments of f_read(), f_write() and f_mkfs(). +/ Fixed f_mkfs() on FAT32 creates incorrect FSInfo. +/ Fixed f_mkdir() on FAT32 creates incorrect directory. +/ Feb 03,'08 R0.05a Added f_truncate() and f_utime(). +/ Fixed off by one error at FAT sub-type determination. +/ Fixed btr in f_read() can be mistruncated. +/ Fixed cached sector is not flushed when create and close +/ without write. +/ +/ Apr 01,'08 R0.06 Added fputc(), fputs(), fprintf() and fgets(). +/ Improved performance of f_lseek() on moving to the same +/ or following cluster. +/ +/ Apr 01,'09 R0.07 Merged Tiny-FatFs as a buffer configuration option. +/ Added long file name support. +/ Added multiple code page support. +/ Added re-entrancy for multitask operation. +/ Added auto cluster size selection to f_mkfs(). +/ Added rewind option to f_readdir(). +/ Changed result code of critical errors. +/ Renamed string functions to avoid name collision. +/ Apr 14,'09 R0.07a Separated out OS dependent code on reentrant cfg. +/ Added multiple sector size support. +/ Jun 21,'09 R0.07c Fixed f_unlink() can return FR_OK on error. +/ Fixed wrong cache control in f_lseek(). +/ Added relative path feature. +/ Added f_chdir() and f_chdrive(). +/ Added proper case conversion to extended char. +/ Nov 03,'09 R0.07e Separated out configuration options from ff.h to ffconf.h. +/ Fixed f_unlink() fails to remove a sub-dir on _FS_RPATH. +/ Fixed name matching error on the 13 char boundary. +/ Added a configuration option, _LFN_UNICODE. +/ Changed f_readdir() to return the SFN with always upper +/ case on non-LFN cfg. +/---------------------------------------------------------------------------*/ + +#include "ff.h" /* FatFs configurations and declarations */ +#include "diskio.h" /* Declarations of low level disk I/O functions */ + + +/*-------------------------------------------------------------------------- + + Module Private Definitions + +---------------------------------------------------------------------------*/ + +#if _FATFS != 0x007E +#error Wrong include file (ff.h). +#endif + +#if _FS_REENTRANT +#if _USE_LFN == 1 +#error Static LFN work area must not be used in re-entrant configuration. +#endif +#define ENTER_FF(fs) { if (!lock_fs(fs)) return FR_TIMEOUT; } +#define LEAVE_FF(fs, res) { unlock_fs(fs, res); return res; } + +#else +#define ENTER_FF(fs) +#define LEAVE_FF(fs, res) return res + +#endif + +#define ABORT(fs, res) { fp->flag |= FA__ERROR; LEAVE_FF(fs, res); } + +#ifndef NULL +#define NULL 0 +#endif + +/* Name status flags */ +#define NS 11 /* Offset of name status byte */ +#define NS_LOSS 0x01 /* Out of 8.3 format */ +#define NS_LFN 0x02 /* Force to create LFN entry */ +#define NS_LAST 0x04 /* Last segment */ +#define NS_BODY 0x08 /* Lower case flag (body) */ +#define NS_EXT 0x10 /* Lower case flag (ext) */ +#define NS_DOT 0x20 /* Dot entry */ + + + + +/*-------------------------------------------------------------------------- + + Private Work Area + +---------------------------------------------------------------------------*/ + +#if _DRIVES < 1 || _DRIVES > 9 +#error Number of drives must be 1-9. +#endif +static +FATFS *FatFs[_DRIVES]; /* Pointer to the file system objects (logical drives) */ + +static +WORD Fsid; /* File system mount ID */ + +#if _FS_RPATH +static +BYTE Drive; /* Current drive */ +#endif + + +#if _USE_LFN == 1 /* LFN with static LFN working buffer */ +static +WCHAR LfnBuf[_MAX_LFN + 1]; +#define NAMEBUF(sp,lp) BYTE sp[12]; WCHAR *lp = LfnBuf +#define INITBUF(dj,sp,lp) dj.fn = sp; dj.lfn = lp + +#elif _USE_LFN > 1 /* LFN with dynamic LFN working buffer */ +#define NAMEBUF(sp,lp) BYTE sp[12]; WCHAR lbuf[_MAX_LFN + 1], *lp = lbuf +#define INITBUF(dj,sp,lp) dj.fn = sp; dj.lfn = lp + +#else /* No LFN */ +#define NAMEBUF(sp,lp) BYTE sp[12] +#define INITBUF(dj,sp,lp) dj.fn = sp + +#endif + + + + +/*-------------------------------------------------------------------------- + + Module Private Functions + +---------------------------------------------------------------------------*/ + + +/*-----------------------------------------------------------------------*/ +/* String functions */ +/*-----------------------------------------------------------------------*/ + +/* Copy memory to memory */ +static +void mem_cpy (void* dst, const void* src, int cnt) { + char *d = (char*)dst; + const char *s = (const char *)src; + while (cnt--) *d++ = *s++; +} + +/* Fill memory */ +static +void mem_set (void* dst, int val, int cnt) { + char *d = (char*)dst; + while (cnt--) *d++ = (char)val; +} + +/* Compare memory to memory */ +static +int mem_cmp (const void* dst, const void* src, int cnt) { + const char *d = (const char *)dst, *s = (const char *)src; + int r = 0; + while (cnt-- && (r = *d++ - *s++) == 0) ; + return r; +} + +/* Check if chr is contained in the string */ +static +int chk_chr (const char* str, int chr) { + while (*str && *str != chr) str++; + return *str; +} + + + +/*-----------------------------------------------------------------------*/ +/* Request/Release grant to access the volume */ +/*-----------------------------------------------------------------------*/ +#if _FS_REENTRANT + +static +BOOL lock_fs ( + FATFS *fs /* File system object */ +) +{ + return ff_req_grant(fs->sobj); +} + + +static +void unlock_fs ( + FATFS *fs, /* File system object */ + FRESULT res /* Result code to be returned */ +) +{ + if (res != FR_NOT_ENABLED && + res != FR_INVALID_DRIVE && + res != FR_INVALID_OBJECT && + res != FR_TIMEOUT) { + ff_rel_grant(fs->sobj); + } +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Change window offset */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT move_window ( + FATFS *fs, /* File system object */ + DWORD sector /* Sector number to make appearance in the fs->win[] */ +) /* Move to zero only writes back dirty window */ +{ + DWORD wsect; + + + wsect = fs->winsect; + if (wsect != sector) { /* Changed current window */ +#if !_FS_READONLY + if (fs->wflag) { /* Write back dirty window if needed */ + if (disk_write(fs->drive, fs->win, wsect, 1) != RES_OK) + return FR_DISK_ERR; + fs->wflag = 0; + if (wsect < (fs->fatbase + fs->sects_fat)) { /* In FAT area */ + BYTE nf; + for (nf = fs->n_fats; nf > 1; nf--) { /* Reflect the change to all FAT copies */ + wsect += fs->sects_fat; + disk_write(fs->drive, fs->win, wsect, 1); + } + } + } +#endif + if (sector) { + if (disk_read(fs->drive, fs->win, sector, 1) != RES_OK) + return FR_DISK_ERR; + fs->winsect = sector; + } + } + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Clean-up cached data */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT sync ( /* FR_OK: successful, FR_DISK_ERR: failed */ + FATFS *fs /* File system object */ +) +{ + FRESULT res; + + + res = move_window(fs, 0); + if (res == FR_OK) { + /* Update FSInfo sector if needed */ + if (fs->fs_type == FS_FAT32 && fs->fsi_flag) { + fs->winsect = 0; + mem_set(fs->win, 0, 512); + ST_WORD(fs->win+BS_55AA, 0xAA55); + ST_DWORD(fs->win+FSI_LeadSig, 0x41615252); + ST_DWORD(fs->win+FSI_StrucSig, 0x61417272); + ST_DWORD(fs->win+FSI_Free_Count, fs->free_clust); + ST_DWORD(fs->win+FSI_Nxt_Free, fs->last_clust); + disk_write(fs->drive, fs->win, fs->fsi_sector, 1); + fs->fsi_flag = 0; + } + /* Make sure that no pending write process in the physical drive */ + if (disk_ioctl(fs->drive, CTRL_SYNC, (void*)NULL) != RES_OK) + res = FR_DISK_ERR; + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Read value of a FAT entry */ +/*-----------------------------------------------------------------------*/ + + +DWORD get_fat ( /* 0xFFFFFFFF:Disk error, 1:Internal error, Else:Cluster status */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to get the link information */ +) +{ + UINT wc, bc; + DWORD fsect; + + + if (clst < 2 || clst >= fs->max_clust) /* Range check */ + return 1; + + fsect = fs->fatbase; + switch (fs->fs_type) { + case FS_FAT12 : + bc = clst; bc += bc / 2; + if (move_window(fs, fsect + (bc / SS(fs)))) break; + wc = fs->win[bc & (SS(fs) - 1)]; bc++; + if (move_window(fs, fsect + (bc / SS(fs)))) break; + wc |= (WORD)fs->win[bc & (SS(fs) - 1)] << 8; + return (clst & 1) ? (wc >> 4) : (wc & 0xFFF); + + case FS_FAT16 : + if (move_window(fs, fsect + (clst / (SS(fs) / 2)))) break; + return LD_WORD(&fs->win[((WORD)clst * 2) & (SS(fs) - 1)]); + + case FS_FAT32 : + if (move_window(fs, fsect + (clst / (SS(fs) / 4)))) break; + return LD_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)]) & 0x0FFFFFFF; + } + + return 0xFFFFFFFF; /* An error occurred at the disk I/O layer */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* FAT access - Change value of a FAT entry */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY + +FRESULT put_fat ( + FATFS *fs, /* File system object */ + DWORD clst, /* Cluster# to be changed in range of 2 to fs->max_clust - 1 */ + DWORD val /* New value to mark the cluster */ +) +{ + UINT bc; + BYTE *p; + DWORD fsect; + FRESULT res; + + + if (clst < 2 || clst >= fs->max_clust) { /* Range check */ + res = FR_INT_ERR; + + } else { + fsect = fs->fatbase; + switch (fs->fs_type) { + case FS_FAT12 : + bc = clst; bc += bc / 2; + res = move_window(fs, fsect + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc & (SS(fs) - 1)]; + *p = (clst & 1) ? ((*p & 0x0F) | ((BYTE)val << 4)) : (BYTE)val; + bc++; + fs->wflag = 1; + res = move_window(fs, fsect + (bc / SS(fs))); + if (res != FR_OK) break; + p = &fs->win[bc & (SS(fs) - 1)]; + *p = (clst & 1) ? (BYTE)(val >> 4) : ((*p & 0xF0) | ((BYTE)(val >> 8) & 0x0F)); + break; + + case FS_FAT16 : + res = move_window(fs, fsect + (clst / (SS(fs) / 2))); + if (res != FR_OK) break; + ST_WORD(&fs->win[((WORD)clst * 2) & (SS(fs) - 1)], (WORD)val); + break; + + case FS_FAT32 : + res = move_window(fs, fsect + (clst / (SS(fs) / 4))); + if (res != FR_OK) break; + ST_DWORD(&fs->win[((WORD)clst * 4) & (SS(fs) - 1)], val); + break; + + default : + res = FR_INT_ERR; + } + fs->wflag = 1; + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Remove a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT remove_chain ( + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to remove a chain from */ +) +{ + FRESULT res; + DWORD nxt; + + + if (clst < 2 || clst >= fs->max_clust) { /* Check the range of cluster# */ + res = FR_INT_ERR; + + } else { + res = FR_OK; + while (clst < fs->max_clust) { /* Not a last link? */ + nxt = get_fat(fs, clst); /* Get cluster status */ + if (nxt == 0) break; /* Empty cluster? */ + if (nxt == 1) { res = FR_INT_ERR; break; } /* Internal error? */ + if (nxt == 0xFFFFFFFF) { res = FR_DISK_ERR; break; } /* Disk error? */ + res = put_fat(fs, clst, 0); /* Mark the cluster "empty" */ + if (res != FR_OK) break; + if (fs->free_clust != 0xFFFFFFFF) { /* Update FSInfo */ + fs->free_clust++; + fs->fsi_flag = 1; + } + clst = nxt; /* Next cluster */ + } + } + + return res; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* FAT handling - Stretch or Create a cluster chain */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +DWORD create_chain ( /* 0:No free cluster, 1:Internal error, 0xFFFFFFFF:Disk error, >=2:New cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to stretch. 0 means create a new chain. */ +) +{ + DWORD cs, ncl, scl, mcl; + + + mcl = fs->max_clust; + if (clst == 0) { /* Create new chain */ + scl = fs->last_clust; /* Get suggested start point */ + if (scl == 0 || scl >= mcl) scl = 1; + } + else { /* Stretch existing chain */ + cs = get_fat(fs, clst); /* Check the cluster status */ + if (cs < 2) return 1; /* It is an invalid cluster */ + if (cs < mcl) return cs; /* It is already followed by next cluster */ + scl = clst; + } + + ncl = scl; /* Start cluster */ + for (;;) { + ncl++; /* Next cluster */ + if (ncl >= mcl) { /* Wrap around */ + ncl = 2; + if (ncl > scl) return 0; /* No free cluster */ + } + cs = get_fat(fs, ncl); /* Get the cluster status */ + if (cs == 0) break; /* Found a free cluster */ + if (cs == 0xFFFFFFFF || cs == 1)/* An error occurred */ + return cs; + if (ncl == scl) return 0; /* No free cluster */ + } + + if (put_fat(fs, ncl, 0x0FFFFFFF)) /* Mark the new cluster "in use" */ + return 0xFFFFFFFF; + if (clst != 0) { /* Link it to the previous one if needed */ + if (put_fat(fs, clst, ncl)) + return 0xFFFFFFFF; + } + + fs->last_clust = ncl; /* Update FSINFO */ + if (fs->free_clust != 0xFFFFFFFF) { + fs->free_clust--; + fs->fsi_flag = 1; + } + + return ncl; /* Return new cluster number */ +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Get sector# from cluster# */ +/*-----------------------------------------------------------------------*/ + + +DWORD clust2sect ( /* !=0: Sector number, 0: Failed - invalid cluster# */ + FATFS *fs, /* File system object */ + DWORD clst /* Cluster# to be converted */ +) +{ + clst -= 2; + if (clst >= (fs->max_clust - 2)) return 0; /* Invalid cluster# */ + return clst * fs->csize + fs->database; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Seek directory index */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_seek ( + DIR *dj, /* Pointer to directory object */ + WORD idx /* Directory index number */ +) +{ + DWORD clst; + WORD ic; + + + dj->index = idx; + clst = dj->sclust; + if (clst == 1 || clst >= dj->fs->max_clust) /* Check start cluster range */ + return FR_INT_ERR; + if (!clst && dj->fs->fs_type == FS_FAT32) /* Replace cluster# 0 with root cluster# if in FAT32 */ + clst = dj->fs->dirbase; + + if (clst == 0) { /* Static table */ + dj->clust = clst; + if (idx >= dj->fs->n_rootdir) /* Index is out of range */ + return FR_INT_ERR; + dj->sect = dj->fs->dirbase + idx / (SS(dj->fs) / 32); /* Sector# */ + } + else { /* Dynamic table */ + ic = SS(dj->fs) / 32 * dj->fs->csize; /* Entries per cluster */ + while (idx >= ic) { /* Follow cluster chain */ + clst = get_fat(dj->fs, clst); /* Get next cluster */ + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; /* Disk error */ + if (clst < 2 || clst >= dj->fs->max_clust) /* Reached to end of table or int error */ + return FR_INT_ERR; + idx -= ic; + } + dj->clust = clst; + dj->sect = clust2sect(dj->fs, clst) + idx / (SS(dj->fs) / 32); /* Sector# */ + } + + dj->dir = dj->fs->win + (idx % (SS(dj->fs) / 32)) * 32; /* Ptr to the entry in the sector */ + + return FR_OK; /* Seek succeeded */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Move directory index next */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_next ( /* FR_OK:Succeeded, FR_NO_FILE:End of table, FR_DENIED:EOT and could not streach */ + DIR *dj, /* Pointer to directory object */ + bool streach /* FALSE: Do not stretch table, TRUE: Stretch table if needed */ +) +{ + DWORD clst; + WORD i; + + + i = dj->index + 1; + if (!i || !dj->sect) /* Report EOT when index has reached 65535 */ + return FR_NO_FILE; + + if (!(i % (SS(dj->fs) / 32))) { /* Sector changed? */ + dj->sect++; /* Next sector */ + + if (dj->clust == 0) { /* Static table */ + if (i >= dj->fs->n_rootdir) /* Report EOT when end of table */ + return FR_NO_FILE; + } + else { /* Dynamic table */ + if (((i / (SS(dj->fs) / 32)) & (dj->fs->csize - 1)) == 0) { /* Cluster changed? */ + clst = get_fat(dj->fs, dj->clust); /* Get next cluster */ + if (clst <= 1) return FR_INT_ERR; + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; + if (clst >= dj->fs->max_clust) { /* When it reached end of dynamic table */ +#if !_FS_READONLY + BYTE c; + if (!streach) return FR_NO_FILE; /* When do not stretch, report EOT */ + clst = create_chain(dj->fs, dj->clust); /* Stretch cluster chain */ + if (clst == 0) return FR_DENIED; /* No free cluster */ + if (clst == 1) return FR_INT_ERR; + if (clst == 0xFFFFFFFF) return FR_DISK_ERR; + /* Clean-up streached table */ + if (move_window(dj->fs, 0)) return FR_DISK_ERR; /* Flush active window */ + mem_set(dj->fs->win, 0, SS(dj->fs)); /* Clear window buffer */ + dj->fs->winsect = clust2sect(dj->fs, clst); /* Cluster start sector */ + for (c = 0; c < dj->fs->csize; c++) { /* Fill the new cluster with 0 */ + dj->fs->wflag = 1; + if (move_window(dj->fs, 0)) return FR_DISK_ERR; + dj->fs->winsect++; + } + dj->fs->winsect -= c; /* Rewind window address */ +#else + return FR_NO_FILE; /* Report EOT */ +#endif + } + dj->clust = clst; /* Initialize data for new cluster */ + dj->sect = clust2sect(dj->fs, clst); + } + } + } + + dj->index = i; + dj->dir = dj->fs->win + (i % (SS(dj->fs) / 32)) * 32; + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* LFN handling - Test/Pick/Fit an LFN segment from/to directory entry */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static +const BYTE LfnOfs[] = {1,3,5,7,9,14,16,18,20,22,24,28,30}; /* Offset of LFN chars in the directory entry */ + + +static +BOOL cmp_lfn ( /* TRUE:Matched, FALSE:Not matched */ + WCHAR *lfnbuf, /* Pointer to the LFN to be compared */ + BYTE *dir /* Pointer to the directory entry containing a part of LFN */ +) +{ + int i, s; + WCHAR wc, uc; + + + i = ((dir[LDIR_Ord] & 0xBF) - 1) * 13; /* Get offset in the LFN buffer */ + s = 0; wc = 1; + do { + uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ + if (wc) { /* Last char has not been processed */ + wc = ff_wtoupper(uc); /* Convert it to upper case */ + if (i >= _MAX_LFN || wc != ff_wtoupper(lfnbuf[i++])) /* Compare it */ + return FALSE; /* Not matched */ + } else { + if (uc != 0xFFFF) return FALSE; /* Check filler */ + } + } while (++s < 13); /* Repeat until all chars in the entry are checked */ + + if ((dir[LDIR_Ord] & 0x40) && wc && lfnbuf[i]) /* Last segment matched but different length */ + return FALSE; + + return TRUE; /* The part of LFN matched */ +} + + + +static +BOOL pick_lfn ( /* TRUE:Succeeded, FALSE:Buffer overflow */ + WCHAR *lfnbuf, /* Pointer to the Unicode-LFN buffer */ + BYTE *dir /* Pointer to the directory entry */ +) +{ + int i, s; + WCHAR wc, uc; + + + i = ((dir[LDIR_Ord] & 0x3F) - 1) * 13; /* Offset in the LFN buffer */ + + s = 0; wc = 1; + do { + uc = LD_WORD(dir+LfnOfs[s]); /* Pick an LFN character from the entry */ + if (wc) { /* Last char has not been processed */ + if (i >= _MAX_LFN) return FALSE; /* Buffer overflow? */ + lfnbuf[i++] = wc = uc; /* Store it */ + } else { + if (uc != 0xFFFF) return FALSE; /* Check filler */ + } + } while (++s < 13); /* Read all character in the entry */ + + if (dir[LDIR_Ord] & 0x40) { /* Put terminator if it is the last LFN part */ + if (i >= _MAX_LFN) return FALSE; /* Buffer overflow? */ + lfnbuf[i] = 0; + } + + return TRUE; +} + + +#if !_FS_READONLY +static +void fit_lfn ( + const WCHAR *lfnbuf, /* Pointer to the LFN buffer */ + BYTE *dir, /* Pointer to the directory entry */ + BYTE ord, /* LFN order (1-20) */ + BYTE sum /* SFN sum */ +) +{ + int i, s; + WCHAR wc; + + + dir[LDIR_Chksum] = sum; /* Set check sum */ + dir[LDIR_Attr] = AM_LFN; /* Set attribute. LFN entry */ + dir[LDIR_Type] = 0; + ST_WORD(dir+LDIR_FstClusLO, 0); + + i = (ord - 1) * 13; /* Get offset in the LFN buffer */ + s = wc = 0; + do { + if (wc != 0xFFFF) wc = lfnbuf[i++]; /* Get an effective char */ + ST_WORD(dir+LfnOfs[s], wc); /* Put it */ + if (!wc) wc = 0xFFFF; /* Padding chars following last char */ + } while (++s < 13); + if (wc == 0xFFFF || !lfnbuf[i]) ord |= 0x40; /* Bottom LFN part is the start of LFN sequence */ + dir[LDIR_Ord] = ord; /* Set the LFN order */ +} + +#endif +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Create numbered name */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +void gen_numname ( + BYTE *dst, /* Pointer to generated SFN */ + const BYTE *src, /* Pointer to source SFN to be modified */ + const WCHAR *lfn, /* Pointer to LFN */ + WORD num /* Sequence number */ +) +{ + char ns[8]; + int i, j; + + + mem_cpy(dst, src, 11); + + if (num > 5) { /* On many collisions, generate a hash number instead of sequential number */ + do num = (num >> 1) + (num << 15) + (WORD)*lfn++; while (*lfn); + } + + /* itoa */ + i = 7; + do { + ns[i--] = (num % 10) + '0'; + num /= 10; + } while (num); + ns[i] = '~'; + + /* Append the number */ + for (j = 0; j < i && dst[j] != ' '; j++) { + if (IsDBCS1(dst[j])) { + if (j == i - 1) break; + j++; + } + } + do { + dst[j++] = (i < 8) ? ns[i++] : ' '; + } while (j < 8); +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Calculate sum of an SFN */ +/*-----------------------------------------------------------------------*/ +#if _USE_LFN +static +BYTE sum_sfn ( + const BYTE *dir /* Ptr to directory entry */ +) +{ + BYTE sum = 0; + int n = 11; + + do sum = (sum >> 1) + (sum << 7) + *dir++; while (--n); + return sum; +} +#endif + + + + +/*-----------------------------------------------------------------------*/ +/* Directory handling - Find an object in the directory */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT dir_find ( + DIR *dj /* Pointer to the directory object linked to the file name */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN + BYTE a, ord, sum; +#endif + + res = dir_seek(dj, 0); /* Rewind directory object */ + if (res != FR_OK) return res; + +#if _USE_LFN + ord = sum = 0xFF; +#endif + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if _USE_LFN /* LFN configuration */ + a = dir[DIR_Attr] & AM_MASK; + if (c == 0xE5 || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (dj->lfn) { + if (c & 0x40) { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= 0xBF; ord = c; /* LFN start order */ + dj->lfn_idx = dj->index; + } + /* Check validity of the LFN entry and compare it with given name */ + ord = (c == ord && sum == dir[LDIR_Chksum] && cmp_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; + } + } else { /* An SFN entry is found */ + if (!ord && sum == sum_sfn(dir)) break; /* LFN matched? */ + ord = 0xFF; dj->lfn_idx = 0xFFFF; /* Reset LFN sequence */ + if (!(dj->fn[NS] & NS_LOSS) && !mem_cmp(dir, dj->fn, 11)) break; /* SFN matched? */ + } + } +#else /* Non LFN configuration */ + if (!(dir[DIR_Attr] & AM_VOL) && !mem_cmp(dir, dj->fn, 11)) /* Is it a valid entry? */ + break; +#endif + res = dir_next(dj, FALSE); /* Next entry */ + } while (res == FR_OK); + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 +static +FRESULT dir_read ( + DIR *dj /* Pointer to the directory object that pointing the entry to be read */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN + BYTE a, ord = 0xFF, sum = 0xFF; +#endif + + res = FR_NO_FILE; + while (dj->sect) { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + dir = dj->dir; /* Ptr to the directory entry of current index */ + c = dir[DIR_Name]; + if (c == 0) { res = FR_NO_FILE; break; } /* Reached to end of table */ +#if _USE_LFN /* LFN configuration */ + a = dir[DIR_Attr] & AM_MASK; + if (c == 0xE5 || (!_FS_RPATH && c == '.') || ((a & AM_VOL) && a != AM_LFN)) { /* An entry without valid data */ + ord = 0xFF; + } else { + if (a == AM_LFN) { /* An LFN entry is found */ + if (c & 0x40) { /* Is it start of LFN sequence? */ + sum = dir[LDIR_Chksum]; + c &= 0xBF; ord = c; + dj->lfn_idx = dj->index; + } + /* Check LFN validity and capture it */ + ord = (c == ord && sum == dir[LDIR_Chksum] && pick_lfn(dj->lfn, dir)) ? ord - 1 : 0xFF; + } else { /* An SFN entry is found */ + if (ord || sum != sum_sfn(dir)) /* Is there a valid LFN? */ + dj->lfn_idx = 0xFFFF; /* It has no LFN. */ + break; + } + } +#else /* Non LFN configuration */ + if (c != 0xE5 && (_FS_RPATH || c != '.') && !(dir[DIR_Attr] & AM_VOL)) /* Is it a valid entry? */ + break; +#endif + res = dir_next(dj, FALSE); /* Next entry */ + if (res != FR_OK) break; + } + + if (res != FR_OK) dj->sect = 0; + + return res; +} +#endif + + + +/*-----------------------------------------------------------------------*/ +/* Register an object to the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY +static +FRESULT dir_register ( /* FR_OK:Successful, FR_DENIED:No free entry or too many SFN collision, FR_DISK_ERR:Disk error */ + DIR *dj /* Target directory with object name to be created */ +) +{ + FRESULT res; + BYTE c, *dir; +#if _USE_LFN /* LFN configuration */ + WORD n, ne, is; + BYTE sn[12], *fn, sum; + WCHAR *lfn; + + + fn = dj->fn; lfn = dj->lfn; + mem_cpy(sn, fn, 12); + + if (_FS_RPATH && (sn[NS] & NS_DOT)) return FR_INVALID_NAME; /* Cannot create dot entry */ + + if (sn[NS] & NS_LOSS) { /* When LFN is out of 8.3 format, generate a numbered name */ + fn[NS] = 0; dj->lfn = NULL; /* Find only SFN */ + for (n = 1; n < 100; n++) { + gen_numname(fn, sn, lfn, n); /* Generate a numbered name */ + res = dir_find(dj); /* Check if the name collides with existing SFN */ + if (res != FR_OK) break; + } + if (n == 100) return FR_DENIED; /* Abort if too many collisions */ + if (res != FR_NO_FILE) return res; /* Abort if the result is other than 'not collided' */ + fn[NS] = sn[NS]; dj->lfn = lfn; + } + + if (sn[NS] & NS_LFN) { /* When LFN is to be created, reserve reserve an SFN + LFN entries. */ + for (ne = 0; lfn[ne]; ne++) ; + ne = (ne + 25) / 13; + } else { /* Otherwise reserve only an SFN entry. */ + ne = 1; + } + + /* Reserve contiguous entries */ + res = dir_seek(dj, 0); + if (res != FR_OK) return res; + n = is = 0; + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + c = *dj->dir; /* Check the entry status */ + if (c == 0xE5 || c == 0) { /* Is it a blank entry? */ + if (n == 0) is = dj->index; /* First index of the contiguous entry */ + if (++n == ne) break; /* A contiguous entry that required count is found */ + } else { + n = 0; /* Not a blank entry. Restart to search */ + } + res = dir_next(dj, TRUE); /* Next entry with table stretch */ + } while (res == FR_OK); + + if (res == FR_OK && ne > 1) { /* Initialize LFN entry if needed */ + res = dir_seek(dj, is); + if (res == FR_OK) { + sum = sum_sfn(dj->fn); /* Sum of the SFN tied to the LFN */ + ne--; + do { /* Store LFN entries in bottom first */ + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + fit_lfn(dj->lfn, dj->dir, (BYTE)ne, sum); + dj->fs->wflag = 1; + res = dir_next(dj, FALSE); /* Next entry */ + } while (res == FR_OK && --ne); + } + } + +#else /* Non LFN configuration */ + res = dir_seek(dj, 0); + if (res == FR_OK) { + do { /* Find a blank entry for the SFN */ + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + c = *dj->dir; + if (c == 0xE5 || c == 0) break; /* Is it a blank entry? */ + res = dir_next(dj, TRUE); /* Next entry with table streach */ + } while (res == FR_OK); + } +#endif + + if (res == FR_OK) { /* Initialize the SFN entry */ + res = move_window(dj->fs, dj->sect); + if (res == FR_OK) { + dir = dj->dir; + mem_set(dir, 0, 32); /* Clean the entry */ + mem_cpy(dir, dj->fn, 11); /* Put SFN */ + dir[DIR_NTres] = *(dj->fn+NS) & (NS_BODY | NS_EXT); /* Put NT flag */ + dj->fs->wflag = 1; + } + } + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Remove an object from the directory */ +/*-----------------------------------------------------------------------*/ +#if !_FS_READONLY && !_FS_MINIMIZE +static +FRESULT dir_remove ( /* FR_OK: Successful, FR_DISK_ERR: A disk error */ + DIR *dj /* Directory object pointing the entry to be removed */ +) +{ + FRESULT res; +#if _USE_LFN /* LFN configuration */ + WORD i; + + i = dj->index; /* SFN index */ + res = dir_seek(dj, (WORD)((dj->lfn_idx == 0xFFFF) ? i : dj->lfn_idx)); /* Goto the SFN or top of the LFN entries */ + if (res == FR_OK) { + do { + res = move_window(dj->fs, dj->sect); + if (res != FR_OK) break; + *dj->dir = 0xE5; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + if (dj->index >= i) break; /* When reached SFN, all entries of the object has been deleted. */ + res = dir_next(dj, FALSE); /* Next entry */ + } while (res == FR_OK); + if (res == FR_NO_FILE) res = FR_INT_ERR; + } + +#else /* Non LFN configuration */ + res = dir_seek(dj, dj->index); + if (res == FR_OK) { + res = move_window(dj->fs, dj->sect); + if (res == FR_OK) { + *dj->dir = 0xE5; /* Mark the entry "deleted" */ + dj->fs->wflag = 1; + } + } +#endif + + return res; +} +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Pick a segment and create the object name in directory form */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT create_name ( + DIR *dj, /* Pointer to the directory object */ + const XCHAR **path /* Pointer to pointer to the segment in the path string */ +) +{ +#ifdef _EXCVT + static const BYTE cvt[] = _EXCVT; +#endif + +#if _USE_LFN /* LFN configuration */ + BYTE b, cf; + WCHAR w, *lfn; + int i, ni, si, di; + const XCHAR *p; + + /* Create LFN in Unicode */ + si = di = 0; + p = *path; + lfn = dj->lfn; + for (;;) { + w = p[si++]; /* Get a character */ + if (w < ' ' || w == '/' || w == '\\') break; /* Break on end of segment */ + if (di >= _MAX_LFN) /* Reject too long name */ + return FR_INVALID_NAME; +#if !_LFN_UNICODE + w &= 0xFF; + if (IsDBCS1(w)) { /* If it is a DBC 1st byte */ + b = p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(b)) /* Reject invalid code for DBC */ + return FR_INVALID_NAME; + //w = (w << 8) + b; + else w = (w << 8) + b; + } + w = ff_convert(w, 1); /* Convert OEM to Unicode */ + if (!w) return FR_INVALID_NAME; /* Reject invalid code */ +#endif + if (w < 0x80 && chk_chr("\"*:<>\?|\x7F", w)) /* Reject illegal chars for LFN */ + return FR_INVALID_NAME; + lfn[di++] = w; /* Store the Unicode char */ + } + *path = &p[si]; /* Return pointer to the next segment */ + cf = (w < ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ +#if _FS_RPATH + if ((di == 1 && lfn[di - 1] == '.') || /* Is this a dot entry? */ + (di == 2 && lfn[di - 1] == '.' && lfn[di - 2] == '.')) { + lfn[di] = 0; + for (i = 0; i < 11; i++) + dj->fn[i] = (i < di) ? '.' : ' '; + dj->fn[i] = cf | NS_DOT; /* This is a dot entry */ + return FR_OK; + } +#endif + while (di) { /* Strip trailing spaces and dots */ + w = lfn[di - 1]; + if (w != ' ' && w != '.') break; + di--; + } + if (!di) return FR_INVALID_NAME; /* Reject null string */ + + lfn[di] = 0; /* LFN is created */ + + /* Create SFN in directory form */ + mem_set(dj->fn, ' ', 11); + for (si = 0; lfn[si] == ' ' || lfn[si] == '.'; si++) ; /* Strip leading spaces and dots */ + if (si) cf |= NS_LOSS | NS_LFN; + while (di && lfn[di - 1] != '.') di--; /* Find extension (di<=si: no extension) */ + + b = i = 0; ni = 8; + for (;;) { + w = lfn[si++]; /* Get an LFN char */ + if (!w) break; /* Break on end of the LFN */ + if (w == ' ' || (w == '.' && si != di)) { /* Remove spaces and dots */ + cf |= NS_LOSS | NS_LFN; continue; + } + + if (i >= ni || si == di) { /* Extension or end of SFN */ + if (ni == 11) { /* Long extension */ + cf |= NS_LOSS | NS_LFN; break; + } + if (si != di) cf |= NS_LOSS | NS_LFN; /* Out of 8.3 format */ + if (si > di) break; /* No extension */ + si = di; i = 8; ni = 11; /* Enter extension section */ + b <<= 2; continue; + } + + if (w >= 0x80) { /* Non ASCII char */ +#ifdef _EXCVT + w = ff_convert(w, 0); /* Unicode -> OEM code */ + if (w) w = cvt[w - 0x80]; /* Convert extended char to upper (SBCS) */ +#else + w = ff_convert(ff_wtoupper(w), 0); /* Upper converted Unicode -> OEM code */ +#endif + cf |= NS_LFN; /* Force create LFN entry */ + } + + if (_DF1S && w >= 0x100) { /* Double byte char */ + if (i >= ni - 1) { + cf |= NS_LOSS | NS_LFN; i = ni; continue; + } + dj->fn[i++] = (BYTE)(w >> 8); + } else { /* Single byte char */ + if (!w || chk_chr("+,;[=]", w)) { /* Replace illegal chars for SFN */ + w = '_'; cf |= NS_LOSS | NS_LFN; /* Lossy conversion */ + } else { + if (IsUpper(w)) { /* ASCII large capital */ + b |= 2; + } else { + if (IsLower(w)) { /* ASCII small capital */ + b |= 1; w -= 0x20; + } + } + } + } + dj->fn[i++] = (BYTE)w; + } + + if (dj->fn[0] == 0xE5) dj->fn[0] = 0x05; /* If the first char collides with deleted mark, replace it with 0x05 */ + + if (ni == 8) b <<= 2; + if ((b & 0x0C) == 0x0C || (b & 0x03) == 0x03) /* Create LFN entry when there are composite capitals */ + cf |= NS_LFN; + if (!(cf & NS_LFN)) { /* When LFN is in 8.3 format without extended char, NT flags are created */ + if ((b & 0x03) == 0x01) cf |= NS_EXT; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) cf |= NS_BODY; /* NT flag (Filename has only small capital) */ + } + + dj->fn[NS] = cf; /* SFN is created */ + return FR_OK; + + +#else /* Non-LFN configuration */ + BYTE b, c, d, *sfn; + int ni, si, i; + const char *p; + + /* Create file name in directory form */ + sfn = dj->fn; + mem_set(sfn, ' ', 11); + si = i = b = 0; ni = 8; + p = *path; +#if _FS_RPATH + if (p[si] == '.') { /* Is this a dot entry? */ + for (;;) { + c = p[si++]; + if (c != '.' || si >= 3) break; + sfn[i++] = c; + } + if (c != '/' && c != '\\' && c > ' ') return FR_INVALID_NAME; + *path = &p[si]; /* Return pointer to the next segment */ + sfn[NS] = (c <= ' ') ? NS_LAST | NS_DOT : NS_DOT; /* Set last segment flag if end of path */ + return FR_OK; + } +#endif + for (;;) { + c = p[si++]; + if (c <= ' ' || c == '/' || c == '\\') break; /* Break on end of segment */ + if (c == '.' || i >= ni) { + if (ni != 8 || c != '.') return FR_INVALID_NAME; + i = 8; ni = 11; + b <<= 2; continue; + } + if (c >= 0x80) { /* Extended char */ +#ifdef _EXCVT + c = cvt[c - 0x80]; /* Convert extend char (SBCS) */ +#else + b |= 3; /* Eliminate NT flag if ext char is exist */ +#if !_DF1S /* ASCII only cfg */ + return FR_INVALID_NAME; +#endif +#endif + } + if (IsDBCS1(c)) { /* DBC 1st byte? */ + d = p[si++]; /* Get 2nd byte */ + if (!IsDBCS2(d) || i >= ni - 1) /* Reject invalid DBC */ + return FR_INVALID_NAME; + sfn[i++] = c; + sfn[i++] = d; + } else { /* Single byte code */ + if (chk_chr(" \"*+,[=]|\x7F", c)) /* Reject illegal chrs for SFN */ + return FR_INVALID_NAME; + if (IsUpper(c)) { /* ASCII large capital? */ + b |= 2; + } else { + if (IsLower(c)) { /* ASCII small capital? */ + b |= 1; c -= 0x20; + } + } + sfn[i++] = c; + } + } + *path = &p[si]; /* Return pointer to the next segment */ + c = (c <= ' ') ? NS_LAST : 0; /* Set last segment flag if end of path */ + + if (!i) return FR_INVALID_NAME; /* Reject null string */ + if (sfn[0] == 0xE5) sfn[0] = 0x05; /* When first char collides with 0xE5, replace it with 0x05 */ + + if (ni == 8) b <<= 2; + if ((b & 0x03) == 0x01) c |= NS_EXT; /* NT flag (Extension has only small capital) */ + if ((b & 0x0C) == 0x04) c |= NS_BODY; /* NT flag (Filename has only small capital) */ + + sfn[NS] = c; /* Store NT flag, File name is created */ + + return FR_OK; +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Get file information from directory entry */ +/*-----------------------------------------------------------------------*/ +#if _FS_MINIMIZE <= 1 +static +void get_fileinfo ( /* No return code */ + DIR *dj, /* Pointer to the directory object */ + FILINFO *fno /* Pointer to the file information to be filled */ +) +{ + int i; + BYTE c, nt, *dir; + char *p; + + + p = fno->fname; + if (dj->sect) { + dir = dj->dir; + nt = dir[DIR_NTres]; /* NT flag */ + for (i = 0; i < 8; i++) { /* Copy name body */ + c = dir[i]; + if (c == ' ') break; + if (c == 0x05) c = 0xE5; + if (_USE_LFN && (nt & NS_BODY) && IsUpper(c)) c += 0x20; + *p++ = c; + } + if (dir[8] != ' ') { /* Copy name extension */ + *p++ = '.'; + for (i = 8; i < 11; i++) { + c = dir[i]; + if (c == ' ') break; + if (_USE_LFN && (nt & NS_EXT) && IsUpper(c)) c += 0x20; + *p++ = c; + } + } + fno->fattrib = dir[DIR_Attr]; /* Attribute */ + fno->fsize = LD_DWORD(dir+DIR_FileSize); /* Size */ + fno->fdate = LD_WORD(dir+DIR_WrtDate); /* Date */ + fno->ftime = LD_WORD(dir+DIR_WrtTime); /* Time */ + } + *p = 0; + +#if _USE_LFN + if (fno->lfname) { + XCHAR *tp = fno->lfname; + WCHAR w, *lfn; + + i = 0; + if (dj->sect && dj->lfn_idx != 0xFFFF) {/* Get LFN if available */ + lfn = dj->lfn; + while ((w = *lfn++) != 0) { /* Get an LFN char */ +#if !_LFN_UNICODE + w = ff_convert(w, 0); /* Unicode -> OEM conversion */ + if (!w) { i = 0; break; } /* Could not convert, no LFN */ + if (_DF1S && w >= 0x100) /* Put 1st byte if it is a DBC */ + tp[i++] = (XCHAR)(w >> 8); +#endif + if (i >= fno->lfsize - 1) { i = 0; break; } /* Buffer overrun, no LFN */ + tp[i++] = (XCHAR)w; + } + } + tp[i] = 0; /* Terminator */ + } +#endif +} +#endif /* _FS_MINIMIZE <= 1 */ + + + + +/*-----------------------------------------------------------------------*/ +/* Follow a file path */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT follow_path ( /* FR_OK(0): successful, !=0: error code */ + DIR *dj, /* Directory object to return last directory and found object */ + const XCHAR *path /* Full-path string to find a file or directory */ +) +{ + FRESULT res; + BYTE *dir, last; + + while (!_USE_LFN && *path == ' ') path++; /* Skip leading spaces */ +#if _FS_RPATH + if (*path == '/' || *path == '\\') { /* There is a heading separator */ + path++; dj->sclust = 0; /* Strip it and start from the root dir */ + } else { /* No heading separator */ + dj->sclust = dj->fs->cdir; /* Start from the current dir */ + } +#else + if (*path == '/' || *path == '\\') /* Strip heading separator if exist */ + path++; + dj->sclust = 0; /* Start from the root dir */ +#endif + + if ((UINT)*path < ' ') { /* Null path means the start directory itself */ + res = dir_seek(dj, 0); + dj->dir = NULL; + + } else { /* Follow path */ + for (;;) { + res = create_name(dj, &path); /* Get a segment */ + if (res != FR_OK) break; + res = dir_find(dj); /* Find it */ + last = *(dj->fn+NS) & NS_LAST; + if (res != FR_OK) { /* Could not find the object */ + if (res == FR_NO_FILE && !last) + res = FR_NO_PATH; + break; + } + if (last) break; /* Last segment match. Function completed. */ + dir = dj->dir; /* There is next segment. Follow the sub directory */ + if (!(dir[DIR_Attr] & AM_DIR)) { /* Cannot follow because it is a file */ + res = FR_NO_PATH; break; + } + dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + } + } + + return res; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Load boot record and check if it is an FAT boot record */ +/*-----------------------------------------------------------------------*/ + +static +BYTE check_fs ( /* 0:The FAT boot record, 1:Valid boot record but not an FAT, 2:Not a boot record, 3:Error */ + FATFS *fs, /* File system object */ + DWORD sect /* Sector# (lba) to check if it is an FAT boot record or not */ +) +{ + if (disk_read(fs->drive, fs->win, sect, 1) != RES_OK) /* Load boot record */ + return 3; + if (LD_WORD(&fs->win[BS_55AA]) != 0xAA55) /* Check record signature (always placed at offset 510 even if the sector size is >512) */ + return 2; + + if ((LD_DWORD(&fs->win[BS_FilSysType]) & 0xFFFFFF) == 0x544146) /* Check "FAT" string */ + return 0; + if ((LD_DWORD(&fs->win[BS_FilSysType32]) & 0xFFFFFF) == 0x544146) + return 0; + + return 1; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Make sure that the file system is valid */ +/*-----------------------------------------------------------------------*/ + + +FRESULT chk_mounted ( /* FR_OK(0): successful, !=0: any error occurred */ + const XCHAR **path, /* Pointer to pointer to the path name (drive number) */ + FATFS **rfs, /* Pointer to pointer to the found file system object */ + BYTE chk_wp /* !=0: Check media write protection for write access */ +) +{ + BYTE fmt, *tbl; + UINT vol; + DSTATUS stat; + DWORD bsect, fsize, tsect, mclst; + const XCHAR *p = *path; + FATFS *fs; + + /* Get logical drive number from the path name */ + vol = p[0] - '0'; /* Is there a drive number? */ + if (vol <= 9 && p[1] == ':') { /* Found a drive number, get and strip it */ + p += 2; *path = p; /* Return pointer to the path name */ + } else { /* No drive number is given */ +#if _FS_RPATH + vol = Drive; /* Use current drive */ +#else + vol = 0; /* Use drive 0 */ +#endif + } + + /* Check if the logical drive is valid or not */ + if (vol >= _DRIVES) /* Is the drive number valid? */ + return FR_INVALID_DRIVE; + *rfs = fs = FatFs[vol]; /* Return pointer to the corresponding file system object */ + if (!fs) return FR_NOT_ENABLED; /* Is the file system object available? */ + + ENTER_FF(fs); /* Lock file system */ + + if (fs->fs_type) { /* If the logical drive has been mounted */ + stat = disk_status(fs->drive); + if (!(stat & STA_NOINIT)) { /* and the physical drive is kept initialized (has not been changed), */ +#if !_FS_READONLY + if (chk_wp && (stat & STA_PROTECT)) /* Check write protection if needed */ + return FR_WRITE_PROTECTED; +#endif + return FR_OK; /* The file system object is valid */ + } + } + + /* The logical drive must be mounted. Following code attempts to mount the volume */ + + fs->fs_type = 0; /* Clear the file system object */ + fs->drive = (BYTE)LD2PD(vol); /* Bind the logical drive and a physical drive */ + stat = disk_initialize(fs->drive); /* Initialize low level disk I/O layer */ + if (stat & STA_NOINIT) /* Check if the drive is ready */ + return FR_NOT_READY; +#if _MAX_SS != 512 /* Get disk sector size if needed */ + if (disk_ioctl(fs->drive, GET_SECTOR_SIZE, &SS(fs)) != RES_OK || SS(fs) > _MAX_SS) + return FR_NO_FILESYSTEM; +#endif +#if !_FS_READONLY + if (chk_wp && (stat & STA_PROTECT)) /* Check disk write protection if needed */ + return FR_WRITE_PROTECTED; +#endif + /* Search FAT partition on the drive */ + fmt = check_fs(fs, bsect = 0); /* Check sector 0 as an SFD format */ + if (fmt == 1) { /* Not an FAT boot record, it may be partitioned */ + /* Check a partition listed in top of the partition table */ + tbl = &fs->win[MBR_Table + LD2PT(vol) * 16]; /* Partition table */ + if (tbl[4]) { /* Is the partition existing? */ + bsect = LD_DWORD(&tbl[8]); /* Partition offset in LBA */ + fmt = check_fs(fs, bsect); /* Check the partition */ + } + } + if (fmt == 3) return FR_DISK_ERR; + if (fmt || LD_WORD(fs->win+BPB_BytsPerSec) != SS(fs)) /* No valid FAT partition is found */ + return FR_NO_FILESYSTEM; + + /* Initialize the file system object */ + fsize = LD_WORD(fs->win+BPB_FATSz16); /* Number of sectors per FAT */ + if (!fsize) fsize = LD_DWORD(fs->win+BPB_FATSz32); + fs->sects_fat = fsize; + fs->n_fats = fs->win[BPB_NumFATs]; /* Number of FAT copies */ + fsize *= fs->n_fats; /* (Number of sectors in FAT area) */ + fs->fatbase = bsect + LD_WORD(fs->win+BPB_RsvdSecCnt); /* FAT start sector (lba) */ + fs->csize = fs->win[BPB_SecPerClus]; /* Number of sectors per cluster */ + fs->n_rootdir = LD_WORD(fs->win+BPB_RootEntCnt); /* Number of root directory entries */ + tsect = LD_WORD(fs->win+BPB_TotSec16); /* Number of sectors on the volume */ + if (!tsect) tsect = LD_DWORD(fs->win+BPB_TotSec32); + fs->max_clust = mclst = (tsect /* Last cluster# + 1 (Number of clusters + 2) */ + - LD_WORD(fs->win+BPB_RsvdSecCnt) - fsize - fs->n_rootdir / (SS(fs)/32) + ) / fs->csize + 2; + + fmt = FS_FAT12; /* Determine the FAT sub type */ + if (mclst >= 0xFF7) fmt = FS_FAT16; /* Number of clusters >= 0xFF5 */ + if (mclst >= 0xFFF7) fmt = FS_FAT32; /* Number of clusters >= 0xFFF5 */ + + if (fmt == FS_FAT32) + fs->dirbase = LD_DWORD(fs->win+BPB_RootClus); /* Root directory start cluster */ + else + fs->dirbase = fs->fatbase + fsize; /* Root directory start sector (lba) */ + fs->database = fs->fatbase + fsize + fs->n_rootdir / (SS(fs)/32); /* Data start sector (lba) */ + +#if !_FS_READONLY + /* Initialize allocation information */ + fs->free_clust = 0xFFFFFFFF; + fs->wflag = 0; + /* Get fsinfo if needed */ + if (fmt == FS_FAT32) { + fs->fsi_flag = 0; + fs->fsi_sector = bsect + LD_WORD(fs->win+BPB_FSInfo); + if (disk_read(fs->drive, fs->win, fs->fsi_sector, 1) == RES_OK && + LD_WORD(fs->win+BS_55AA) == 0xAA55 && + LD_DWORD(fs->win+FSI_LeadSig) == 0x41615252 && + LD_DWORD(fs->win+FSI_StrucSig) == 0x61417272) { + fs->last_clust = LD_DWORD(fs->win+FSI_Nxt_Free); + fs->free_clust = LD_DWORD(fs->win+FSI_Free_Count); + } + } +#endif + fs->fs_type = fmt; /* FAT sub-type */ + fs->winsect = 0; /* Invalidate sector cache */ +#if _FS_RPATH + fs->cdir = 0; /* Current directory (root dir) */ +#endif + fs->id = ++Fsid; /* File system mount ID */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Check if the file/dir object is valid or not */ +/*-----------------------------------------------------------------------*/ + +static +FRESULT validate ( /* FR_OK(0): The object is valid, !=0: Invalid */ + FATFS *fs, /* Pointer to the file system object */ + WORD id /* Member id of the target object to be checked */ +) +{ + if (!fs || !fs->fs_type || fs->id != id) + return FR_INVALID_OBJECT; + + ENTER_FF(fs); /* Lock file system */ + + if (disk_status(fs->drive) & STA_NOINIT) + return FR_NOT_READY; + + return FR_OK; +} + + + + +/*-------------------------------------------------------------------------- + + Public Functions + +--------------------------------------------------------------------------*/ + + + +/*-----------------------------------------------------------------------*/ +/* Mount/Unmount a Logical Drive */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mount ( + BYTE vol, /* Logical drive number to be mounted/unmounted */ + FATFS *fs /* Pointer to new file system object (NULL for unmount)*/ +) +{ + FATFS *rfs; + + + if (vol >= _DRIVES) /* Check if the drive number is valid */ + return FR_INVALID_DRIVE; + rfs = FatFs[vol]; /* Get current fs object */ + + if (rfs) { +#if _FS_REENTRANT /* Discard sync object of the current volume */ + if (!ff_del_syncobj(rfs->sobj)) return FR_INT_ERR; +#endif + rfs->fs_type = 0; /* Clear old fs object */ + } + + if (fs) { + fs->fs_type = 0; /* Clear new fs object */ +#if _FS_REENTRANT /* Create sync object for the new volume */ + if (!ff_cre_syncobj(vol, &fs->sobj)) return FR_INT_ERR; +#endif + } + FatFs[vol] = fs; /* Register new fs object */ + + return FR_OK; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Open or Create a File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_open ( + FIL *fp, /* Pointer to the blank file object */ + const XCHAR *path, /* Pointer to the file name */ + BYTE mode /* Access mode and file open mode flags */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + fp->fs = NULL; /* Clear file object */ +#if !_FS_READONLY + mode &= (FA_READ | FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW); + res = chk_mounted(&path, &dj.fs, (BYTE)(mode & (FA_WRITE | FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW))); +#else + mode &= FA_READ; + res = chk_mounted(&path, &dj.fs, 0); +#endif + if (res != FR_OK) LEAVE_FF(dj.fs, res); + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + +#if !_FS_READONLY + /* Create or Open a file */ + if (mode & (FA_CREATE_ALWAYS | FA_OPEN_ALWAYS | FA_CREATE_NEW)) { + DWORD ps, cl; + + if (res != FR_OK) { /* No file, create new */ + if (res == FR_NO_FILE) /* There is no file to open, create a new entry */ + res = dir_register(&dj); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + mode |= FA_CREATE_ALWAYS; + dir = dj.dir; /* Created entry (SFN entry) */ + } + else { /* Any object is already existing */ + if (mode & FA_CREATE_NEW) /* Cannot create new */ + LEAVE_FF(dj.fs, FR_EXIST); + dir = dj.dir; + if (!dir || (dir[DIR_Attr] & (AM_RDO | AM_DIR))) /* Cannot overwrite it (R/O or DIR) */ + LEAVE_FF(dj.fs, FR_DENIED); + if (mode & FA_CREATE_ALWAYS) { /* Resize it to zero on over write mode */ + cl = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); /* Get start cluster */ + ST_WORD(dir+DIR_FstClusHI, 0); /* cluster = 0 */ + ST_WORD(dir+DIR_FstClusLO, 0); + ST_DWORD(dir+DIR_FileSize, 0); /* size = 0 */ + dj.fs->wflag = 1; + ps = dj.fs->winsect; /* Remove the cluster chain */ + if (cl) { + res = remove_chain(dj.fs, cl); + if (res) LEAVE_FF(dj.fs, res); + dj.fs->last_clust = cl - 1; /* Reuse the cluster hole */ + } + res = move_window(dj.fs, ps); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + } + } + if (mode & FA_CREATE_ALWAYS) { + dir[DIR_Attr] = 0; /* Reset attribute */ + ps = get_fattime(); + ST_DWORD(dir+DIR_CrtTime, ps); /* Created time */ + dj.fs->wflag = 1; + mode |= FA__WRITTEN; /* Set file changed flag */ + } + } + /* Open an existing file */ + else { +#endif /* !_FS_READONLY */ + if (res != FR_OK) LEAVE_FF(dj.fs, res); /* Follow failed */ + dir = dj.dir; + if (!dir || (dir[DIR_Attr] & AM_DIR)) /* It is a directory */ + LEAVE_FF(dj.fs, FR_NO_FILE); +#if !_FS_READONLY + if ((mode & FA_WRITE) && (dir[DIR_Attr] & AM_RDO)) /* R/O violation */ + LEAVE_FF(dj.fs, FR_DENIED); + } + fp->dir_sect = dj.fs->winsect; /* Pointer to the directory entry */ + fp->dir_ptr = dj.dir; +#endif + fp->flag = mode; /* File access mode */ + fp->org_clust = /* File start cluster */ + ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + fp->fsize = LD_DWORD(dir+DIR_FileSize); /* File size */ + fp->fptr = 0; fp->csect = 255; /* File pointer */ + fp->dsect = 0; + fp->fs = dj.fs; fp->id = dj.fs->id; /* Owner file system object of the file */ + + LEAVE_FF(dj.fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_read ( + FIL *fp, /* Pointer to the file object */ + void *buff, /* Pointer to data buffer */ + UINT btr, /* Number of bytes to read */ + UINT *br /* Pointer to number of bytes read */ +) +{ + FRESULT res; + DWORD clst, sect, remain; + UINT rcnt, cc; + BYTE *rbuff = buff; + + + *br = 0; /* Initialize bytes read */ + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_READ)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + remain = fp->fsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr; /* Repeat until all data transferred */ + rbuff += rcnt, fp->fptr += rcnt, *br += rcnt, btr -= rcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->org_clust : get_fat(fp->fs, fp->curr_clust); + if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector offset in the cluster */ + } + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += fp->csect; + cc = btr / SS(fp->fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Read maximum contiguous sectors directly */ + if (fp->csect + cc > fp->fs->csize) /* Clip at cluster boundary */ + cc = fp->fs->csize - fp->csect; + if (disk_read(fp->fs->drive, rbuff, sect, (BYTE)cc) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#if !_FS_READONLY && _FS_MINIMIZE <= 2 +#if _FS_TINY + if (fp->fs->wflag && fp->fs->winsect - sect < cc) /* Replace one of the read sectors with cached data if it contains a dirty sector */ + mem_cpy(rbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), fp->fs->win, SS(fp->fs)); +#else + if ((fp->flag & FA__DIRTY) && fp->dsect - sect < cc) /* Replace one of the read sectors with cached data if it contains a dirty sector */ + mem_cpy(rbuff + ((fp->dsect - sect) * SS(fp->fs)), fp->buf, SS(fp->fs)); +#endif +#endif + fp->csect += (BYTE)cc; /* Next sector address in the cluster */ + rcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ + continue; + } +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Write sector I/O buffer if needed */ + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + if (fp->dsect != sect) { /* Fill sector buffer with file data */ + if (disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + } +#endif + fp->dsect = sect; + fp->csect++; /* Next sector address in the cluster */ + } + rcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Get partial sector data from sector buffer */ + if (rcnt > btr) rcnt = btr; +#if _FS_TINY + if (move_window(fp->fs, fp->dsect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + mem_cpy(rbuff, &fp->fs->win[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ +#else + mem_cpy(rbuff, &fp->buf[fp->fptr % SS(fp->fs)], rcnt); /* Pick partial sector */ +#endif + } + + LEAVE_FF(fp->fs, FR_OK); +} + + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Write File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_write ( + FIL *fp, /* Pointer to the file object */ + const void *buff, /* Pointer to the data to be written */ + UINT btw, /* Number of bytes to write */ + UINT *bw /* Pointer to number of bytes written */ +) +{ + FRESULT res; + DWORD clst, sect; + UINT wcnt, cc; + const BYTE *wbuff = buff; + + + *bw = 0; /* Initialize bytes written */ + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_WRITE)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + if (fp->fsize + btw < fp->fsize) btw = 0; /* File size cannot reach 4GB */ + + for ( ; btw; /* Repeat until all data transferred */ + wbuff += wcnt, fp->fptr += wcnt, *bw += wcnt, btw -= wcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ + if (fp->fptr == 0) { /* On the top of the file? */ + clst = fp->org_clust; /* Follow from the origin */ + if (clst == 0) /* When there is no cluster chain, */ + fp->org_clust = clst = create_chain(fp->fs, 0); /* Create a new cluster chain */ + } else { /* Middle or end of the file */ + clst = create_chain(fp->fs, fp->curr_clust); /* Follow or stretch cluster chain */ + } + if (clst == 0) break; /* Could not allocate a new cluster (disk full) */ + if (clst == 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector address in the cluster */ + } +#if _FS_TINY + if (fp->fs->winsect == fp->dsect && move_window(fp->fs, 0)) /* Write back data buffer prior to following direct transfer */ + ABORT(fp->fs, FR_DISK_ERR); +#else + if (fp->flag & FA__DIRTY) { /* Write back data buffer prior to following direct transfer */ + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += fp->csect; + cc = btw / SS(fp->fs); /* When remaining bytes >= sector size, */ + if (cc) { /* Write maximum contiguous sectors directly */ + if (fp->csect + cc > fp->fs->csize) /* Clip at cluster boundary */ + cc = fp->fs->csize - fp->csect; + if (disk_write(fp->fs->drive, wbuff, sect, (BYTE)cc) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#if _FS_TINY + if (fp->fs->winsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */ + mem_cpy(fp->fs->win, wbuff + ((fp->fs->winsect - sect) * SS(fp->fs)), SS(fp->fs)); + fp->fs->wflag = 0; + } +#else + if (fp->dsect - sect < cc) { /* Refill sector cache if it gets dirty by the direct write */ + mem_cpy(fp->buf, wbuff + ((fp->dsect - sect) * SS(fp->fs)), SS(fp->fs)); + fp->flag &= ~FA__DIRTY; + } +#endif + fp->csect += (BYTE)cc; /* Next sector address in the cluster */ + wcnt = SS(fp->fs) * cc; /* Number of bytes transferred */ + continue; + } +#if _FS_TINY + if (fp->fptr >= fp->fsize) { /* Avoid silly buffer filling at growing edge */ + if (move_window(fp->fs, 0)) ABORT(fp->fs, FR_DISK_ERR); + fp->fs->winsect = sect; + } +#else + if (fp->dsect != sect) { /* Fill sector buffer with file data */ + if (fp->fptr < fp->fsize && + disk_read(fp->fs->drive, fp->buf, sect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + } +#endif + fp->dsect = sect; + fp->csect++; /* Next sector address in the cluster */ + } + wcnt = SS(fp->fs) - (fp->fptr % SS(fp->fs)); /* Put partial sector into file I/O buffer */ + if (wcnt > btw) wcnt = btw; +#if _FS_TINY + if (move_window(fp->fs, fp->dsect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + mem_cpy(&fp->fs->win[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ + fp->fs->wflag = 1; +#else + mem_cpy(&fp->buf[fp->fptr % SS(fp->fs)], wbuff, wcnt); /* Fit partial sector */ + fp->flag |= FA__DIRTY; +#endif + } + + if (fp->fptr > fp->fsize) fp->fsize = fp->fptr; /* Update file size if needed */ + fp->flag |= FA__WRITTEN; /* Set file changed flag */ + + LEAVE_FF(fp->fs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Synchronize the File Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_sync ( + FIL *fp /* Pointer to the file object */ +) +{ + FRESULT res; + DWORD tim; + BYTE *dir; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res == FR_OK) { + if (fp->flag & FA__WRITTEN) { /* Has the file been written? */ +#if !_FS_TINY /* Write-back dirty buffer */ + if (fp->flag & FA__DIRTY) { + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + LEAVE_FF(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + /* Update the directory entry */ + res = move_window(fp->fs, fp->dir_sect); + if (res == FR_OK) { + dir = fp->dir_ptr; + dir[DIR_Attr] |= AM_ARC; /* Set archive bit */ + ST_DWORD(dir+DIR_FileSize, fp->fsize); /* Update file size */ + ST_WORD(dir+DIR_FstClusLO, fp->org_clust); /* Update start cluster */ + ST_WORD(dir+DIR_FstClusHI, fp->org_clust >> 16); + tim = get_fattime(); /* Updated time */ + ST_DWORD(dir+DIR_WrtTime, tim); + fp->flag &= ~FA__WRITTEN; + fp->fs->wflag = 1; + res = sync(fp->fs); + } + } + } + + LEAVE_FF(fp->fs, res); +} + +#endif /* !_FS_READONLY */ + + + + +/*-----------------------------------------------------------------------*/ +/* Close File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_close ( + FIL *fp /* Pointer to the file object to be closed */ +) +{ + FRESULT res; + + +#if _FS_READONLY + res = validate(fp->fs, fp->id); + if (res == FR_OK) fp->fs = NULL; + LEAVE_FF(fp->fs, res); +#else + res = f_sync(fp); + if (res == FR_OK) fp->fs = NULL; + return res; +#endif +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Current Drive/Directory */ +/*-----------------------------------------------------------------------*/ + +#if _FS_RPATH + +FRESULT f_chdrive ( + BYTE drv /* Drive number */ +) +{ + if (drv >= _DRIVES) return FR_INVALID_DRIVE; + + Drive = drv; + + return FR_OK; +} + + + + +FRESULT f_chdir ( + const XCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = chk_mounted(&path, &dj.fs, 0); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + dir = dj.dir; /* Pointer to the entry */ + if (!dir) { + dj.fs->cdir = 0; /* No entry (root dir) */ + } else { + if (dir[DIR_Attr] & AM_DIR) /* Reached to the dir */ + dj.fs->cdir = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + else + res = FR_NO_PATH; /* Could not reach the dir (it is a file) */ + } + } + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(dj.fs, res); +} + +#endif + + + +#if _FS_MINIMIZE <= 2 +/*-----------------------------------------------------------------------*/ +/* Seek File R/W Pointer */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_lseek ( + FIL *fp, /* Pointer to the file object */ + DWORD ofs /* File pointer from top of file */ +) +{ + FRESULT res; + DWORD clst, bcs, nsect, ifptr; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (ofs > fp->fsize /* In read-only mode, clip offset with the file size */ +#if !_FS_READONLY + && !(fp->flag & FA_WRITE) +#endif + ) ofs = fp->fsize; + + ifptr = fp->fptr; + fp->fptr = nsect = 0; fp->csect = 255; + if (ofs > 0) { + bcs = (DWORD)fp->fs->csize * SS(fp->fs); /* Cluster size (byte) */ + if (ifptr > 0 && + (ofs - 1) / bcs >= (ifptr - 1) / bcs) { /* When seek to same or following cluster, */ + fp->fptr = (ifptr - 1) & ~(bcs - 1); /* start from the current cluster */ + ofs -= fp->fptr; + clst = fp->curr_clust; + } else { /* When seek to back cluster, */ + clst = fp->org_clust; /* start from the first cluster */ +#if !_FS_READONLY + if (clst == 0) { /* If no cluster chain, create a new chain */ + clst = create_chain(fp->fs, 0); + if (clst == 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->org_clust = clst; + } +#endif + fp->curr_clust = clst; + } + if (clst != 0) { + while (ofs > bcs) { /* Cluster following loop */ +#if !_FS_READONLY + if (fp->flag & FA_WRITE) { /* Check if in write mode or not */ + clst = create_chain(fp->fs, clst); /* Force stretch if in write mode */ + if (clst == 0) { /* When disk gets full, clip file size */ + ofs = bcs; break; + } + } else +#endif + clst = get_fat(fp->fs, clst); /* Follow cluster chain if not in write mode */ + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + if (clst <= 1 || clst >= fp->fs->max_clust) ABORT(fp->fs, FR_INT_ERR); + fp->curr_clust = clst; + fp->fptr += bcs; + ofs -= bcs; + } + fp->fptr += ofs; + fp->csect = (BYTE)(ofs / SS(fp->fs)); /* Sector offset in the cluster */ + if (ofs % SS(fp->fs)) { + nsect = clust2sect(fp->fs, clst); /* Current sector */ + if (!nsect) ABORT(fp->fs, FR_INT_ERR); + nsect += fp->csect; + fp->csect++; + } + } + } + if (fp->fptr % SS(fp->fs) && nsect != fp->dsect) { +#if !_FS_TINY +#if !_FS_READONLY + if (fp->flag & FA__DIRTY) { /* Write-back dirty buffer if needed */ + if (disk_write(fp->fs->drive, fp->buf, fp->dsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); + fp->flag &= ~FA__DIRTY; + } +#endif + if (disk_read(fp->fs->drive, fp->buf, nsect, 1) != RES_OK) + ABORT(fp->fs, FR_DISK_ERR); +#endif + fp->dsect = nsect; + } +#if !_FS_READONLY + if (fp->fptr > fp->fsize) { /* Set changed flag if the file size is extended */ + fp->fsize = fp->fptr; + fp->flag |= FA__WRITTEN; + } +#endif + + LEAVE_FF(fp->fs, res); +} + + + + +#if _FS_MINIMIZE <= 1 +/*-----------------------------------------------------------------------*/ +/* Create a Directroy Object */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_opendir ( + DIR *dj, /* Pointer to directory object to create */ + const XCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + NAMEBUF(sfn, lfn); + BYTE *dir; + + res = chk_mounted(&path, &dj->fs, 0); + if (res == FR_OK) { + INITBUF((*dj), sfn, lfn); + res = follow_path(dj, path); /* Follow the path to the directory */ + if (res == FR_OK) { /* Follow completed */ + dir = dj->dir; + if (dir) { /* It is not the root dir */ + if (dir[DIR_Attr] & AM_DIR) { /* The object is a directory */ + dj->sclust = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + } else { /* The object is not a directory */ + res = FR_NO_PATH; + } + } + if (res == FR_OK) { + dj->id = dj->fs->id; + res = dir_seek(dj, 0); /* Rewind dir */ + } + } + if (res == FR_NO_FILE) res = FR_NO_PATH; + } + + LEAVE_FF(dj->fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Read Directory Entry in Sequense */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_readdir ( + DIR *dj, /* Pointer to the open directory object */ + FILINFO *fno /* Pointer to file information to return */ +) +{ + FRESULT res; + NAMEBUF(sfn, lfn); + + + res = validate(dj->fs, dj->id); /* Check validity of the object */ + if (res == FR_OK) { + INITBUF((*dj), sfn, lfn); + if (!fno) { + res = dir_seek(dj, 0); + } else { + res = dir_read(dj); + if (res == FR_NO_FILE) { + dj->sect = 0; + res = FR_OK; + } + if (res == FR_OK) { /* A valid entry is found */ + get_fileinfo(dj, fno); /* Get the object information */ + res = dir_next(dj, FALSE); /* Increment index for next */ + if (res == FR_NO_FILE) { + dj->sect = 0; + res = FR_OK; + } + } + } + } + + LEAVE_FF(dj->fs, res); +} + + + +#if _FS_MINIMIZE == 0 +/*-----------------------------------------------------------------------*/ +/* Get File Status */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_stat ( + const XCHAR *path, /* Pointer to the file path */ + FILINFO *fno /* Pointer to file information to return */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + + + res = chk_mounted(&path, &dj.fs, 0); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) { /* Follow completed */ + if (dj.dir) /* Found an object */ + get_fileinfo(&dj, fno); + else /* It is root dir */ + res = FR_INVALID_NAME; + } + } + + LEAVE_FF(dj.fs, res); +} + + + +#if !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Get Number of Free Clusters */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_getfree ( + const XCHAR *path, /* Pointer to the logical drive number (root dir) */ + DWORD *nclst, /* Pointer to the variable to return number of free clusters */ + FATFS **fatfs /* Pointer to pointer to corresponding file system object to return */ +) +{ + FRESULT res; + DWORD n, clst, sect, stat; + UINT i; + BYTE fat, *p; + + + /* Get drive number */ + res = chk_mounted(&path, fatfs, 0); + if (res != FR_OK) LEAVE_FF(*fatfs, res); + + /* If number of free cluster is valid, return it without cluster scan. */ + if ((*fatfs)->free_clust <= (*fatfs)->max_clust - 2) { + *nclst = (*fatfs)->free_clust; + LEAVE_FF(*fatfs, FR_OK); + } + + /* Get number of free clusters */ + fat = (*fatfs)->fs_type; + n = 0; + if (fat == FS_FAT12) { + clst = 2; + do { + stat = get_fat(*fatfs, clst); + if (stat == 0xFFFFFFFF) LEAVE_FF(*fatfs, FR_DISK_ERR); + if (stat == 1) LEAVE_FF(*fatfs, FR_INT_ERR); + if (stat == 0) n++; + } while (++clst < (*fatfs)->max_clust); + } else { + clst = (*fatfs)->max_clust; + sect = (*fatfs)->fatbase; + i = 0; p = 0; + do { + if (!i) { + res = move_window(*fatfs, sect++); + if (res != FR_OK) + LEAVE_FF(*fatfs, res); + p = (*fatfs)->win; + i = SS(*fatfs); + } + if (fat == FS_FAT16) { + if (LD_WORD(p) == 0) n++; + p += 2; i -= 2; + } else { + if ((LD_DWORD(p) & 0x0FFFFFFF) == 0) n++; + p += 4; i -= 4; + } + } while (--clst); + } + (*fatfs)->free_clust = n; + if (fat == FS_FAT32) (*fatfs)->fsi_flag = 1; + *nclst = n; + + LEAVE_FF(*fatfs, FR_OK); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Truncate File */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_truncate ( + FIL *fp /* Pointer to the file object */ +) +{ + FRESULT res; + DWORD ncl; + + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check abort flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_WRITE)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + + if (fp->fsize > fp->fptr) { + fp->fsize = fp->fptr; /* Set file size to current R/W point */ + fp->flag |= FA__WRITTEN; + if (fp->fptr == 0) { /* When set file size to zero, remove entire cluster chain */ + res = remove_chain(fp->fs, fp->org_clust); + fp->org_clust = 0; + } else { /* When truncate a part of the file, remove remaining clusters */ + ncl = get_fat(fp->fs, fp->curr_clust); + res = FR_OK; + if (ncl == 0xFFFFFFFF) res = FR_DISK_ERR; + if (ncl == 1) res = FR_INT_ERR; + if (res == FR_OK && ncl < fp->fs->max_clust) { + res = put_fat(fp->fs, fp->curr_clust, 0x0FFFFFFF); + if (res == FR_OK) res = remove_chain(fp->fs, ncl); + } + } + } + if (res != FR_OK) fp->flag |= FA__ERROR; + + LEAVE_FF(fp->fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Delete a File or Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_unlink ( + const XCHAR *path /* Pointer to the file or directory path */ +) +{ + FRESULT res; + DIR dj, sdj; + NAMEBUF(sfn, lfn); + BYTE *dir; + DWORD dclst; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res != FR_OK) LEAVE_FF(dj.fs, res); /* Follow failed */ + + dir = dj.dir; + if (!dir) /* Is it the root directory? */ + LEAVE_FF(dj.fs, FR_INVALID_NAME); + if (dir[DIR_Attr] & AM_RDO) /* Is it a R/O object? */ + LEAVE_FF(dj.fs, FR_DENIED); + dclst = ((DWORD)LD_WORD(dir+DIR_FstClusHI) << 16) | LD_WORD(dir+DIR_FstClusLO); + + if (dir[DIR_Attr] & AM_DIR) { /* It is a sub-directory */ + if (dclst < 2) LEAVE_FF(dj.fs, FR_INT_ERR); + mem_cpy(&sdj, &dj, sizeof(DIR)); /* Check if the sub-dir is empty or not */ + sdj.sclust = dclst; + res = dir_seek(&sdj, 2); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + res = dir_read(&sdj); + if (res == FR_OK) res = FR_DENIED; /* Not empty sub-dir */ + if (res != FR_NO_FILE) LEAVE_FF(dj.fs, res); + } + + res = dir_remove(&dj); /* Remove directory entry */ + if (res == FR_OK) { + if (dclst) + res = remove_chain(dj.fs, dclst); /* Remove the cluster chain */ + if (res == FR_OK) res = sync(dj.fs); + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Create a Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_mkdir ( + const XCHAR *path /* Pointer to the directory path */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir, n; + DWORD dsect, dclst, pclst, tim; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (res == FR_OK) res = FR_EXIST; /* Any file or directory is already existing */ + if (_FS_RPATH && res == FR_NO_FILE && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res != FR_NO_FILE) /* Any error occurred */ + LEAVE_FF(dj.fs, res); + + dclst = create_chain(dj.fs, 0); /* Allocate a new cluster for new directory table */ + res = FR_OK; + if (dclst == 0) res = FR_DENIED; + if (dclst == 1) res = FR_INT_ERR; + if (dclst == 0xFFFFFFFF) res = FR_DISK_ERR; + if (res == FR_OK) + res = move_window(dj.fs, 0); + if (res != FR_OK) LEAVE_FF(dj.fs, res); + dsect = clust2sect(dj.fs, dclst); + + dir = dj.fs->win; /* Initialize the new directory table */ + mem_set(dir, 0, SS(dj.fs)); + mem_set(dir+DIR_Name, ' ', 8+3); /* Create "." entry */ + dir[DIR_Name] = '.'; + dir[DIR_Attr] = AM_DIR; + tim = get_fattime(); + ST_DWORD(dir+DIR_WrtTime, tim); + ST_WORD(dir+DIR_FstClusLO, dclst); + ST_WORD(dir+DIR_FstClusHI, dclst >> 16); + mem_cpy(dir+32, dir, 32); /* Create ".." entry */ + dir[33] = '.'; + pclst = dj.sclust; + if (dj.fs->fs_type == FS_FAT32 && pclst == dj.fs->dirbase) + pclst = 0; + ST_WORD(dir+32+DIR_FstClusLO, pclst); + ST_WORD(dir+32+DIR_FstClusHI, pclst >> 16); + for (n = 0; n < dj.fs->csize; n++) { /* Write dot entries and clear left sectors */ + dj.fs->winsect = dsect++; + dj.fs->wflag = 1; + res = move_window(dj.fs, 0); + if (res) LEAVE_FF(dj.fs, res); + mem_set(dir, 0, SS(dj.fs)); + } + + res = dir_register(&dj); + if (res != FR_OK) { + remove_chain(dj.fs, dclst); + } else { + dir = dj.dir; + dir[DIR_Attr] = AM_DIR; /* Attribute */ + ST_DWORD(dir+DIR_WrtTime, tim); /* Create time */ + ST_WORD(dir+DIR_FstClusLO, dclst); /* Table start cluster */ + ST_WORD(dir+DIR_FstClusHI, dclst >> 16); + dj.fs->wflag = 1; + res = sync(dj.fs); + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change File Attribute */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_chmod ( + const XCHAR *path, /* Pointer to the file path */ + BYTE value, /* Attribute bits */ + BYTE mask /* Attribute mask to change */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res == FR_OK) { + dir = dj.dir; + if (!dir) { /* Is it a root directory? */ + res = FR_INVALID_NAME; + } else { /* File or sub directory */ + mask &= AM_RDO|AM_HID|AM_SYS|AM_ARC; /* Valid attribute mask */ + dir[DIR_Attr] = (value & mask) | (dir[DIR_Attr] & (BYTE)~mask); /* Apply attribute change */ + dj.fs->wflag = 1; + res = sync(dj.fs); + } + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Change Timestamp */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_utime ( + const XCHAR *path, /* Pointer to the file/directory name */ + const FILINFO *fno /* Pointer to the time-stamp to be set */ +) +{ + FRESULT res; + DIR dj; + NAMEBUF(sfn, lfn); + BYTE *dir; + + + res = chk_mounted(&path, &dj.fs, 1); + if (res == FR_OK) { + INITBUF(dj, sfn, lfn); + res = follow_path(&dj, path); /* Follow the file path */ + if (_FS_RPATH && res == FR_OK && (dj.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + if (res == FR_OK) { + dir = dj.dir; + if (!dir) { /* Root directory */ + res = FR_INVALID_NAME; + } else { /* File or sub-directory */ + ST_WORD(dir+DIR_WrtTime, fno->ftime); + ST_WORD(dir+DIR_WrtDate, fno->fdate); + dj.fs->wflag = 1; + res = sync(dj.fs); + } + } + } + + LEAVE_FF(dj.fs, res); +} + + + + +/*-----------------------------------------------------------------------*/ +/* Rename File/Directory */ +/*-----------------------------------------------------------------------*/ + +FRESULT f_rename ( + const XCHAR *path_old, /* Pointer to the old name */ + const XCHAR *path_new /* Pointer to the new name */ +) +{ + FRESULT res; + DIR dj_old, dj_new; + NAMEBUF(sfn, lfn); + BYTE buf[21], *dir; + DWORD dw; + + + INITBUF(dj_old, sfn, lfn); + res = chk_mounted(&path_old, &dj_old.fs, 1); + if (res == FR_OK) { + dj_new.fs = dj_old.fs; + res = follow_path(&dj_old, path_old); /* Check old object */ + if (_FS_RPATH && res == FR_OK && (dj_old.fn[NS] & NS_DOT)) + res = FR_INVALID_NAME; + } + if (res != FR_OK) LEAVE_FF(dj_old.fs, res); /* The old object is not found */ + + if (!dj_old.dir) LEAVE_FF(dj_old.fs, FR_NO_FILE); /* Is root dir? */ + mem_cpy(buf, dj_old.dir+DIR_Attr, 21); /* Save the object information */ + + mem_cpy(&dj_new, &dj_old, sizeof(DIR)); + res = follow_path(&dj_new, path_new); /* Check new object */ + if (res == FR_OK) res = FR_EXIST; /* The new object name is already existing */ + if (res == FR_NO_FILE) { /* Is it a valid path and no name collision? */ + res = dir_register(&dj_new); /* Register the new object */ + if (res == FR_OK) { + dir = dj_new.dir; /* Copy object information into new entry */ + mem_cpy(dir+13, buf+2, 19); + dir[DIR_Attr] = buf[0] | AM_ARC; + dj_old.fs->wflag = 1; + if (dir[DIR_Attr] & AM_DIR) { /* Update .. entry in the directory if needed */ + dw = clust2sect(dj_new.fs, (DWORD)LD_WORD(dir+DIR_FstClusHI) | LD_WORD(dir+DIR_FstClusLO)); + if (!dw) { + res = FR_INT_ERR; + } else { + res = move_window(dj_new.fs, dw); + dir = dj_new.fs->win+32; + if (res == FR_OK && dir[1] == '.') { + dw = (dj_new.fs->fs_type == FS_FAT32 && dj_new.sclust == dj_new.fs->dirbase) ? 0 : dj_new.sclust; + ST_WORD(dir+DIR_FstClusLO, dw); + ST_WORD(dir+DIR_FstClusHI, dw >> 16); + dj_new.fs->wflag = 1; + } + } + } + if (res == FR_OK) { + res = dir_remove(&dj_old); /* Remove old entry */ + if (res == FR_OK) + res = sync(dj_old.fs); + } + } + } + + LEAVE_FF(dj_old.fs, res); +} + +#endif /* !_FS_READONLY */ +#endif /* _FS_MINIMIZE == 0 */ +#endif /* _FS_MINIMIZE <= 1 */ +#endif /* _FS_MINIMIZE <= 2 */ + + + +/*-----------------------------------------------------------------------*/ +/* Forward data to the stream directly (Available on only _FS_TINY cfg) */ +/*-----------------------------------------------------------------------*/ +#if _USE_FORWARD && _FS_TINY + +FRESULT f_forward ( + FIL *fp, /* Pointer to the file object */ + UINT (*func)(const BYTE*,UINT), /* Pointer to the streaming function */ + UINT btr, /* Number of bytes to forward */ + UINT *bf /* Pointer to number of bytes forwarded */ +) +{ + FRESULT res; + DWORD remain, clst, sect; + UINT rcnt; + + + *bf = 0; + + res = validate(fp->fs, fp->id); /* Check validity of the object */ + if (res != FR_OK) LEAVE_FF(fp->fs, res); + if (fp->flag & FA__ERROR) /* Check error flag */ + LEAVE_FF(fp->fs, FR_INT_ERR); + if (!(fp->flag & FA_READ)) /* Check access mode */ + LEAVE_FF(fp->fs, FR_DENIED); + + remain = fp->fsize - fp->fptr; + if (btr > remain) btr = (UINT)remain; /* Truncate btr by remaining bytes */ + + for ( ; btr && (*func)(NULL, 0); /* Repeat until all data transferred or stream becomes busy */ + fp->fptr += rcnt, *bf += rcnt, btr -= rcnt) { + if ((fp->fptr % SS(fp->fs)) == 0) { /* On the sector boundary? */ + if (fp->csect >= fp->fs->csize) { /* On the cluster boundary? */ + clst = (fp->fptr == 0) ? /* On the top of the file? */ + fp->org_clust : get_fat(fp->fs, fp->curr_clust); + if (clst <= 1) ABORT(fp->fs, FR_INT_ERR); + if (clst == 0xFFFFFFFF) ABORT(fp->fs, FR_DISK_ERR); + fp->curr_clust = clst; /* Update current cluster */ + fp->csect = 0; /* Reset sector address in the cluster */ + } + fp->csect++; /* Next sector address in the cluster */ + } + sect = clust2sect(fp->fs, fp->curr_clust); /* Get current data sector */ + if (!sect) ABORT(fp->fs, FR_INT_ERR); + sect += fp->csect - 1; + if (move_window(fp->fs, sect)) /* Move sector window */ + ABORT(fp->fs, FR_DISK_ERR); + fp->dsect = sect; + rcnt = SS(fp->fs) - (WORD)(fp->fptr % SS(fp->fs)); /* Forward data from sector window */ + if (rcnt > btr) rcnt = btr; + rcnt = (*func)(&fp->fs->win[(WORD)fp->fptr % SS(fp->fs)], rcnt); + if (!rcnt) ABORT(fp->fs, FR_INT_ERR); + } + + LEAVE_FF(fp->fs, FR_OK); +} +#endif /* _USE_FORWARD */ + + + +#if _USE_MKFS && !_FS_READONLY +/*-----------------------------------------------------------------------*/ +/* Create File System on the Drive */ +/*-----------------------------------------------------------------------*/ +#define N_ROOTDIR 512 /* Multiple of 32 and <= 2048 */ +#define N_FATS 1 /* 1 or 2 */ +#define MAX_SECTOR 131072000UL /* Maximum partition size */ +#define MIN_SECTOR 2000UL /* Minimum partition size */ + + +FRESULT f_mkfs ( + BYTE drv, /* Logical drive number */ + BYTE partition, /* Partitioning rule 0:FDISK, 1:SFD */ + WORD allocsize /* Allocation unit size [bytes] */ +) +{ + static const DWORD sstbl[] = { 2048000, 1024000, 512000, 256000, 128000, 64000, 32000, 16000, 8000, 4000, 0 }; + static const WORD cstbl[] = { 32768, 16384, 8192, 4096, 2048, 16384, 8192, 4096, 2048, 1024, 512 }; + BYTE fmt, m, *tbl; + DWORD b_part, b_fat, b_dir, b_data; /* Area offset (LBA) */ + DWORD n_part, n_rsv, n_fat, n_dir; /* Area size */ + DWORD n_clst, d, n; + WORD as; + FATFS *fs; + DSTATUS stat; + + + /* Check validity of the parameters */ + if (drv >= _DRIVES) return FR_INVALID_DRIVE; + if (partition >= 2) return FR_MKFS_ABORTED; + + /* Check mounted drive and clear work area */ + fs = FatFs[drv]; + if (!fs) return FR_NOT_ENABLED; + fs->fs_type = 0; + drv = LD2PD(drv); + + /* Get disk statics */ + stat = disk_initialize(drv); + if (stat & STA_NOINIT) return FR_NOT_READY; + if (stat & STA_PROTECT) return FR_WRITE_PROTECTED; +#if _MAX_SS != 512 /* Get disk sector size */ + if (disk_ioctl(drv, GET_SECTOR_SIZE, &SS(fs)) != RES_OK + || SS(fs) > _MAX_SS) + return FR_MKFS_ABORTED; +#endif + if (disk_ioctl(drv, GET_SECTOR_COUNT, &n_part) != RES_OK || n_part < MIN_SECTOR) + return FR_MKFS_ABORTED; + if (n_part > MAX_SECTOR) n_part = MAX_SECTOR; + b_part = (!partition) ? 63 : 0; /* Boot sector */ + n_part -= b_part; + for (d = 512; d <= 32768U && d != allocsize; d <<= 1) ; /* Check validity of the allocation unit size */ + if (d != allocsize) allocsize = 0; + if (!allocsize) { /* Auto selection of cluster size */ + d = n_part; + for (as = SS(fs); as > 512U; as >>= 1) d >>= 1; + for (n = 0; d < sstbl[n]; n++) ; + allocsize = cstbl[n]; + } + if (allocsize < SS(fs)) allocsize = SS(fs); + + allocsize /= SS(fs); /* Number of sectors per cluster */ + + /* Pre-compute number of clusters and FAT type */ + n_clst = n_part / allocsize; + fmt = FS_FAT12; + if (n_clst >= 0xFF5) fmt = FS_FAT16; + if (n_clst >= 0xFFF5) fmt = FS_FAT32; + + /* Determine offset and size of FAT structure */ + switch (fmt) { + case FS_FAT12: + n_fat = ((n_clst * 3 + 1) / 2 + 3 + SS(fs) - 1) / SS(fs); + n_rsv = 1 + partition; + n_dir = N_ROOTDIR * 32 / SS(fs); + break; + case FS_FAT16: + n_fat = ((n_clst * 2) + 4 + SS(fs) - 1) / SS(fs); + n_rsv = 1 + partition; + n_dir = N_ROOTDIR * 32 / SS(fs); + break; + default: + n_fat = ((n_clst * 4) + 8 + SS(fs) - 1) / SS(fs); + n_rsv = 33 - partition; + n_dir = 0; + } + b_fat = b_part + n_rsv; /* FATs start sector */ + b_dir = b_fat + n_fat * N_FATS; /* Directory start sector */ + b_data = b_dir + n_dir; /* Data start sector */ + + /* Align data start sector to erase block boundary (for flash memory media) */ + if (disk_ioctl(drv, GET_BLOCK_SIZE, &n) != RES_OK) return FR_MKFS_ABORTED; + n = (b_data + n - 1) & ~(n - 1); + n_fat += (n - b_data) / N_FATS; + /* b_dir and b_data are no longer used below */ + + /* Determine number of cluster and final check of validity of the FAT type */ + n_clst = (n_part - n_rsv - n_fat * N_FATS - n_dir) / allocsize; + if ( (fmt == FS_FAT16 && n_clst < 0xFF5) + || (fmt == FS_FAT32 && n_clst < 0xFFF5)) + return FR_MKFS_ABORTED; + + /* Create partition table if needed */ + if (!partition) { + DWORD n_disk = b_part + n_part; + + mem_set(fs->win, 0, SS(fs)); + tbl = fs->win+MBR_Table; + ST_DWORD(tbl, 0x00010180); /* Partition start in CHS */ + if (n_disk < 63UL * 255 * 1024) { /* Partition end in CHS */ + n_disk = n_disk / 63 / 255; + tbl[7] = (BYTE)n_disk; + tbl[6] = (BYTE)((n_disk >> 2) | 63); + } else { + ST_WORD(&tbl[6], 0xFFFF); + } + tbl[5] = 254; + if (fmt != FS_FAT32) /* System ID */ + tbl[4] = (n_part < 0x10000) ? 0x04 : 0x06; + else + tbl[4] = 0x0c; + ST_DWORD(tbl+8, 63); /* Partition start in LBA */ + ST_DWORD(tbl+12, n_part); /* Partition size in LBA */ + ST_WORD(tbl+64, 0xAA55); /* Signature */ + if (disk_write(drv, fs->win, 0, 1) != RES_OK) + return FR_DISK_ERR; + partition = 0xF8; + } else { + partition = 0xF0; + } + + /* Create boot record */ + tbl = fs->win; /* Clear buffer */ + mem_set(tbl, 0, SS(fs)); + ST_DWORD(tbl+BS_jmpBoot, 0x90FEEB); /* Boot code (jmp $, nop) */ + ST_WORD(tbl+BPB_BytsPerSec, SS(fs)); /* Sector size */ + tbl[BPB_SecPerClus] = (BYTE)allocsize; /* Sectors per cluster */ + ST_WORD(tbl+BPB_RsvdSecCnt, n_rsv); /* Reserved sectors */ + tbl[BPB_NumFATs] = N_FATS; /* Number of FATs */ + ST_WORD(tbl+BPB_RootEntCnt, SS(fs) / 32 * n_dir); /* Number of rootdir entries */ + if (n_part < 0x10000) { /* Number of total sectors */ + ST_WORD(tbl+BPB_TotSec16, n_part); + } else { + ST_DWORD(tbl+BPB_TotSec32, n_part); + } + tbl[BPB_Media] = partition; /* Media descriptor */ + ST_WORD(tbl+BPB_SecPerTrk, 63); /* Number of sectors per track */ + ST_WORD(tbl+BPB_NumHeads, 255); /* Number of heads */ + ST_DWORD(tbl+BPB_HiddSec, b_part); /* Hidden sectors */ + n = get_fattime(); /* Use current time as a VSN */ + if (fmt != FS_FAT32) { + ST_DWORD(tbl+BS_VolID, n); /* Volume serial number */ + ST_WORD(tbl+BPB_FATSz16, n_fat); /* Number of sectors per FAT */ + tbl[BS_DrvNum] = 0x80; /* Drive number */ + tbl[BS_BootSig] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab, "NO NAME FAT ", 19); /* Volume label, FAT signature */ + } else { + ST_DWORD(tbl+BS_VolID32, n); /* Volume serial number */ + ST_DWORD(tbl+BPB_FATSz32, n_fat); /* Number of sectors per FAT */ + ST_DWORD(tbl+BPB_RootClus, 2); /* Root directory cluster (2) */ + ST_WORD(tbl+BPB_FSInfo, 1); /* FSInfo record offset (bs+1) */ + ST_WORD(tbl+BPB_BkBootSec, 6); /* Backup boot record offset (bs+6) */ + tbl[BS_DrvNum32] = 0x80; /* Drive number */ + tbl[BS_BootSig32] = 0x29; /* Extended boot signature */ + mem_cpy(tbl+BS_VolLab32, "NO NAME FAT32 ", 19); /* Volume label, FAT signature */ + } + ST_WORD(tbl+BS_55AA, 0xAA55); /* Signature */ + if (SS(fs) > 512U) { + ST_WORD(tbl+SS(fs)-2, 0xAA55); + } + if (disk_write(drv, tbl, b_part+0, 1) != RES_OK) + return FR_DISK_ERR; + if (fmt == FS_FAT32) + disk_write(drv, tbl, b_part+6, 1); + + /* Initialize FAT area */ + for (m = 0; m < N_FATS; m++) { + mem_set(tbl, 0, SS(fs)); /* 1st sector of the FAT */ + if (fmt != FS_FAT32) { + n = (fmt == FS_FAT12) ? 0x00FFFF00 : 0xFFFFFF00; + n |= partition; + ST_DWORD(tbl, n); /* Reserve cluster #0-1 (FAT12/16) */ + } else { + ST_DWORD(tbl+0, 0xFFFFFFF8); /* Reserve cluster #0-1 (FAT32) */ + ST_DWORD(tbl+4, 0xFFFFFFFF); + ST_DWORD(tbl+8, 0x0FFFFFFF); /* Reserve cluster #2 for root dir */ + } + if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + return FR_DISK_ERR; + mem_set(tbl, 0, SS(fs)); /* Following FAT entries are filled by zero */ + for (n = 1; n < n_fat; n++) { + if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + return FR_DISK_ERR; + } + } + + /* Initialize Root directory */ + m = (BYTE)((fmt == FS_FAT32) ? allocsize : n_dir); + do { + if (disk_write(drv, tbl, b_fat++, 1) != RES_OK) + return FR_DISK_ERR; + } while (--m); + + /* Create FSInfo record if needed */ + if (fmt == FS_FAT32) { + ST_WORD(tbl+BS_55AA, 0xAA55); + ST_DWORD(tbl+FSI_LeadSig, 0x41615252); + ST_DWORD(tbl+FSI_StrucSig, 0x61417272); + ST_DWORD(tbl+FSI_Free_Count, n_clst - 1); + ST_DWORD(tbl+FSI_Nxt_Free, 0xFFFFFFFF); + disk_write(drv, tbl, b_part+1, 1); + disk_write(drv, tbl, b_part+7, 1); + } + + return (disk_ioctl(drv, CTRL_SYNC, (void*)NULL) == RES_OK) ? FR_OK : FR_DISK_ERR; +} + +#endif /* _USE_MKFS && !_FS_READONLY */ + + + + +#if _USE_STRFUNC +/*-----------------------------------------------------------------------*/ +/* Get a string from the file */ +/*-----------------------------------------------------------------------*/ +char* f_gets ( + char* buff, /* Pointer to the string buffer to read */ + int len, /* Size of string buffer */ + FIL* fil /* Pointer to the file object */ +) +{ + int i = 0; + char *p = buff; + UINT rc; + + + while (i < len - 1) { /* Read bytes until buffer gets filled */ + f_read(fil, p, 1, &rc); + if (rc != 1) break; /* Break when no data to read */ +#if _USE_STRFUNC >= 2 + if (*p == '\r') continue; /* Strip '\r' */ +#endif + i++; + if (*p++ == '\n') break; /* Break when reached end of line */ + } + *p = 0; + return i ? buff : NULL; /* When no data read (eof or error), return with error. */ +} + + + +#if !_FS_READONLY +#include +/*-----------------------------------------------------------------------*/ +/* Put a character to the file */ +/*-----------------------------------------------------------------------*/ +int f_putc ( + int chr, /* A character to be output */ + FIL* fil /* Pointer to the file object */ +) +{ + UINT bw; + char c; + + +#if _USE_STRFUNC >= 2 + if (chr == '\n') f_putc ('\r', fil); /* LF -> CRLF conversion */ +#endif + if (!fil) { /* Special value may be used to switch the destination to any other device */ + /* put_console(chr); */ + return chr; + } + c = (char)chr; + f_write(fil, &c, 1, &bw); /* Write a byte to the file */ + return bw ? chr : EOF; /* Return the result */ +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a string to the file */ +/*-----------------------------------------------------------------------*/ +int f_puts ( + const char* str, /* Pointer to the string to be output */ + FIL* fil /* Pointer to the file object */ +) +{ + int n; + + + for (n = 0; *str; str++, n++) { + if (f_putc(*str, fil) == EOF) return EOF; + } + return n; +} + + + + +/*-----------------------------------------------------------------------*/ +/* Put a formatted string to the file */ +/*-----------------------------------------------------------------------*/ +int f_printf ( + FIL* fil, /* Pointer to the file object */ + const char* str, /* Pointer to the format string */ + ... /* Optional arguments... */ +) +{ + va_list arp; + UCHAR c, f, r; + ULONG val; + char s[16]; + int i, w, res, cc; + + + va_start(arp, str); + + for (cc = res = 0; cc != EOF; res += cc) { + c = *str++; + if (c == 0) break; /* End of string */ + if (c != '%') { /* Non escape character */ + cc = f_putc(c, fil); + if (cc != EOF) cc = 1; + continue; + } + w = f = 0; + c = *str++; + if (c == '0') { /* Flag: '0' padding */ + f = 1; c = *str++; + } + while (c >= '0' && c <= '9') { /* Precision */ + w = w * 10 + (c - '0'); + c = *str++; + } + if (c == 'l') { /* Prefix: Size is long int */ + f |= 2; c = *str++; + } + if (c == 's') { /* Type is string */ + cc = f_puts(va_arg(arp, char*), fil); + continue; + } + if (c == 'c') { /* Type is character */ + cc = f_putc(va_arg(arp, int), fil); + if (cc != EOF) cc = 1; + continue; + } + r = 0; + if (c == 'd') r = 10; /* Type is signed decimal */ + if (c == 'u') r = 10; /* Type is unsigned decimal */ + if (c == 'X') r = 16; /* Type is unsigned hexdecimal */ + if (r == 0) break; /* Unknown type */ + if (f & 2) { /* Get the value */ + val = (ULONG)va_arg(arp, long); + } else { + val = (c == 'd') ? (ULONG)(long)va_arg(arp, int) : (ULONG)va_arg(arp, unsigned int); + } + /* Put numeral string */ + if (c == 'd') { + if (val & 0x80000000) { + val = 0 - val; + f |= 4; + } + } + i = sizeof(s) - 1; s[i] = 0; + do { + c = (UCHAR)(val % r + '0'); + if (c > '9') c += 7; + s[--i] = c; + val /= r; + } while (i && val); + if (i && (f & 4)) s[--i] = '-'; + w = sizeof(s) - 1 - w; + while (i && i > w) s[--i] = (f & 1) ? '0' : ' '; + cc = f_puts(&s[i], fil); + } + + va_end(arp); + return (cc == EOF) ? cc : res; +} + +#endif /* !_FS_READONLY */ +#endif /* _USE_STRFUNC */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/gd32vf103_it.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/gd32vf103_it.c new file mode 100644 index 0000000..87cf4a1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/gd32vf103_it.c @@ -0,0 +1,63 @@ +/*! + \file gd32vf103_it.c + \brief main interrupt service routines + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usbh_int.h" +#include "drv_usb_hw.h" +#include "gd32vf103_it.h" + +extern usb_core_driver usbh_msc_core; + +extern void usb_timer_irq (void); + +/*! + \brief this function handles USBD interrupt + \param[in] none + \param[out] none + \retval none +*/ +void USBFS_IRQHandler (void) +{ + usbh_isr (&usbh_msc_core); +} + +/*! + \brief this function handles timer2 updata interrupt request. + \param[in] none + \param[out] none + \retval none +*/ +void TIMER2_IRQHandler(void) +{ + usb_timer_irq(); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/gd32vf103_usb_hw.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/gd32vf103_usb_hw.c new file mode 100644 index 0000000..4447273 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/gd32vf103_usb_hw.c @@ -0,0 +1,256 @@ +/*! + \file gd32vf103_usb_hw.c + \brief this file implements the board support package for the USB host library + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include +#include +#include + +#define TIM_MSEC_DELAY 0x01 +#define TIM_USEC_DELAY 0x02 + +#define HOST_POWERSW_PORT_RCC RCU_GPIOD +#define HOST_POWERSW_PORT GPIOD +#define HOST_POWERSW_VBUS GPIO_PIN_13 + +__IO uint32_t delay_time = 0; +__IO uint32_t usbfs_prescaler = 0; +__IO uint32_t timer_prescaler = 5; + +static void hwp_time_set (uint8_t unit); +static void hwp_delay (uint32_t ntime, uint8_t unit); + +/*! + \brief configure USB clock + \param[in] none + \param[out] none + \retval none +*/ +void usb_rcu_config (void) +{ + uint32_t system_clock = rcu_clock_freq_get(CK_SYS); + + if (system_clock == 48000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1; + timer_prescaler = 3; + } else if (system_clock == 72000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV1_5; + timer_prescaler = 5; + } else if (system_clock == 96000000) { + usbfs_prescaler = RCU_CKUSB_CKPLL_DIV2; + timer_prescaler = 7; + } else { + /* reserved */ + } + + rcu_usb_clock_config(usbfs_prescaler); + rcu_periph_clock_enable(RCU_USBFS); +} + +/*! + \brief configure USB global interrupt + \param[in] none + \param[out] none + \retval none +*/ +void usb_intr_config (void) +{ + eclic_irq_enable((uint8_t)USBFS_IRQn, 1, 0); + +#ifdef USB_OTG_FS_LOW_PWR_MGMT_SUPPORT + + /* enable the power module clock */ + rcu_periph_clock_enable(RCU_PMU); + + /* USB wakeup EXTI line configuration */ + exti_interrupt_flag_clear(EXTI_18); + exti_init(EXTI_18, EXTI_INTERRUPT, EXTI_TRIG_RISING); + exti_interrupt_enable(EXTI_18); + + eclic_irq_enable((uint8_t)USBFS_WKUP_IRQn, 3U, 0U); + +#endif /* USBHS_LOW_PWR_MGMT_SUPPORT */ +} + +/*! + \brief drives the VBUS signal through gpio + \param[in] state: VBUS states + \param[out] none + \retval none +*/ +void usb_vbus_drive (uint8_t state) +{ + if (0 == state) + { + /* DISABLE is needed on output of the Power Switch */ + gpio_bit_reset(HOST_POWERSW_PORT, HOST_POWERSW_VBUS); + } + else + { + /*ENABLE the Power Switch by driving the Enable LOW */ + gpio_bit_set(HOST_POWERSW_PORT, HOST_POWERSW_VBUS); + } +} + +/*! + \brief configures the GPIO for the VBUS + \param[in] none + \param[out] none + \retval none +*/ +void usb_vbus_config (void) +{ + rcu_periph_clock_enable(HOST_POWERSW_PORT_RCC); + + gpio_init(HOST_POWERSW_PORT, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, HOST_POWERSW_VBUS); + + /* by default, disable is needed on output of the power switch */ + gpio_bit_set(HOST_POWERSW_PORT, HOST_POWERSW_VBUS); + + /* Delay is need for stabilising the Vbus Low in Reset Condition, + * when Vbus=1 and Reset-button is pressed by user + */ + usb_mdelay (2); +} + +/*! + \brief initializes delay unit using Timer2 + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_init (void) +{ + rcu_periph_clock_enable(RCU_TIMER2); + + eclic_irq_enable(TIMER2_IRQn, 2, 0); +} + +/*! + \brief delay in micro seconds + \param[in] usec: value of delay required in micro seconds + \param[out] none + \retval none +*/ +void usb_udelay (const uint32_t usec) +{ + hwp_delay(usec, TIM_USEC_DELAY); +} + +/*! + \brief delay in milli seconds + \param[in] msec: value of delay required in milli seconds + \param[out] none + \retval none +*/ +void usb_mdelay (const uint32_t msec) +{ + hwp_delay(msec, TIM_MSEC_DELAY); +} + +/*! + \brief timer base IRQ + \param[in] none + \param[out] none + \retval none +*/ +void usb_timer_irq (void) +{ + if (timer_interrupt_flag_get(TIMER2, TIMER_INT_UP) != RESET){ + timer_interrupt_flag_clear(TIMER2, TIMER_INT_UP); + + if (delay_time > 0x00U){ + delay_time--; + } else { + timer_disable(TIMER2); + } + } +} + +/*! + \brief delay routine based on TIM2 + \param[in] ntime: delay Time + \param[in] unit: delay Time unit = mili sec / micro sec + \param[out] none + \retval none +*/ +static void hwp_delay(uint32_t ntime, uint8_t unit) +{ + delay_time = ntime; + hwp_time_set(unit); + + while(delay_time != 0); + + timer_disable(TIMER2); +} + +/*! + \brief configures TIM2 for delay routine based on TIM2 + \param[in] unit: msec /usec + \param[out] none + \retval none +*/ +static void hwp_time_set(uint8_t unit) +{ + timer_parameter_struct timer_basestructure; + + timer_disable(TIMER2); + timer_interrupt_disable(TIMER2, TIMER_INT_UP); + + if (unit == TIM_USEC_DELAY) { + timer_basestructure.period = 11; + } else if(unit == TIM_MSEC_DELAY) { + timer_basestructure.period = 11999; + } else { + /* no operation */ + } + + timer_basestructure.prescaler = timer_prescaler; + timer_basestructure.alignedmode = TIMER_COUNTER_EDGE; + timer_basestructure.counterdirection = TIMER_COUNTER_UP; + timer_basestructure.clockdivision = TIMER_CKDIV_DIV1; + timer_basestructure.repetitioncounter = 0; + + timer_init(TIMER2, &timer_basestructure); + + timer_interrupt_flag_clear(TIMER2, TIMER_INT_UP); + + timer_auto_reload_shadow_enable(TIMER2); + + /* timer2 interrupt enable */ + timer_interrupt_enable(TIMER2, TIMER_INT_UP); + + /* timer2 enable counter */ + timer_enable(TIMER2); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/lcd_font.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/lcd_font.c new file mode 100644 index 0000000..4e872c3 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/lcd_font.c @@ -0,0 +1,709 @@ +/*! + \file lcd_font.c + \brief text fonts driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "lcd_font.h" + +unsigned char const ascii_8x16[1536] = { +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00, +0x18,0x18,0x7C,0xC6,0xC2,0xC0,0x7C,0x06,0x86,0xC6,0x7C,0x18,0x18,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xC2,0xC6,0x0C,0x18,0x30,0x60,0xC6,0x86,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0x6C,0x38,0x76,0xDC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x0C,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0C,0x00,0x00,0x00,0x00, +0x00,0x00,0x30,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6,0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0x0C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xDC,0xC0,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xDE,0xC6,0xC6,0x66,0x3A,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0xE6,0x66,0x6C,0x6C,0x78,0x78,0x6C,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xDE,0x7C,0x0C,0x0E,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x0C,0x06,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x7E,0x7E,0x5A,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x10,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0x6C,0x6C,0x38,0x38,0x6C,0x6C,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC6,0x86,0x0C,0x18,0x30,0x60,0xC2,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x06,0x02,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00,0x00, +0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, +0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0xE0,0x60,0x60,0x78,0x6C,0x66,0x66,0x66,0x66,0xDC,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC0,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x1C,0x0C,0x0C,0x3C,0x6C,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0xCC,0x78,0x00, +0x00,0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, +0x00,0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xEC,0xFE,0xD6,0xD6,0xD6,0xD6,0xD6,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0x0C,0x1E,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x76,0x62,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0x60,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x10,0x30,0x30,0xFC,0x30,0x30,0x30,0x30,0x36,0x1C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0xF8,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0xCC,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00, +0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xC6,0xFE,0x00,0x00,0x00,0x00,0x00 +}; + +/* ASCII Table: each character is 16 column (16dots large) and 24 raw (24 dots high) */ +const uint16_t ASCII_Table_16x24[] = +{ +/** + * @brief Space ' ' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '!' + */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '"' + */ + 0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '#' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60, + 0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318, + 0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000, +/** + * @brief '$' + */ + 0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C, + 0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C, + 0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, +/** + * @brief '%' + */ + 0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611, + 0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460, + 0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000, +/** + * @brief '&' + */ + 0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0, + 0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06, + 0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ''' + */ + 0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '(' + */ + 0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000, +/** + * @brief ')' + */ + 0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300, + 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000, +/** + * @brief '*' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '+' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ',' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, +/** + * @brief '-' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '.' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '/' + */ + 0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300, + 0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0, + 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '0' + */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C, + 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '1' + */ + 0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '2' + */ + 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800, + 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, + 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '3' + */ + 0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600, + 0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18, + 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '4' + */ + 0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60, + 0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00, + 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '5' + */ + 0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC, + 0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18, + 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '6' + */ + 0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC, + 0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '7' + */ + 0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380, + 0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030, + 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '8' + */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638, + 0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38, + 0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '9' + */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C, + 0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C, + 0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ':' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ';' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000, +/** + * @brief '<' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0, + 0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '=' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '>' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0, + 0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '?' + */ + 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00, + 0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '@' + */ + 0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411, + 0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004, + 0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'A' + */ + 0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60, + 0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C, + 0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'B' + */ + 0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C, + 0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C, + 0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'C' + */ + 0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C, + 0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'D' + */ + 0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006, + 0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06, + 0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'E' + */ + 0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'F' + */ + 0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'G' + */ + 0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003, + 0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C, + 0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'H' + */ + 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'I' + */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'J' + */ + 0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738, + 0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'K' + */ + 0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6, + 0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806, + 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'L' + */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'M' + */ + 0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836, + 0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6, + 0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'N' + */ + 0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC, + 0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C, + 0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'O' + */ + 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003, + 0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C, + 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'P' + */ + 0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'Q' + */ + 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003, + 0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C, + 0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'R' + */ + 0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806, + 0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006, + 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'S' + */ + 0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C, + 0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C, + 0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'T' + */ + 0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'U' + */ + 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818, + 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'V' + */ + 0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C, + 0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360, + 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'W' + */ + 0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366, + 0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C, + 0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'X' + */ + 0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0, + 0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C, + 0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'Y' + */ + 0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660, + 0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'Z' + */ + 0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600, + 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006, + 0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '[' + */ + 0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000, +/** + * @brief '\' + */ + 0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0, + 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300, + 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ']' + */ + 0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000, +/** + * @brief '^' + */ + 0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630, + 0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '_' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ''' + */ + 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'a' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8, + 0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C, + 0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'b' + */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8, + 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, + 0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'c' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0, + 0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30, + 0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'd' + */ + 0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0, + 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, + 0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'e' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, + 0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30, + 0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'f' + */ + 0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'g' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8, + 0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18, + 0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000, +/** + * @brief 'h' + */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8, + 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, + 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'i' + */ + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'j' + */ + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000, +/** + * @brief 'k' + */ + 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C, + 0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C, + 0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'l' + */ + 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'm' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF, + 0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, + 0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'n' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8, + 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, + 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'o' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, + 0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30, + 0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'p' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8, + 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, + 0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000, +/** + * @brief 'q' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0, + 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, + 0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000, +/** + * @brief 'r' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0, + 0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 's' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0, + 0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 't' + */ + 0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'u' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818, + 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38, + 0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'v' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18, + 0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360, + 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'w' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1, + 0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C, + 0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'x' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38, + 0x0C30, 0x0660, 0x0360, 0x0360, 0x0360, 0x0360, 0x0660, 0x0C30, + 0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'y' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830, + 0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380, + 0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000, +/** + * @brief 'z' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC, + 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, + 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '{' + */ + 0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000, +/** + * @brief '|' + */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, +/** + * @brief '}' + */ + 0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000, +/** + * @brief '~' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/lcd_log.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/lcd_log.c new file mode 100644 index 0000000..8dd216a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/lcd_log.c @@ -0,0 +1,168 @@ +/*! + \file lcd_log.c + \brief LCD log driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "lcd_log.h" +#include "string.h" + +#include "gd32vf103v_lcd_eval.h" + +uint16_t LINE; + +char_format_struct charform = { + .font = CHAR_FONT_8_16, + .direction = CHAR_DIRECTION_HORIZONTAL, + .char_color = LCD_COLOR_RED, + .bk_color = LCD_COLOR_BLACK +}; + +/*! + \brief initialize the LCD log module + \param[in] none + \param[out] none + \retval none +*/ +void lcd_log_init (void) +{ + lcd_clear(LCD_COLOR_BLACK); +} + +/*! + \brief de-initialize the LCD log module + \param[in] none + \param[out] none + \retval none +*/ +void lcd_log_deinit (void) +{ +} + +/*! + \brief display the application header (title) on the LCD screen + \param[in] p_title: pointer to the string to be displayed + \param[in] start_x: the start x position + \param[out] none + \retval none +*/ +void lcd_log_header_set (uint8_t *p_title, uint16_t start_x) +{ + uint16_t i = 0; + uint16_t str_len = strlen((const char *)p_title); + + lcd_rectangle_fill(210, 0, 240, 320, LCD_COLOR_BLUE); + + charform.bk_color = LCD_COLOR_BLUE; + + for (i = 0; i < str_len; i++) { + lcd_char_display (230, (start_x + 8 * i), p_title[i], charform); + } + +} + +/*! + \brief display the application footer (status) on the LCD screen + \param[in] p_status: pointer to the string to be displayed + \param[in] start_x: the start x position + \param[out] none + \retval none +*/ +void lcd_log_footer_set (uint8_t *p_status, uint16_t start_x) +{ + uint16_t i = 0; + uint16_t str_len = strlen((const char *)p_status); + + lcd_rectangle_fill(0, 0, 30, 320, LCD_COLOR_BLUE); + + + charform.bk_color = LCD_COLOR_BLUE; + + for (i = 0; i < str_len; i++) { + lcd_char_display (20, (start_x + 8 * i), p_status[i], charform); + } + +} + +/*! + \brief clear the text zone + \param[in] start_x: the start x position + \param[in] start_y: the start y position + \param[in] width: the width to clear text zone + \param[in] height: the heitht to clear text zone + \param[out] none + \retval none +*/ +void lcd_log_text_zone_clear(uint16_t start_x, + uint16_t start_y, + uint16_t width, + uint16_t height) +{ + lcd_rectangle_fill(start_x, start_y, width, height, LCD_COLOR_BLACK); +} + +/*! + \brief redirect the printf to the lcd + \param[in] p_str: pointer to string to be displayed + \param[in] offset: the offset to set + \param[in] char_color: the clar color to set + \param[out] none + \retval none +*/ +void lcd_log_print (uint8_t *p_str, uint16_t offset, uint16_t char_color) +{ + uint16_t i; + +#if defined(USE_HOST_MODE) && defined(USE_DEVICE_MODE) + if(LINE <= 60) + { + LINE = 190; + + lcd_rectangle_fill(60, 0, 210, 320, LCD_COLOR_BLACK); + } +#else + if(LINE <= 30) + { + LINE = 190; + + lcd_rectangle_fill(30, 0, 210, 320, LCD_COLOR_BLACK); + } +#endif + + charform.bk_color = LCD_COLOR_BLACK; + charform.char_color = char_color; + + for (i = 0; i < offset; i++) { + lcd_char_display(LINE, (10 + 8 * i), *p_str++, charform); + } + + LINE -= 20; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/system_gd32vf103.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/system_gd32vf103.c new file mode 100644 index 0000000..05e5205 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/system_gd32vf103.c @@ -0,0 +1,998 @@ +/*! + \file system_gd32vf103.h + \brief RISC-V Device Peripheral Access Layer Source File for + GD32VF103 Device Series + +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* This file refers the RISC-V standard, some adjustments are made according to GigaDevice chips */ + +#include "gd32vf103.h" + +/* system frequency define */ +#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */ + +/* select a system clock by uncommenting the following line */ +/* use IRC8M */ +//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000) + +/********************************************************************/ +//#define __SYSTEM_CLOCK_HXTAL (HXTAL_VALUE) +//#define __SYSTEM_CLOCK_24M_PLL_HXTAL (uint32_t)(24000000) +/********************************************************************/ + +//#define __SYSTEM_CLOCK_36M_PLL_HXTAL (uint32_t)(36000000) +//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_56M_PLL_HXTAL (uint32_t)(56000000) +//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000) +#define __SYSTEM_CLOCK_96M_PLL_HXTAL (uint32_t)(96000000) +//#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000) + +#define SEL_IRC8M 0x00U +#define SEL_HXTAL 0x01U +#define SEL_PLL 0x02U + +/* set the system clock frequency and declare the system clock configuration function */ +#ifdef __SYSTEM_CLOCK_48M_PLL_IRC8M +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_IRC8M; +static void system_clock_48m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M; +static void system_clock_72m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_IRC8M; +static void system_clock_108m_irc8m(void); + +#elif defined (__SYSTEM_CLOCK_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; +static void system_clock_hxtal(void); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_24M_PLL_HXTAL; +static void system_clock_24m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_36M_PLL_HXTAL; +static void system_clock_36m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_HXTAL; +static void system_clock_48m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_56M_PLL_HXTAL; +static void system_clock_56m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL; +static void system_clock_72m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_HXTAL; +static void system_clock_96m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL; +static void system_clock_108m_hxtal(void); +#else +uint32_t SystemCoreClock = IRC8M_VALUE; +#endif /* __SYSTEM_CLOCK_48M_PLL_IRC8M */ + +/* configure the system clock */ +static void system_clock_config(void); + +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ +#ifdef __SYSTEM_CLOCK_HXTAL + system_clock_hxtal(); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) + system_clock_24m_hxtal(); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) + system_clock_36m_hxtal(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) + system_clock_48m_hxtal(); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) + system_clock_56m_hxtal(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) + system_clock_72m_hxtal(); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) + system_clock_96m_hxtal(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) + system_clock_108m_hxtal(); + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) + system_clock_48m_irc8m(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) + system_clock_72m_irc8m(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) + system_clock_108m_irc8m(); +#endif /* __SYSTEM_CLOCK_HXTAL */ +} + +/*! + \brief setup the microcontroller system, initialize the system + \param[in] none + \param[out] none + \retval none +*/ +void SystemInit(void) +{ + /* reset the RCC clock configuration to the default reset state */ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* reset SCS, AHBPSC, APB1PSC, APB2PSC, ADCPSC, CKOUT0SEL bits */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_ADCPSC_2 | RCU_CFG0_CKOUT0SEL); + + /* reset HXTALEN, CKMEN, PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + + /* Reset HXTALBPS bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* reset PLLSEL, PREDV0_LSB, PLLMF, USBFSPSC bits */ + + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_PLLMF_4); + RCU_CFG1 = 0x00000000U; + + /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x00FF0000U; + + /* Configure the System clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */ + system_clock_config(); +} + +/*! + \brief update the SystemCoreClock with current core clock retrieved from cpu registers + \param[in] none + \param[out] none + \retval none +*/ +void SystemCoreClockUpdate(void) +{ + uint32_t scss; + uint32_t pllsel, predv0sel, pllmf, ck_src; + uint32_t predv0, predv1, pll1mf; + + scss = GET_BITS(RCU_CFG0, 2, 3); + + switch (scss) + { + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + SystemCoreClock = IRC8M_VALUE; + break; + + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + + if(RCU_PLLSRC_IRC8M_DIV2 == pllsel){ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE / 2U; + }else{ + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + + if(pllmf >= 15U){ + pllmf += 1U; + }else{ + pllmf += 2U; + } + + SystemCoreClock = ck_src * pllmf; + + if(15U == pllmf){ + /* PLL source clock multiply by 6.5 */ + SystemCoreClock = ck_src * 6U + ck_src / 2U; + } + + break; + + /* IRC8M is selected as CK_SYS */ + default: + SystemCoreClock = IRC8M_VALUE; + break; + } +} + +#ifdef __SYSTEM_CLOCK_HXTAL +/*! + \brief configure the system clock to HXTAL + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select HXTAL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; + + /* wait until HXTAL is selected as system clock */ + while(0 == (RCU_CFG0 & RCU_SCSS_HXTAL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +/*! + \brief configure the system clock to 24M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_24m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 6 = 24 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +/*! + \brief configure the system clock to 36M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_36m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 9 = 36 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +/*! + \brief configure the system clock to 48M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL12); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +/*! + \brief configure the system clock to 56M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_56m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 14 = 56 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL14); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +/*! + \brief configure the system clock to 72M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL18); + + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +/*! + \brief configure the system clock to 96M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_96m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + if(HXTAL_VALUE==25000000){ + + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +/*! + \brief configure the system clock to 108M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ + +static void system_clock_108m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL27); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PREDV1_DIV5 | RCU_PLL1_MUL8 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 | RCU_PREDV1_DIV2 | RCU_PLL1_MUL20 | RCU_PLL2_MUL20); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL2 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + + } + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +/*! + \brief configure the system clock to 48M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL12; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +/*! + \brief configure the system clock to 72M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL18; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +/*! + \brief configure the system clock to 108M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL27; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_bbb.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_bbb.c new file mode 100644 index 0000000..eadf765 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_bbb.c @@ -0,0 +1,454 @@ +/*! + \file usbh_msc_bbb.c + \brief USB MSC BBB protocol related functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_transc.h" +#include "drv_usbh_int.h" +#include "usbh_msc_core.h" +#include "usbh_msc_scsi.h" +#include "usbh_msc_bbb.h" + +usbh_cbw_pkt msc_cbw_data; +usbh_csw_pkt msc_csw_data; + +static uint32_t bot_stall_error_count; /* keeps count of stall error cases */ +usbh_botxfer msc_botxfer_param; + +/*! + \brief initialize the mass storage parameters + \param[in] pudev: pointer to usb core instance + \param[out] none + \retval none +*/ +void usbh_msc_init (usb_core_driver *pudev) +{ + if (pudev->host.connect_status) { + msc_cbw_data.field.dCBWSignature = BBB_CBW_SIGNATURE; + msc_cbw_data.field.dCBWTag = USBH_MSC_BOT_CBW_TAG; + msc_cbw_data.field.bCBWLUN = 0; /* only one lun is supported */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + } + + bot_stall_error_count = 0; + + msc_error_count = 0; +} + +/*! + \brief manage the different states of BOT transfer and updates the status to upper layer + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[out] none + \retval none +*/ +void usbh_msc_botxfer (usb_core_driver *pudev, usbh_host *puhost) +{ + uint8_t xfer_dir, index; + static uint32_t remain_len; + static uint8_t *data_pointer, *data_pointer_prev; + static uint8_t error_dir; + + usbh_status status; + + usb_urb_state URB_Status = URB_IDLE; + + if (pudev->host.connect_status) { + switch (msc_botxfer_param.bot_state) { + case USBH_MSC_SEND_CBW: + /* send CBW */ + usbh_data_send (pudev, + &msc_cbw_data.CBWArray[0], + msc_machine.hc_num_out, + BBB_CBW_LENGTH); + + msc_botxfer_param.bot_state_bkp = USBH_MSC_SEND_CBW; + msc_botxfer_param.bot_state = USBH_MSC_SENT_CBW; + break; + + case USBH_MSC_SENT_CBW: + URB_Status = usbh_urbstate_get(pudev, msc_machine.hc_num_out); + + if (URB_Status == URB_DONE) { + bot_stall_error_count = 0; + msc_botxfer_param.bot_state_bkp = USBH_MSC_SENT_CBW; + + /* if the CBW packet is sent successful, then change the state */ + xfer_dir = (msc_cbw_data.field.bmCBWFlags & USB_TRX_MASK); + + if (msc_cbw_data.field.dCBWDataTransferLength != 0) { + remain_len = msc_cbw_data.field.dCBWDataTransferLength; + data_pointer = msc_botxfer_param.xfer_buf; + data_pointer_prev = data_pointer; + + /* if there is data transfer stage */ + if (xfer_dir == USB_TRX_IN) { + /* data direction is IN */ + msc_botxfer_param.bot_state = USBH_MSC_BOT_DATAIN_STATE; + } else { + /* data direction is OUT */ + msc_botxfer_param.bot_state = USBH_MSC_BOT_DATAOUT_STATE; + } + } else { + /* If there is NO Data Transfer Stage */ + msc_botxfer_param.bot_state = USBH_MSC_RECEIVE_CSW_STATE; + } + } else if (URB_Status == URB_NOTREADY) { + msc_botxfer_param.bot_state = msc_botxfer_param.bot_state_bkp; + } else if (URB_Status == URB_STALL) { + error_dir = USBH_MSC_DIR_OUT; + msc_botxfer_param.bot_state = USBH_MSC_BOT_ERROR_OUT; + } + break; + + case USBH_MSC_BOT_DATAIN_STATE: + URB_Status = usbh_urbstate_get(pudev, msc_machine.hc_num_in); + + /* BOT DATA IN stage */ + if ((URB_Status == URB_DONE) || + (msc_botxfer_param.bot_state_bkp != USBH_MSC_BOT_DATAIN_STATE)) { + bot_stall_error_count = 0; + msc_botxfer_param.bot_state_bkp = USBH_MSC_BOT_DATAIN_STATE; + + if (remain_len > msc_machine.msc_bulk_epinsize) { + usbh_data_recev (pudev, + data_pointer, + msc_machine.hc_num_in, + msc_machine.msc_bulk_epinsize); + + remain_len -= msc_machine.msc_bulk_epinsize; + data_pointer = data_pointer + msc_machine.msc_bulk_epinsize; + } else if (remain_len == 0) { + /* if value was 0, and successful transfer, then change the state */ + msc_botxfer_param.bot_state = USBH_MSC_RECEIVE_CSW_STATE; + } else { + usbh_data_recev (pudev, + data_pointer, + msc_machine.hc_num_in, + remain_len); + + remain_len = 0; /* reset this value and keep in same state */ + } + } else if(URB_Status == URB_STALL) { + /* this is data stage stall condition */ + + error_dir = USBH_MSC_DIR_IN; + msc_botxfer_param.bot_state = USBH_MSC_BOT_ERROR_IN; + + /* Refer to USB Mass-Storage Class : BOT (www.usb.org) + 6.7.2 Host expects to receive data from the device + 3. On a STALL condition receiving data, then: + The host shall accept the data received. + The host shall clear the Bulk-In pipe. + 4. The host shall attempt to receive a CSW. + + msc_botxfer_param.bot_state_bkp is used to switch to the Original + state after the ClearFeature Command is issued. + */ + msc_botxfer_param.bot_state_bkp = USBH_MSC_RECEIVE_CSW_STATE; + } + break; + + case USBH_MSC_BOT_DATAOUT_STATE: + /* BOT DATA OUT stage */ + URB_Status = usbh_urbstate_get(pudev, msc_machine.hc_num_out); + if (URB_Status == URB_DONE) { + bot_stall_error_count = 0; + msc_botxfer_param.bot_state_bkp = USBH_MSC_BOT_DATAOUT_STATE; + + if (remain_len > msc_machine.msc_bulk_epoutsize) { + usbh_data_send (pudev, + data_pointer, + msc_machine.hc_num_out, + msc_machine.msc_bulk_epoutsize); + + data_pointer_prev = data_pointer; + data_pointer = data_pointer + msc_machine.msc_bulk_epoutsize; + + remain_len = remain_len - msc_machine.msc_bulk_epoutsize; + } else if (remain_len == 0) { + /* if value was 0, and successful transfer, then change the state */ + msc_botxfer_param.bot_state = USBH_MSC_RECEIVE_CSW_STATE; + } else { + usbh_data_send (pudev, + data_pointer, + msc_machine.hc_num_out, + remain_len); + + remain_len = 0; /* reset this value and keep in same state */ + } + } else if (URB_Status == URB_NOTREADY) { + if (data_pointer != data_pointer_prev) { + usbh_data_send (pudev, + (data_pointer - msc_machine.msc_bulk_epoutsize), + msc_machine.hc_num_out, + msc_machine.msc_bulk_epoutsize); + } else { + usbh_data_send (pudev, + data_pointer, + msc_machine.hc_num_out, + msc_machine.msc_bulk_epoutsize); + } + } else if (URB_Status == URB_STALL) { + error_dir = USBH_MSC_DIR_OUT; + msc_botxfer_param.bot_state = USBH_MSC_BOT_ERROR_OUT; + + /* Refer to USB Mass-Storage Class : BOT (www.usb.org) + 6.7.3 Ho - Host expects to send data to the device + 3. On a STALL condition sending data, then: + " The host shall clear the Bulk-Out pipe. + 4. The host shall attempt to receive a CSW. + + The Above statement will do the clear the Bulk-Out pipe. + The Below statement will help in Getting the CSW. + + msc_botxfer_param.bot_state_bkp is used to switch to the Original + state after the ClearFeature Command is issued. + */ + + msc_botxfer_param.bot_state_bkp = USBH_MSC_RECEIVE_CSW_STATE; + } + break; + + case USBH_MSC_RECEIVE_CSW_STATE: + /* BOT CSW stage */ + /* NOTE: We cannot reset the BOTStallErrorCount here as it may come from the clearFeature from previous command */ + msc_botxfer_param.bot_state_bkp = USBH_MSC_RECEIVE_CSW_STATE; + msc_botxfer_param.xfer_buf = msc_csw_data.CSWArray; + msc_botxfer_param.data_len = USBH_MSC_CSW_MAX_LENGTH; + + for (index = BBB_CSW_LENGTH; index != 0; index--) { + msc_csw_data.CSWArray[index] = 0; + } + + msc_csw_data.CSWArray[0] = 0; + + usbh_data_recev (pudev, + msc_botxfer_param.xfer_buf, + msc_machine.hc_num_in, + USBH_MSC_CSW_MAX_LENGTH); + + msc_botxfer_param.bot_state = USBH_MSC_DECODE_CSW; + break; + + case USBH_MSC_DECODE_CSW: + URB_Status = usbh_urbstate_get(pudev, msc_machine.hc_num_in); + + /* decode CSW */ + if (URB_Status == URB_DONE) { + bot_stall_error_count = 0; + msc_botxfer_param.bot_state_bkp = USBH_MSC_RECEIVE_CSW_STATE; + msc_botxfer_param.msc_state = msc_botxfer_param.msc_state_current ; + msc_botxfer_param.bot_xfer_status = usbh_msc_csw_decode (pudev , puhost); + } else if (URB_Status == URB_STALL) { + error_dir = USBH_MSC_DIR_IN; + msc_botxfer_param.bot_state = USBH_MSC_BOT_ERROR_IN; + } + break; + + case USBH_MSC_BOT_ERROR_IN: + status = usbh_msc_bot_abort(pudev, puhost, USBH_MSC_DIR_IN); + + if (status == USBH_OK) { + /* check if the error was due in both the directions */ + if (error_dir == USBH_MSC_BOTH_DIR) { + /* if both directions are needed, switch to OUT direction */ + msc_botxfer_param.bot_state = USBH_MSC_BOT_ERROR_OUT; + } else { + /* switch back to the original state, in many cases this will be USBH_MSC_RECEIVE_CSW_STATE state */ + msc_botxfer_param.bot_state = msc_botxfer_param.bot_state_bkp; + } + } else if (status == USBH_UNRECOVERED_ERROR) { + /* this means that there is a stall error limit, do reset recovery */ + msc_botxfer_param.bot_xfer_status = USBH_MSC_PHASE_ERROR; + } + break; + + case USBH_MSC_BOT_ERROR_OUT: + status = usbh_msc_bot_abort (pudev, puhost, USBH_MSC_DIR_OUT); + + if (status == USBH_OK) { + /* switch back to the original state */ + msc_botxfer_param.bot_state = msc_botxfer_param.bot_state_bkp; + } else if (status == USBH_UNRECOVERED_ERROR) { + /* this means that there is a stall error limit, do reset recovery */ + msc_botxfer_param.bot_xfer_status = USBH_MSC_PHASE_ERROR; + } + break; + + default: + break; + } + } +} + +/*! + \brief manages the different error handling for stall + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] direction: data IN or OUT + \param[out] none + \retval none +*/ +usbh_status usbh_msc_bot_abort (usb_core_driver *pudev, usbh_host *puhost, uint8_t direction) +{ + usbh_status status = USBH_BUSY; + + switch (direction) { + case USBH_MSC_DIR_IN : + /* send clrfeture command on bulk IN endpoint */ + status = usbh_clrfeature(pudev, + puhost, + msc_machine.msc_bulk_epin, + msc_machine.hc_num_in); + break; + + case USBH_MSC_DIR_OUT : + /*send clrfeature command on bulk OUT endpoint */ + status = usbh_clrfeature(pudev, + puhost, + msc_machine.msc_bulk_epout, + msc_machine.hc_num_out); + break; + + default: + break; + } + + bot_stall_error_count++; /* check continous number of times, stall has occured */ + + if (bot_stall_error_count > MAX_BULK_STALL_COUNT_LIMIT) { + status = USBH_UNRECOVERED_ERROR; + } + + return status; +} + +/*! + \brief decode the CSW received by the device and updates the same to upper layer + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[out] none + \retval on success USBH_MSC_OK, on failure USBH_MSC_FAIL + \notes + Refer to USB Mass-Storage Class: BOT (www.usb.org) + 6.3.1 Valid CSW Conditions : + The host shall consider the CSW valid when: + 1. dCSWSignature is equal to 53425355h + 2. the CSW is 13 (Dh) bytes in length, + 3. dCSWTag matches the dCBWTag from the corresponding CBW. +*/ +uint8_t usbh_msc_csw_decode (usb_core_driver *pudev, usbh_host *puhost) +{ + uint8_t status; + uint32_t data_xfercount = 0; + + status = USBH_MSC_FAIL; + + if (pudev->host.connect_status) { + /* checking if the transfer length is diffrent than 13 */ + data_xfercount = usbh_xfercount_get (pudev, msc_machine.hc_num_in); + + if (data_xfercount != BBB_CSW_LENGTH) { + /* (4) Hi > Dn (Host expects to receive data from the device, + Device intends to transfer no data) + (5) Hi > Di (Host expects to receive data from the device, + Device intends to send data to the host) + (9) Ho > Dn (Host expects to send data to the device, + Device intends to transfer no data) + (11) Ho > Do (Host expects to send data to the device, + Device intends to receive data from the host) + */ + + status = USBH_MSC_PHASE_ERROR; + } else { + /* CSW length is correct */ + + /* check validity of the CSW Signature and CSWStatus */ + if (msc_csw_data.field.dCSWSignature == BBB_CSW_SIGNATURE) { + /* check condition 1. dCSWSignature is equal to 53425355h */ + if (msc_csw_data.field.dCSWTag == msc_cbw_data.field.dCBWTag) { + /* check condition 3. dCSWTag matches the dCBWTag from the corresponding CBW */ + if (msc_csw_data.field.bCSWStatus == USBH_MSC_OK) { + /* refer to USB Mass-Storage Class : BOT (www.usb.org) + Hn Host expects no data transfers + Hi Host expects to receive data from the device + Ho Host expects to send data to the device + + Dn Device intends to transfer no data + Di Device intends to send data to the host + Do Device intends to receive data from the host + + Section 6.7 + (1) Hn = Dn (Host expects no data transfers, + Device intends to transfer no data) + (6) Hi = Di (Host expects to receive data from the device, + Device intends to send data to the host) + (12) Ho = Do (Host expects to send data to the device, + Device intends to receive data from the host) + */ + + status = USBH_MSC_OK; + } else if (msc_csw_data.field.bCSWStatus == USBH_MSC_FAIL) { + status = USBH_MSC_FAIL; + } else if(msc_csw_data.field.bCSWStatus == USBH_MSC_PHASE_ERROR) { + /* refer to USB Mass-Storage Class : BOT (www.usb.org) + Section 6.7 + (2) Hn < Di ( Host expects no data transfers, + Device intends to send data to the host) + (3) Hn < Do ( Host expects no data transfers, + Device intends to receive data from the host) + (7) Hi < Di ( Host expects to receive data from the device, + Device intends to send data to the host) + (8) Hi <> Do ( Host expects to receive data from the device, + Device intends to receive data from the host) + (10) Ho <> Di (Host expects to send data to the device, + Di Device intends to send data to the host) + (13) Ho < Do (Host expects to send data to the device, + Device intends to receive data from the host) + */ + + status = USBH_MSC_PHASE_ERROR; + } + } /* CSW tag matching is checked */ + } /* CSW signature correct checking */else { + /* If the CSW signature is not valid, we sall return the phase error to + upper layers for reset recovery */ + status = USBH_MSC_PHASE_ERROR; + } + } /* CSW length check */ + } + + msc_botxfer_param.bot_xfer_status = status; + + return status; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_core.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_core.c new file mode 100644 index 0000000..3f6b0c7 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_core.c @@ -0,0 +1,367 @@ +/*! + \file usbh_msc_core.c + \brief USB MSC(mass storage device) class driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_pipe.h" +#include "usbh_transc.h" +#include "usbh_msc_core.h" +#include "usbh_msc_scsi.h" +#include "usbh_msc_bbb.h" + +#define USBH_MSC_ERROR_RETRY_LIMIT 10 + +uint8_t msc_error_count = 0; + +usbh_msc_machine msc_machine; + +static void usbh_msc_itf_deinit (usb_core_driver *pudev, void *puhost); +static usbh_status usbh_msc_itf_init (usb_core_driver *pudev, void *puhost); +static usbh_status usbh_msc_handle (usb_core_driver *pudev, void *puhost); +static usbh_status usbh_msc_req (usb_core_driver *pudev, void *puhost); +static usbh_status usbh_msc_maxlun_get (usb_core_driver *pudev, usbh_host *puhost); + +usbh_class_cb usbh_msc_cb = +{ + usbh_msc_itf_init, + usbh_msc_itf_deinit, + usbh_msc_req, + usbh_msc_handle, +}; + +void usbh_msc_error_handle (uint8_t status); + +/*! + \brief interface initialization for MSC class + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_msc_itf_init (usb_core_driver *pudev, void *puhost) +{ + usbh_host *pphost = puhost; + + usb_desc_itf *itf_desc = &pphost->dev_prop.itf_desc[0]; + + if ((itf_desc->bInterfaceClass == MSC_CLASS) && + (itf_desc->bInterfaceProtocol == MSC_PROTOCOL)) { + + usb_desc_ep *ep_desc = &pphost->dev_prop.ep_desc[0][0]; + + if (ep_desc->bEndpointAddress & 0x80) { + msc_machine.msc_bulk_epin = ep_desc->bEndpointAddress; + msc_machine.msc_bulk_epinsize = ep_desc->wMaxPacketSize; + } else { + msc_machine.msc_bulk_epout = ep_desc->bEndpointAddress; + msc_machine.msc_bulk_epoutsize = ep_desc->wMaxPacketSize; + } + + ep_desc = &pphost->dev_prop.ep_desc[0][1]; + + if (ep_desc->bEndpointAddress & 0x80) { + msc_machine.msc_bulk_epin = ep_desc->bEndpointAddress; + msc_machine.msc_bulk_epinsize = ep_desc->wMaxPacketSize; + } else { + msc_machine.msc_bulk_epout = ep_desc->bEndpointAddress; + msc_machine.msc_bulk_epoutsize = ep_desc->wMaxPacketSize; + } + + msc_machine.hc_num_out = usbh_pipe_allocate(pudev, msc_machine.msc_bulk_epout); + + msc_machine.hc_num_in = usbh_pipe_allocate(pudev, msc_machine.msc_bulk_epin); + + + /* open the new channels */ + usbh_pipe_create (pudev, + &pphost->dev_prop, + msc_machine.hc_num_out, + USB_EPTYPE_BULK, + msc_machine.msc_bulk_epoutsize); + + usbh_pipe_create (pudev, + &pphost->dev_prop, + msc_machine.hc_num_in, + USB_EPTYPE_BULK, + msc_machine.msc_bulk_epinsize); + + } else { + pphost->usr_cb->dev_not_supported(); + } + + return USBH_OK; +} + +/*! + \brief de-initialize interface by freeing host channels allocated to interface + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[out] none + \retval operation status +*/ +void usbh_msc_itf_deinit (usb_core_driver *pudev, void *puhost) +{ + if (msc_machine.hc_num_out) { + usb_pipe_halt (pudev, msc_machine.hc_num_out); + usbh_pipe_free (pudev, msc_machine.hc_num_out); + + msc_machine.hc_num_out = 0; + } + + if (msc_machine.hc_num_in) { + usb_pipe_halt (pudev, msc_machine.hc_num_in); + usbh_pipe_free (pudev, msc_machine.hc_num_in); + + msc_machine.hc_num_in = 0; + } +} + +/*! + \brief initialize the MSC state machine + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_msc_req (usb_core_driver *pudev, void *puhost) +{ + usbh_status status = USBH_OK; + msc_botxfer_param.msc_state = USBH_MSC_BOT_INIT_STATE; + + return status; +} + +/*! + \brief MSC state machine handler + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_msc_handle (usb_core_driver *pudev, void *puhost) +{ + usbh_host *pphost = puhost; + usbh_status status = USBH_BUSY; + uint8_t msc_status = USBH_MSC_BUSY; + uint8_t app_status = 0; + + static uint8_t max_lun_exceed = FALSE; + + if (pudev->host.connect_status) { + switch (msc_botxfer_param.msc_state) { + case USBH_MSC_BOT_INIT_STATE: + usbh_msc_init(pudev); + msc_botxfer_param.msc_state = USBH_MSC_BOT_RESET; + break; + + case USBH_MSC_BOT_RESET: + status = USBH_OK; + + msc_botxfer_param.msc_state = USBH_MSC_GET_MAX_LUN; + break; + + case USBH_MSC_GET_MAX_LUN: + /* issue Get_MaxLun request */ + status = usbh_msc_maxlun_get (pudev, puhost); + + if (status == USBH_OK) { + msc_machine.max_lun = *(msc_machine.buf); + + /* if device has more that one logical unit then it is not supported */ + if ((msc_machine.max_lun > 0) && (max_lun_exceed == FALSE)) { + max_lun_exceed = TRUE; + //pphost->usr_cb->dev_not_supported(); + + break; + } + + msc_botxfer_param.msc_state = USBH_MSC_TEST_UNIT_READY; + } + + if (status == USBH_NOT_SUPPORTED) { + /* if the command has failed, then we need to move to next state, after + STALL condition is cleared by Control-Transfer */ + msc_botxfer_param.msc_state_bkp = USBH_MSC_TEST_UNIT_READY; + + /* a clear feature should be issued here */ + msc_botxfer_param.msc_state = USBH_MSC_CTRL_ERROR_STATE; + } + break; + + case USBH_MSC_CTRL_ERROR_STATE: + /* issue clearfeature request */ + status = usbh_clrfeature(pudev, + puhost, + 0x00, + pphost->control.pipe_out_num); + + if (status == USBH_OK) { + /* if GetMaxLun request not support, assume single LUN configuration */ + msc_machine.max_lun = 0; + + msc_botxfer_param.msc_state = msc_botxfer_param.msc_state_bkp; + } + break; + + case USBH_MSC_TEST_UNIT_READY: + /* issue SCSI command TestUnitReady */ + msc_status = usbh_msc_test_unitready(pudev); + + if (msc_status == USBH_MSC_OK) { + msc_botxfer_param.msc_state = USBH_MSC_READ_CAPACITY10; + msc_error_count = 0; + status = USBH_OK; + } else { + usbh_msc_error_handle (msc_status); + } + break; + + case USBH_MSC_READ_CAPACITY10: + /* issue READ_CAPACITY10 SCSI command */ + msc_status = usbh_msc_read_capacity10(pudev); + + if (msc_status == USBH_MSC_OK) { + msc_botxfer_param.msc_state = USBH_MSC_MODE_SENSE6; + msc_error_count = 0; + status = USBH_OK; + } else { + usbh_msc_error_handle (msc_status); + } + break; + + case USBH_MSC_MODE_SENSE6: + /* issue ModeSense6 SCSI command for detecting if device is write-protected */ + msc_status = usbh_msc_mode_sense6 (pudev); + + if (msc_status == USBH_MSC_OK) { + msc_botxfer_param.msc_state = USBH_MSC_DEFAULT_APPLI_STATE; + msc_error_count = 0; + status = USBH_OK; + } else { + usbh_msc_error_handle (msc_status); + } + break; + + case USBH_MSC_REQUEST_SENSE: + /* issue RequestSense SCSI command for retreiving error code */ + msc_status = usbh_msc_request_sense (pudev); + if (msc_status == USBH_MSC_OK) { + msc_botxfer_param.msc_state = msc_botxfer_param.msc_state_bkp; + status = USBH_OK; + } else { + usbh_msc_error_handle (msc_status); + } + break; + + case USBH_MSC_BOT_USB_TRANSFERS: + /* process the BOT state machine */ + usbh_msc_botxfer(pudev , puhost); + break; + + case USBH_MSC_DEFAULT_APPLI_STATE: + /* process application callback for MSC */ + app_status = pphost->usr_cb->dev_user_app(); + + if (app_status == 0) { + msc_botxfer_param.msc_state = USBH_MSC_DEFAULT_APPLI_STATE; + } else if (app_status == 1) { + /* de-init requested from application layer */ + status = USBH_APPLY_DEINIT; + } + break; + + case USBH_MSC_UNRECOVERED_STATE: + status = USBH_UNRECOVERED_ERROR; + break; + + default: + break; + } + } + + return status; +} + +/*! + \brief get max lun of the mass storage device + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[out] none + \retval operation status +*/ +static usbh_status usbh_msc_maxlun_get (usb_core_driver *pudev, usbh_host *puhost) +{ + usbh_status status = USBH_BUSY; + + if (puhost->control.ctl_state == CTL_IDLE) { + puhost->control.setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_REQTYPE_CLASS | USB_RECPTYPE_ITF, + .bRequest = BBB_GET_MAX_LUN, + .wValue = 0, + .wIndex = 0, + .wLength = 1 + }; + + usbh_ctlstate_config (puhost, msc_machine.buf, 1); + } + + status = usbh_ctl_handler (pudev, puhost); + + return status; +} + +/*! + \brief handling errors occuring during the MSC state machine + \param[in] status: error status + \param[out] none + \retval operation status +*/ +void usbh_msc_error_handle (uint8_t status) +{ + if (status == USBH_MSC_FAIL) { + msc_error_count++; + + if (msc_error_count < USBH_MSC_ERROR_RETRY_LIMIT) { + /* try msc level error recovery, issue the request sense to get drive error reason */ + msc_botxfer_param.msc_state = USBH_MSC_REQUEST_SENSE; + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + } else { + /* error trials exceeded the limit, go to unrecovered state */ + msc_botxfer_param.msc_state = USBH_MSC_UNRECOVERED_STATE; + } + } else if (status == USBH_MSC_PHASE_ERROR) { + /* phase error, go to unrecoovered state */ + msc_botxfer_param.msc_state = USBH_MSC_UNRECOVERED_STATE; + } else if (status == USBH_MSC_BUSY) { + /* no change in state */ + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_fatfs.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_fatfs.c new file mode 100644 index 0000000..c6f7ee0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_fatfs.c @@ -0,0 +1,222 @@ +/*! + \file usbh_msc_fatfs.c + \brief USB MSC host FATFS related functions + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usb_conf.h" +#include "diskio.h" +#include "usbh_msc_core.h" + +static volatile DSTATUS state = STA_NOINIT; /* disk status */ + +extern usb_core_driver usbh_msc_core; +extern usbh_host usb_host; + +/*! + \brief initialize the disk drive + \param[in] drv: physical drive number (0) + \param[out] none + \retval operation status +*/ +DSTATUS disk_initialize (BYTE drv) +{ + if (usbh_msc_core.host.connect_status) { + state &= ~STA_NOINIT; + } + + return state; +} + +/*! + \brief get disk status + \param[in] drv: physical drive number (0) + \param[out] none + \retval operation status +*/ +DSTATUS disk_status (BYTE drv) +{ + if (drv) { + return STA_NOINIT; /* supports only single drive */ + } + + return state; +} + +/*! + \brief read sectors + \param[in] drv: physical drive number (0) + \param[in] buff: pointer to the data buffer to store read data + \param[in] sector: start sector number (LBA) + \param[in] count: sector count (1..255) + \param[out] none + \retval operation status +*/ +DRESULT disk_read (BYTE drv, + BYTE *buff, + DWORD sector, + BYTE count) +{ + BYTE status = USBH_MSC_OK; + + if (drv || !count) { + return RES_PARERR; + } + + if (state & STA_NOINIT) { + return RES_NOTRDY; + } + + if (usbh_msc_core.host.connect_status) { + do { + status = usbh_msc_read10 (&usbh_msc_core, buff,sector, 512 * count); + usbh_msc_botxfer(&usbh_msc_core, &usb_host); + + if (!usbh_msc_core.host.connect_status) { + return RES_ERROR; + } + } while(status == USBH_MSC_BUSY); + } + + if (status == USBH_MSC_OK) { + return RES_OK; + } + + return RES_ERROR; +} + +#if _READONLY == 0 + +/*! + \brief write sectors + \param[in] drv: physical drive number (0) + \param[in] buff: pointer to the data buffer to store read data + \param[in] sector: start sector number (LBA) + \param[in] count: sector count (1..255) + \param[out] none + \retval operation status +*/ +DRESULT disk_write (BYTE drv, + const BYTE *buff, + DWORD sector, + BYTE count) +{ + BYTE status = USBH_MSC_OK; + + if (drv || !count) { + return RES_PARERR; + } + + if (state & STA_NOINIT) { + return RES_NOTRDY; + } + + if (state & STA_PROTECT) { + return RES_WRPRT; + } + + if (usbh_msc_core.host.connect_status) { + do { + status = usbh_msc_write10 (&usbh_msc_core, (BYTE*)buff,sector, 512 * count); + usbh_msc_botxfer(&usbh_msc_core, &usb_host); + + if (!usbh_msc_core.host.connect_status) { + return RES_ERROR; + } + } while(status == USBH_MSC_BUSY); + } + + if (status == USBH_MSC_OK) { + return RES_OK; + } + + return RES_ERROR; +} + +#endif /* _READONLY == 0 */ + +/*-----------------------------------------------------------------------*/ +/* Miscellaneous Functions */ +/*-----------------------------------------------------------------------*/ + +#if _USE_IOCTL != 0 + +/*! + \brief I/O control function + \param[in] drv: physical drive number (0) + \param[in] ctrl: control code + \param[in] buff: pointer to the data buffer to store read data + \param[out] none + \retval operation status +*/ +DRESULT disk_ioctl (BYTE drv, + BYTE ctrl, + void *buff) +{ + DRESULT res = RES_OK; + + if (drv) { + return RES_PARERR; + } + + res = RES_ERROR; + + if (state & STA_NOINIT) { + return RES_NOTRDY; + } + + switch (ctrl) { + case CTRL_SYNC: /* make sure that no pending write process */ + res = RES_OK; + break; + + case GET_SECTOR_COUNT: /* get number of sectors on the disk (dword) */ + *(DWORD*)buff = (DWORD) usbh_msc_param.msc_capacity; + res = RES_OK; + break; + + case GET_SECTOR_SIZE: /* get r/w sector size (word) */ + *(WORD*)buff = 512; + res = RES_OK; + break; + + case GET_BLOCK_SIZE: /* get erase block size in unit of sector (dword) */ + *(DWORD*)buff = 512; + break; + + default: + res = RES_PARERR; + break; + } + + return res; +} +#endif /* _USE_IOCTL != 0 */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_scsi.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_scsi.c new file mode 100644 index 0000000..1bd9b48 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_msc_scsi.c @@ -0,0 +1,488 @@ +/*! + \file usbh_msc_scsi.c + \brief USB MSC SCSI commands implemention + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbh_msc_core.h" +#include "usbh_msc_scsi.h" +#include "usbh_msc_bbb.h" + +usbh_msc_parameter usbh_msc_param; + +uint8_t usbh_databuf_in[512]; +uint8_t usbh_databuf_out[512]; + +/*! + \brief send 'Test unit ready' command to the device + \param[in] pudev: pointer to usb device + \param[out] none + \retval operation status +*/ +uint8_t usbh_msc_test_unitready (usb_core_driver *pudev) +{ + uint8_t index; + usbh_msc_status status = USBH_MSC_BUSY; + + if (pudev->host.connect_status) { + switch (msc_botxfer_param.cmd_state_machine) { + case CMD_SEND_STATE: + /* prepare the CBW and relevent field */ + msc_cbw_data.field.dCBWDataTransferLength = 0; /* no data transfer */ + msc_cbw_data.field.bmCBWFlags = USB_TRX_OUT; + msc_cbw_data.field.bCBWCBLength = CBW_LENGTH_TEST_UNIT_READY; + + msc_botxfer_param.xfer_buf = msc_csw_data.CSWArray; + msc_botxfer_param.data_len = USBH_MSC_CSW_MAX_LENGTH; + msc_botxfer_param.msc_state_current = USBH_MSC_TEST_UNIT_READY; + + for (index = CBW_CB_LENGTH; index != 0; index--) { + msc_cbw_data.field.CBWCB[index] = 0x00; + } + + msc_cbw_data.field.CBWCB[0] = SCSI_TEST_UNIT_READY; + msc_botxfer_param.bot_state = USBH_MSC_SEND_CBW; + + /* start the transfer, then let the state machine magage the other transactions */ + msc_botxfer_param.msc_state = USBH_MSC_BOT_USB_TRANSFERS; + msc_botxfer_param.bot_xfer_status = USBH_MSC_BUSY; + msc_botxfer_param.cmd_state_machine = CMD_WAIT_STATUS; + + status = USBH_MSC_BUSY; + break; + + case CMD_WAIT_STATUS: + if (msc_botxfer_param.bot_xfer_status == USBH_MSC_OK) { + /* commands successfully sent and response received */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_OK; + } else if ( msc_botxfer_param.bot_xfer_status == USBH_MSC_FAIL) { + /* failure mode */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_FAIL; + } else if (msc_botxfer_param.bot_xfer_status == USBH_MSC_PHASE_ERROR) { + /* failure mode */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_PHASE_ERROR; + } + break; + + default: + break; + } + } + + return status; +} + +/*! + \brief send the read capacity command to the device + \param[in] pudev: pointer to usb device + \param[out] none + \retval operation status +*/ +uint8_t usbh_msc_read_capacity10 (usb_core_driver *pudev) +{ + uint8_t index; + usbh_msc_status status = USBH_MSC_BUSY; + + if (pudev->host.connect_status) { + switch (msc_botxfer_param.cmd_state_machine) { + case CMD_SEND_STATE: + /* prepare the CBW and relevent field */ + msc_cbw_data.field.dCBWDataTransferLength = READ_CAPACITY10_DATA_LEN; + msc_cbw_data.field.bmCBWFlags = USB_TRX_IN; + msc_cbw_data.field.bCBWCBLength = CBW_LENGTH; + + msc_botxfer_param.xfer_buf = usbh_databuf_in; + msc_botxfer_param.msc_state_current = USBH_MSC_READ_CAPACITY10; + + for (index = CBW_CB_LENGTH; index != 0; index--) { + msc_cbw_data.field.CBWCB[index] = 0x00; + } + + msc_cbw_data.field.CBWCB[0] = SCSI_READ_CAPACITY10; + msc_botxfer_param.bot_state = USBH_MSC_SEND_CBW; + + /* start the transfer, then let the state machine manage the other transactions */ + msc_botxfer_param.msc_state = USBH_MSC_BOT_USB_TRANSFERS; + msc_botxfer_param.bot_xfer_status = USBH_MSC_BUSY; + msc_botxfer_param.cmd_state_machine = CMD_WAIT_STATUS; + + status = USBH_MSC_BUSY; + break; + + case CMD_WAIT_STATUS: + if (msc_botxfer_param.bot_xfer_status == USBH_MSC_OK) { + /* assign the capacity */ + (((uint8_t*)&usbh_msc_param.msc_capacity )[3]) = usbh_databuf_in[0]; + (((uint8_t*)&usbh_msc_param.msc_capacity )[2]) = usbh_databuf_in[1]; + (((uint8_t*)&usbh_msc_param.msc_capacity )[1]) = usbh_databuf_in[2]; + (((uint8_t*)&usbh_msc_param.msc_capacity )[0]) = usbh_databuf_in[3]; + + /* assign the page length */ + (((uint8_t*)&usbh_msc_param.msc_page_len )[1]) = usbh_databuf_in[6]; + (((uint8_t*)&usbh_msc_param.msc_page_len )[0]) = usbh_databuf_in[7]; + + /* commands successfully sent and response received */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_OK; + } else if (msc_botxfer_param.bot_xfer_status == USBH_MSC_FAIL) { + /* failure mode */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_FAIL; + } else if (msc_botxfer_param.bot_xfer_status == USBH_MSC_PHASE_ERROR) { + /* Failure Mode */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_PHASE_ERROR; + } else { + /* wait for the commands to get completed */ + /* no change in state machine */ + } + break; + + default: + break; + } + } + + return status; +} + +/*! + \brief send the mode sense6 command to the device + \param[in] pudev: pointer to usb device + \param[out] none + \retval operation status +*/ +uint8_t usbh_msc_mode_sense6 (usb_core_driver *pudev) +{ + uint8_t index; + usbh_msc_status status = USBH_MSC_BUSY; + + if (pudev->host.connect_status) { + switch (msc_botxfer_param.cmd_state_machine) { + case CMD_SEND_STATE: + /* prepare the CBW and relevent field */ + msc_cbw_data.field.dCBWDataTransferLength = XFER_LEN_MODE_SENSE6; + msc_cbw_data.field.bmCBWFlags = USB_TRX_IN; + msc_cbw_data.field.bCBWCBLength = CBW_LENGTH; + + msc_botxfer_param.xfer_buf = usbh_databuf_in; + msc_botxfer_param.msc_state_current = USBH_MSC_MODE_SENSE6; + + for (index = CBW_CB_LENGTH; index != 0; index--) { + msc_cbw_data.field.CBWCB[index] = 0x00; + } + + msc_cbw_data.field.CBWCB[0] = SCSI_MODE_SENSE6; + msc_cbw_data.field.CBWCB[2] = MODE_SENSE_PAGE_CONTROL_FIELD | MODE_SENSE_PAGE_CODE; + msc_cbw_data.field.CBWCB[4] = XFER_LEN_MODE_SENSE6; + msc_botxfer_param.bot_state = USBH_MSC_SEND_CBW; + + /* start the transfer, then let the state machine manage the other transactions */ + msc_botxfer_param.msc_state = USBH_MSC_BOT_USB_TRANSFERS; + msc_botxfer_param.bot_xfer_status = USBH_MSC_BUSY; + msc_botxfer_param.cmd_state_machine = CMD_WAIT_STATUS; + + status = USBH_MSC_BUSY; + break; + + case CMD_WAIT_STATUS: + if (msc_botxfer_param.bot_xfer_status == USBH_MSC_OK) { + /* assign the write protect status */ + /* if writeprotect = 0, writing is allowed + if writeprotect != 0, disk is write protected */ + if (usbh_databuf_in[2] & MASK_MODE_SENSE_WRITE_PROTECT) { + usbh_msc_param.msc_write_protect = DISK_WRITE_PROTECTED; + } else { + usbh_msc_param.msc_write_protect = 0; + } + + /* commands successfully sent and response received */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_OK; + } else if (msc_botxfer_param.bot_xfer_status == USBH_MSC_FAIL) { + /* failure mode */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_FAIL; + } else if (msc_botxfer_param.bot_xfer_status == USBH_MSC_PHASE_ERROR) { + /* failure mode */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_PHASE_ERROR; + } else { + /* wait for the commands to get completed */ + /* no change in state machine */ + } + break; + + default: + break; + } + } + + return status; +} + +/*! + \brief send the Request Sense command to the device + \param[in] pudev: pointer to usb device + \param[out] none + \retval operation status +*/ +uint8_t usbh_msc_request_sense (usb_core_driver *pudev) +{ + usbh_msc_status status = USBH_MSC_BUSY; + uint8_t index; + + if (pudev->host.connect_status) { + switch (msc_botxfer_param.cmd_state_machine) { + case CMD_SEND_STATE: + /* prepare the cbw and relevent field */ + msc_cbw_data.field.dCBWDataTransferLength = ALLOCATION_LENGTH_REQUEST_SENSE; + msc_cbw_data.field.bmCBWFlags = USB_TRX_IN; + msc_cbw_data.field.bCBWCBLength = CBW_LENGTH; + + msc_botxfer_param.xfer_buf = usbh_databuf_in; + msc_botxfer_param.msc_state_bkp = msc_botxfer_param.msc_state_current; + msc_botxfer_param.msc_state_current = USBH_MSC_REQUEST_SENSE; + + for (index = CBW_CB_LENGTH; index != 0; index--) { + msc_cbw_data.field.CBWCB[index] = 0x00; + } + + msc_cbw_data.field.CBWCB[0] = SCSI_REQUEST_SENSE; + msc_cbw_data.field.CBWCB[1] = DESC_REQUEST_SENSE; + msc_cbw_data.field.CBWCB[4] = ALLOCATION_LENGTH_REQUEST_SENSE; + + msc_botxfer_param.bot_state = USBH_MSC_SEND_CBW; + + /* start the transfer, then let the state machine magage the other transactions */ + msc_botxfer_param.msc_state = USBH_MSC_BOT_USB_TRANSFERS; + msc_botxfer_param.bot_xfer_status = USBH_MSC_BUSY; + msc_botxfer_param.cmd_state_machine = CMD_WAIT_STATUS; + + status = USBH_MSC_BUSY; + break; + + case CMD_WAIT_STATUS: + if (msc_botxfer_param.bot_xfer_status == USBH_MSC_OK) { + /* get sense data */ + (((uint8_t*)&usbh_msc_param.msc_sense_key )[3]) = usbh_databuf_in[0]; + (((uint8_t*)&usbh_msc_param.msc_sense_key )[2]) = usbh_databuf_in[1]; + (((uint8_t*)&usbh_msc_param.msc_sense_key )[1]) = usbh_databuf_in[2]; + (((uint8_t*)&usbh_msc_param.msc_sense_key )[0]) = usbh_databuf_in[3]; + + /* commands successfully sent and response received */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_OK; + } else if (msc_botxfer_param.bot_xfer_status == USBH_MSC_FAIL) { + /* failure mode */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_FAIL; + } else if ( msc_botxfer_param.bot_xfer_status == USBH_MSC_PHASE_ERROR ) { + /* failure mode */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_PHASE_ERROR; + } else { + /* wait for the commands to get completed */ + /* no change in state machine */ + } + break; + + default: + break; + } + } + + return status; +} + +/*! + \brief send the write10 command to the device + \param[in] pudev: pointer to usb device + \param[in] data_buf: data buffer contains the data to write + \param[in] addr: address to which the data will be written + \param[in] byte_num: number of bytes to be written + \param[out] none + \retval operation status +*/ +uint8_t usbh_msc_write10 (usb_core_driver *pudev, uint8_t *data_buf, uint32_t addr, uint32_t byte_num) +{ + uint8_t index; + uint16_t nbOfPages; + usbh_msc_status status = USBH_MSC_BUSY; + + if (pudev->host.connect_status) { + switch (msc_botxfer_param.cmd_state_machine) { + case CMD_SEND_STATE: + msc_cbw_data.field.dCBWDataTransferLength = byte_num; + msc_cbw_data.field.bmCBWFlags = USB_TRX_OUT; + msc_cbw_data.field.bCBWCBLength = CBW_LENGTH; + msc_botxfer_param.xfer_buf = data_buf; + + for (index = CBW_CB_LENGTH; index != 0; index--) { + msc_cbw_data.field.CBWCB[index] = 0x00; + } + + msc_cbw_data.field.CBWCB[0] = SCSI_WRITE10; + + /* logical block address */ + msc_cbw_data.field.CBWCB[2] = (((uint8_t*)&addr)[3]); + msc_cbw_data.field.CBWCB[3] = (((uint8_t*)&addr)[2]); + msc_cbw_data.field.CBWCB[4] = (((uint8_t*)&addr)[1]); + msc_cbw_data.field.CBWCB[5] = (((uint8_t*)&addr)[0]); + + /* USBH_MSC_PAGE_LENGTH = 512*/ + nbOfPages = byte_num / USBH_MSC_PAGE_LENGTH; + + /* tranfer length */ + msc_cbw_data.field.CBWCB[7] = (((uint8_t *)&nbOfPages)[1]); + msc_cbw_data.field.CBWCB[8] = (((uint8_t *)&nbOfPages)[0]); + + msc_botxfer_param.bot_state = USBH_MSC_SEND_CBW; + + /* start the transfer, then let the state machine magage the other transactions */ + msc_botxfer_param.msc_state = USBH_MSC_BOT_USB_TRANSFERS; + msc_botxfer_param.bot_xfer_status = USBH_MSC_BUSY; + msc_botxfer_param.cmd_state_machine = CMD_WAIT_STATUS; + + status = USBH_MSC_BUSY; + break; + + case CMD_WAIT_STATUS: + if (msc_botxfer_param.bot_xfer_status == USBH_MSC_OK) { + /* commands successfully sent and response received */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_OK; + } else if (msc_botxfer_param.bot_xfer_status == USBH_MSC_FAIL) { + /* failure mode */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + } else if (msc_botxfer_param.bot_xfer_status == USBH_MSC_PHASE_ERROR) { + /* failure mode */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_PHASE_ERROR; + } + break; + + default: + break; + } + } + + return status; +} + +/*! + \brief send the read10 command to the device + \param[in] pudev: pointer to usb device + \param[in] data_buf: data buffer contains the data to write + \param[in] addr: address to which the data will be written + \param[in] byte_num: number of bytes to be written + \param[out] none + \retval operation status +*/ +uint8_t usbh_msc_read10 (usb_core_driver *pudev, uint8_t *data_buf, uint32_t addr, uint32_t byte_num) +{ + uint8_t index; + uint16_t nbOfPages; + + static usbh_msc_status status = USBH_MSC_BUSY; + + status = USBH_MSC_BUSY; + + if (pudev->host.connect_status) { + switch (msc_botxfer_param.cmd_state_machine) { + case CMD_SEND_STATE: + /* prepare the CBW and relevent field */ + msc_cbw_data.field.dCBWDataTransferLength = byte_num; + msc_cbw_data.field.bmCBWFlags = USB_TRX_IN; + msc_cbw_data.field.bCBWCBLength = CBW_LENGTH; + + msc_botxfer_param.xfer_buf = data_buf; + + for(index = CBW_CB_LENGTH; index != 0; index--) + { + msc_cbw_data.field.CBWCB[index] = 0x00; + } + + msc_cbw_data.field.CBWCB[0] = SCSI_READ10; + + /* logical block address */ + msc_cbw_data.field.CBWCB[2] = (((uint8_t*)&addr)[3]); + msc_cbw_data.field.CBWCB[3] = (((uint8_t*)&addr)[2]); + msc_cbw_data.field.CBWCB[4] = (((uint8_t*)&addr)[1]); + msc_cbw_data.field.CBWCB[5] = (((uint8_t*)&addr)[0]); + + /* USBH_MSC_PAGE_LENGTH = 512 */ + nbOfPages = byte_num / USBH_MSC_PAGE_LENGTH; + + /* tranfer length */ + msc_cbw_data.field.CBWCB[7] = (((uint8_t *)&nbOfPages)[1]); + msc_cbw_data.field.CBWCB[8] = (((uint8_t *)&nbOfPages)[0]); + + msc_botxfer_param.bot_state = USBH_MSC_SEND_CBW; + + /* start the transfer, then let the state machine magage the other transactions */ + msc_botxfer_param.msc_state = USBH_MSC_BOT_USB_TRANSFERS; + msc_botxfer_param.bot_xfer_status = USBH_MSC_BUSY; + msc_botxfer_param.cmd_state_machine = CMD_WAIT_STATUS; + + status = USBH_MSC_BUSY; + break; + + case CMD_WAIT_STATUS: + if ((msc_botxfer_param.bot_xfer_status == USBH_MSC_OK) && \ + (pudev->host.connect_status)) { + /* commands successfully sent and response received */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_OK; + } else if ((msc_botxfer_param.bot_xfer_status == USBH_MSC_FAIL) && \ + (pudev->host.connect_status)) { + /* failure mode */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + } else if (msc_botxfer_param.bot_xfer_status == USBH_MSC_PHASE_ERROR) { + /* failure mode */ + msc_botxfer_param.cmd_state_machine = CMD_SEND_STATE; + status = USBH_MSC_PHASE_ERROR; + } else { + /* wait for the commands to get completed */ + /* no change in state machine */ + } + break; + + default: + break; + } + } + + return status; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_usr.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_usr.c new file mode 100644 index 0000000..ebd5979 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/Source/usbh_usr.c @@ -0,0 +1,595 @@ +/*! + \file usbh_usr.c + \brief user application layer for USBFS host-mode MSC class operation + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include +#include "usbh_usr.h" +#include "drv_usb_hw.h" +#include "ff.h" +#include "usbh_msc_core.h" +#include "usbh_msc_scsi.h" +#include "usbh_msc_bbb.h" +#include "lcd_log.h" + +extern uint16_t LINE; +extern usb_core_driver usbh_msc_core; +extern char_format_struct charform; + +FATFS fatfs; +FIL file; + +uint8_t line_idx = 0; +uint8_t need_clear = 0; +uint8_t usbh_usr_application_state = USBH_USR_FS_INIT; +uint8_t WriteTextBuff[] = "GD32 Connectivity line Host Demo application using FAT_FS "; + +/* points to the DEVICE_PROP structure of current device */ +usbh_user_cb user_callback_funs = +{ + usbh_user_init, + usbh_user_deinit, + usbh_user_device_connected, + usbh_user_device_reset, + usbh_user_device_disconnected, + usbh_user_over_current_detected, + usbh_user_device_speed_detected, + usbh_user_device_desc_available, + usbh_user_device_address_assigned, + usbh_user_configuration_descavailable, + usbh_user_manufacturer_string, + usbh_user_product_string, + usbh_user_serialnum_string, + usbh_user_enumeration_finish, + usbh_user_userinput, + usbh_usr_msc_application, + usbh_user_device_not_supported, + usbh_user_unrecovered_error +}; + +const uint8_t MSG_HOST_INIT[] = "> Host Library Initialized."; +const uint8_t MSG_DEV_ATTACHED[] = "> Device Attached."; +const uint8_t MSG_DEV_DISCONNECTED[] = "> Device Disconnected."; +const uint8_t MSG_DEV_ENUMERATED[] = "> Enumeration completed."; +const uint8_t MSG_DEV_HIGHSPEED[] = "> High speed device detected."; +const uint8_t MSG_DEV_FULLSPEED[] = "> Full speed device detected."; +const uint8_t MSG_DEV_LOWSPEED[] = "> Low speed device detected."; +const uint8_t MSG_DEV_ERROR[] = "> Device fault."; + +const uint8_t MSG_HOST_HEADER[] = "> USBFS MSC Host"; +const uint8_t MSG_HOST_FOOTER[] = "> USB Host Library v2.0.0"; + +const uint8_t MSG_LIB_START[] = "##### USB Host library started #####"; +const uint8_t MSG_DEV_NOSUP[] = "> Device not supported."; +const uint8_t MSG_OVERCURRENT[] = "> Overcurrent detected."; +const uint8_t MSG_RESET_DEV[] = "> Reset the USB device."; + +const uint8_t MSG_MSC_CLASS[] = "> Mass storage device connected."; +const uint8_t MSG_HID_CLASS[] = "> HID device connected."; +const uint8_t MSG_DISK_SIZE[] = "> Size of the disk in MBytes: "; +const uint8_t MSG_LUN[] = "> LUN Available in the device:"; +const uint8_t MSG_ROOT_CONT[] = "> Exploring disk flash ..."; +const uint8_t MSG_WR_PROTECT[] = "> The disk is write protected."; +const uint8_t MSG_UNREC_ERROR[] = "> UNRECOVERED ERROR STATE."; +const uint8_t MSG_FILE_NOTINIT[] = "> Cannot initialize File System."; +const uint8_t MSG_FILE_INIT[] = "> File System initialized."; +const uint8_t MSG_Write_File[] = "> Writing File to disk flash ..."; +const uint8_t MSG_Write_Protect[] = "> Disk flash is write protected "; +const uint8_t MSG_NOT_WRITE[] = "> GD32.TXT CANNOT be writen."; +const uint8_t MSG_CREATE_FILE[] = "> GD32.TXT created in the disk."; + +static uint8_t explore_disk (char* path, uint8_t recu_level); +static void toggle_leds (void); + +/*! + \brief user operation for host-mode initialization + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_init(void) +{ + static uint8_t startup = 0U; + + if (0U == startup) { + startup = 1U; + + /* configure the LEDs and KEYs*/ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_key_init(KEY_CET, KEY_MODE_GPIO); + gd_eval_key_init(KEY_B, KEY_MODE_GPIO); + gd_eval_key_init(KEY_C, KEY_MODE_GPIO); + + exmc_lcd_init(); + + usb_mdelay(50); + + lcd_init(); + + lcd_log_init(); + + lcd_log_header_set((uint8_t *)MSG_HOST_HEADER, 80); + + lcd_log_print((uint8_t *)MSG_LIB_START, sizeof(MSG_LIB_START) - 1, LCD_COLOR_WHITE); + + charform.char_color = LCD_COLOR_RED; + + lcd_log_footer_set((uint8_t *)MSG_HOST_FOOTER, 70); + } +} + +/*! + \brief user operation for device attached + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_device_connected(void) +{ + if (need_clear != 0) { + lcd_log_text_zone_clear(30, 0, 210, 320); + need_clear = 0; + } + + lcd_log_print((uint8_t *)MSG_DEV_ATTACHED, sizeof(MSG_DEV_ATTACHED) - 1, LCD_COLOR_WHITE); +} + +/*! + \brief user operation when unrecoveredError happens + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_unrecovered_error (void) +{ + lcd_log_print((uint8_t *)MSG_UNREC_ERROR, sizeof(MSG_UNREC_ERROR) - 1, LCD_COLOR_WHITE); +} + +/*! + \brief user operation for device disconnect event + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_device_disconnected (void) +{ + LINE = 190; + + lcd_log_text_zone_clear(30, 0, 210, 320); + + lcd_log_print((uint8_t *)MSG_DEV_DISCONNECTED, sizeof(MSG_DEV_DISCONNECTED) - 1, LCD_COLOR_WHITE); + + need_clear = 1; +} + +/*! + \brief user operation for reset USB Device + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_device_reset(void) +{ + lcd_log_print((uint8_t *)MSG_RESET_DEV, sizeof(MSG_RESET_DEV) - 1, LCD_COLOR_WHITE); +} + +/*! + \brief user operation for detectting device speed + \param[in] device_speed: device speed + \param[out] none + \retval none +*/ +void usbh_user_device_speed_detected(uint32_t device_speed) +{ + if (PORT_SPEED_HIGH == device_speed) { + lcd_log_print((uint8_t *)MSG_DEV_HIGHSPEED, sizeof(MSG_DEV_HIGHSPEED) - 1, LCD_COLOR_WHITE); + } else if(PORT_SPEED_FULL == device_speed) { + lcd_log_print((uint8_t *)MSG_DEV_FULLSPEED, sizeof(MSG_DEV_FULLSPEED) - 1, LCD_COLOR_WHITE); + } else if(PORT_SPEED_LOW == device_speed) { + lcd_log_print((uint8_t *)MSG_DEV_LOWSPEED, sizeof(MSG_DEV_LOWSPEED) - 1, LCD_COLOR_WHITE); + } else { + lcd_log_print((uint8_t *)MSG_DEV_ERROR, sizeof(MSG_DEV_ERROR) - 1, LCD_COLOR_WHITE); + } +} + +/*! + \brief user operation when device descriptor is available + \param[in] device_desc: device descriptor + \param[out] none + \retval none +*/ +void usbh_user_device_desc_available(void *device_desc) +{ + uint8_t TempStr[64], str_len = 0; + usb_desc_dev *pDevStr = device_desc; + + sprintf((char *)TempStr, "VID: %04Xh", (uint32_t)pDevStr->idVendor); + str_len = strlen((const char *)TempStr); + lcd_log_print((uint8_t *)TempStr, str_len, LCD_COLOR_WHITE); + + sprintf((char *)TempStr, "PID: %04Xh", (uint32_t)pDevStr->idProduct); + str_len = strlen((const char *)TempStr); + lcd_log_print((uint8_t *)TempStr, str_len, LCD_COLOR_WHITE); +} + +/*! + \brief usb device is successfully assigned the Address + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_device_address_assigned(void) +{ +} + +/*! + \brief user operation when configuration descriptor is available + \param[in] cfg_desc: pointer to configuration descriptor + \param[in] itf_desc: pointer to interface descriptor + \param[in] ep_desc: pointer to endpoint descriptor + \param[out] none + \retval none +*/ +void usbh_user_configuration_descavailable(usb_desc_config *cfg_desc, + usb_desc_itf *itf_desc, + usb_desc_ep *ep_desc) +{ + usb_desc_itf *id = itf_desc; + + if (0x08U == (*id).bInterfaceClass) { + lcd_log_print((uint8_t *)MSG_MSC_CLASS, sizeof(MSG_MSC_CLASS) - 1, LCD_COLOR_WHITE); + } else if (0x03U == (*id).bInterfaceClass) { + lcd_log_print((uint8_t *)MSG_HID_CLASS, sizeof(MSG_HID_CLASS) - 1, LCD_COLOR_WHITE); + } +} + +/*! + \brief user operation when manufacturer string exists + \param[in] manufacturer_string: manufacturer string of usb device + \param[out] none + \retval none +*/ +void usbh_user_manufacturer_string(void *manufacturer_string) +{ + uint8_t TempStr[64], str_len = 0; + + sprintf((char *)TempStr, "Manufacturer: %s", (char *)manufacturer_string); + str_len = strlen((const char *)TempStr); + lcd_log_print((uint8_t *)TempStr, str_len, LCD_COLOR_WHITE); +} + +/*! + \brief user operation when product string exists + \param[in] product_string: product string of usb device + \param[out] none + \retval none +*/ +void usbh_user_product_string(void *product_string) +{ + uint8_t TempStr[64], str_len = 0; + + sprintf((char *)TempStr, "Product: %s", (char *)product_string); + str_len = strlen((const char *)TempStr); + lcd_log_print((uint8_t *)TempStr, str_len, LCD_COLOR_WHITE); +} + +/*! + \brief user operatin when serialNum string exists + \param[in] serial_num_string: serialNum string of usb device + \param[out] none + \retval none +*/ +void usbh_user_serialnum_string(void *serial_num_string) +{ + uint8_t TempStr[64], str_len = 0; + + sprintf((char *)TempStr, "Serial Number: %s", (char *)serial_num_string); + str_len = strlen((const char *)TempStr); + lcd_log_print((uint8_t *)TempStr, str_len, LCD_COLOR_WHITE); +} + +/*! + \brief user response request is displayed to ask for application jump to class + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_enumeration_finish(void) +{ + uint8_t Str1[] = "To see the disk information: "; + uint8_t Str2[] = "Press CET Key..."; + + lcd_log_print((uint8_t *)MSG_DEV_ENUMERATED, sizeof(MSG_DEV_ENUMERATED) - 1, LCD_COLOR_WHITE); + lcd_log_print((uint8_t *)Str1, sizeof(Str1) - 1, LCD_COLOR_GREEN); + lcd_log_print((uint8_t *)Str2, sizeof(Str2) - 1, LCD_COLOR_GREEN); +} + +/*! + \brief user operation when device is not supported + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_device_not_supported(void) +{ + lcd_log_print((uint8_t *)MSG_DEV_NOSUP, sizeof(MSG_DEV_NOSUP) - 1, LCD_COLOR_WHITE); +} + +/*! + \brief user action for application state entry + \param[in] none + \param[out] none + \retval user response for user key +*/ +usbh_user_status usbh_user_userinput(void) +{ + usbh_user_status usbh_usr_status = USBH_USER_NO_RESP; + + /*key B3 is in polling mode to detect user action */ + if (RESET == gd_eval_key_state_get(KEY_CET)) { + LINE = 190; + + lcd_log_text_zone_clear(30, 0, 210, 320); + + usbh_usr_status = USBH_USER_RESP_OK; + } + + return usbh_usr_status; +} + +/*! + \brief user operation for device overcurrent detection event + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_over_current_detected (void) +{ + lcd_log_print((uint8_t *)MSG_OVERCURRENT, sizeof(MSG_OVERCURRENT) - 1, LCD_COLOR_WHITE); +} + +/*! + \brief demo application for mass storage + \param[in] pudev: pointer to device + \param[in] id: no use here + \param[out] none + \retval status +*/ +int usbh_usr_msc_application(void) +{ + FRESULT res; + uint16_t bytesWritten, bytesToWrite; + + uint8_t Str1[] = "> To see the root content of the disk "; + uint8_t Str2[] = "> Press C Key to write file"; + uint8_t Str3[] = "> The MSC host demo is end."; + uint8_t Str4[] = "> Press CET key..."; + uint8_t TempStr[64], str_len = 0; + + switch(usbh_usr_application_state) + { + case USBH_USR_FS_INIT: + /* initialises the file system*/ + if (FR_OK != f_mount(0, &fatfs)) { + lcd_log_print((uint8_t *)MSG_FILE_NOTINIT, sizeof(MSG_FILE_NOTINIT) - 1, LCD_COLOR_WHITE); + + return(-1); + } + + lcd_log_print((uint8_t *)MSG_FILE_INIT, sizeof(MSG_FILE_INIT) - 1, LCD_COLOR_WHITE); + + sprintf((char *)TempStr, "> Disk capacity: %ud Bytes.", \ + usbh_msc_param.msc_capacity * usbh_msc_param.msc_page_len); + + str_len = strlen((const char *)TempStr); + + lcd_log_print((uint8_t *)TempStr, str_len, LCD_COLOR_WHITE); + + if (DISK_WRITE_PROTECTED == usbh_msc_param.msc_write_protect) { + lcd_log_print((uint8_t *)MSG_WR_PROTECT, sizeof(MSG_WR_PROTECT) - 1, LCD_COLOR_WHITE); + } + + usbh_usr_application_state = USBH_USR_FS_READLIST; + break; + + case USBH_USR_FS_READLIST: + lcd_log_print((uint8_t *)MSG_ROOT_CONT, sizeof(MSG_ROOT_CONT) - 1, LCD_COLOR_WHITE); + lcd_log_print((uint8_t *)Str1, sizeof(Str1) - 1, LCD_COLOR_GREEN); + lcd_log_print((uint8_t *)Str4, sizeof(Str4) - 1, LCD_COLOR_GREEN); + + /*Key B3 in polling*/ + while ((usbh_msc_core.host.connect_status) && \ + (SET == gd_eval_key_state_get (KEY_CET))) { + toggle_leds(); + } + + LINE = 190; + + lcd_log_text_zone_clear(30, 0, 210, 320); + + explore_disk("0:/", 1); + line_idx = 0; + usbh_usr_application_state = USBH_USR_FS_WRITEFILE; + break; + + case USBH_USR_FS_WRITEFILE: + usb_mdelay(100U); + + lcd_log_print((uint8_t *)Str2, sizeof(Str2) - 1, LCD_COLOR_GREEN); + + /*key b3 in polling*/ + while ((usbh_msc_core.host.connect_status) && \ + (SET == gd_eval_key_state_get (KEY_C))) { + toggle_leds(); + } + + lcd_log_print((uint8_t *)MSG_Write_File, sizeof(MSG_Write_File) - 1, LCD_COLOR_WHITE); + + if (DISK_WRITE_PROTECTED == usbh_msc_param.msc_write_protect) { + lcd_log_print((uint8_t *)MSG_Write_Protect, sizeof(MSG_Write_Protect) - 1, LCD_COLOR_WHITE); + + usbh_usr_application_state = USBH_USR_FS_DEMOEND; + break; + } + + /* register work area for logical drives */ + f_mount(0, &fatfs); + + if (FR_OK == f_open(&file, "0:GD32.TXT", FA_CREATE_ALWAYS | FA_WRITE)) { + /* write buffer to file */ + bytesToWrite = sizeof(WriteTextBuff); + res = f_write (&file, WriteTextBuff, bytesToWrite, (void *)&bytesWritten); + /* EOF or error */ + if ((0U == bytesWritten) || (FR_OK != res)) { + lcd_log_print((uint8_t *)MSG_NOT_WRITE, sizeof(MSG_NOT_WRITE) - 1, LCD_COLOR_WHITE); + } else { + lcd_log_print((uint8_t *)MSG_CREATE_FILE, sizeof(MSG_CREATE_FILE) - 1, LCD_COLOR_WHITE); + } + + /* close file and filesystem */ + f_close(&file); + f_mount(0, NULL); + } else { + lcd_log_print((uint8_t *)MSG_CREATE_FILE, sizeof(MSG_CREATE_FILE) - 1, LCD_COLOR_WHITE); + } + + usbh_usr_application_state = USBH_USR_FS_DEMOEND; + lcd_log_print((uint8_t *)Str3, sizeof(Str3) - 1, LCD_COLOR_GREEN); + break; + + case USBH_USR_FS_DEMOEND: + break; + + default: + break; + } + + return(0); +} + +/*! + \brief displays disk content + \param[in] path: pointer to root path + \param[in] recu_level: recursive level + \param[out] none + \retval status +*/ +static uint8_t explore_disk (char* path, uint8_t recu_level) +{ + FRESULT res; + FILINFO fno; + DIR dir; + char *fn; + + uint8_t Str2[] = "Press B Key to continue"; + + res = f_opendir(&dir, path); + + if (res == FR_OK) { + while (usbh_msc_core.host.connect_status) { + res = f_readdir(&dir, &fno); + if (FR_OK != res || 0U == fno.fname[0]) { + break; + } + + if ('.' == fno.fname[0]) { + continue; + } + + fn = fno.fname; + + line_idx++; + + if (line_idx > 4) { + line_idx = 0; + + lcd_log_print((uint8_t *)Str2, sizeof(Str2) - 1, LCD_COLOR_GREEN); + + /*key B3 in polling*/ + while ((usbh_msc_core.host.connect_status) && \ + (SET == gd_eval_key_state_get (KEY_B))) { + toggle_leds(); + } + } + + if (1U == recu_level) { + uint8_t temp[] = " |__"; + lcd_log_print((uint8_t *)temp, strlen((const char *)temp), LCD_COLOR_WHITE); + } else if(2U == recu_level) { + uint8_t temp[] = " | |__"; + lcd_log_print((uint8_t *)temp, strlen((const char *)temp), LCD_COLOR_WHITE); + } + + if (AM_DIR == (fno.fattrib & AM_MASK)) { + lcd_log_print((uint8_t *)fno.fname, strlen(fno.fname), LCD_COLOR_RED); + } else { + lcd_log_print((uint8_t *)fno.fname, strlen(fno.fname), LCD_COLOR_WHITE); + } + + if ((AM_DIR == (fno.fattrib & AM_MASK)) && (1U == recu_level)) { + explore_disk(fn, 2); + } + } + } + + return res; +} + +/*! + \brief toggle leds to shows user input state + \param[in] none + \param[out] none + \retval none +*/ +static void toggle_leds(void) +{ + static uint32_t i; + + if (0x10000U == i++) { + gd_eval_led_toggle(LED2); + gd_eval_led_toggle(LED3); + gd_eval_led_toggle(LED4); + i = 0; + } +} + +/*! + \brief deinit user state and associated variables + \param[in] none + \param[out] none + \retval none +*/ +void usbh_user_deinit(void) +{ + usbh_usr_application_state = USBH_USR_FS_INIT; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/readme.txt new file mode 100644 index 0000000..7f37292 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/USBFS/USB_Host/MSC_Host/readme.txt @@ -0,0 +1,43 @@ +/*! + \file readme.txt + \brief Description of the USB host mode to control MSC device + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, and it provides a description of how +to use the USBFS host peripheral on the GD32VF103V devices. + + Insert the OTG cable to the USB_FS port. Then download it to the EVAL board and run. + + If an Udisk has been attached, the user will see the information of Udisk enumeration. +First pressing the CET key will see the Udisk information, next pressing the CET key +will see the root content of the Udisk, then press the C key will write file to the +Udisk, finally the user will see information that the msc host demo is end. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/main.c new file mode 100644 index 0000000..9f3306e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/main.c @@ -0,0 +1,90 @@ +/*! + \file main.c + \brief WWDGT delay feed demo + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" +#include "gd32vf103v_eval.h" + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + /* configure systick */ + //systick_config(); + + /* configure LED2 and LED3 */ + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + + /* turn off LED2 and LED3 */ + gd_eval_led_off(LED2); + gd_eval_led_off(LED3); + + /* delay */ + delay_1ms(150); + + /* check if the system has resumed from WWDGT reset */ + if(RESET != rcu_flag_get(RCU_FLAG_WWDGTRST)){ + /* WWDGTRST flag set */ + gd_eval_led_on(LED2); + /* clear the WWDGTRST flag */ + rcu_all_reset_flag_clear(); + while(1){ + } + } + /* enable WWDGT clock */ + rcu_periph_clock_enable(RCU_WWDGT); + + /* + * set WWDGT clock = (PCLK1 (54MHz)/4096)/8 = 1648Hz (~606.8 us) + * set counter value to 127 + * set window value to 80 + * refresh window is: ~606.8 * (127-80)= 28.5ms < refresh window < ~606.8 * (127-63) =38.8ms. + */ + wwdgt_config(127, 80, WWDGT_CFG_PSC_DIV8); + wwdgt_enable(); + + while(1){ + /* toggle LED3 */ + gd_eval_led_toggle(LED3); + /* insert 30 ms delay */ + delay_1ms(30); + /* update WWDGT counter */ + wwdgt_counter_update(127); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/readme.txt new file mode 100644 index 0000000..d21c287 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/readme.txt @@ -0,0 +1,47 @@ +/*! + \file readme.txt + \brief description of the WWDGT_delay_feed example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This demo is based on the GD32VF103V-EVAL-V1.0 board, it shows the WWDGT with different +counter value and window value make the different WWDGT timeout. As a result, LED1 +and LED2 display a different phenomenon. + + In this demo, the WWDGT counter value is set to 127, the refresh window is set to +80. In this case the WWDGT timeout is set to 38.8ms(the timeout may varies due to +APB1 frequency dispersion), the value in the delay function is set to 30ms, the WWDGT +counter can reloaded normally, the LED2 is turn off, LED3 is blinking fast. + + If the value in the delay function is not set properly, the WWDGT counter is not +reloaded. As a result, the system reset and only the LED2 is remain illuminated. + + In this example the system clock is set to 108 MHz , and the APB1 is set to 54MHz. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/systick.c new file mode 100644 index 0000000..4296e59 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/systick.h new file mode 100644 index 0000000..9a74c22 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Examples/WWDGT/WWDGT_delay_feed/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h new file mode 100644 index 0000000..f06da0a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_adc.h @@ -0,0 +1,396 @@ +/*! + \file gd32vf103_adc.h + \brief definitions for the ADC + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_ADC_H +#define GD32VF103_ADC_H + +#include "gd32vf103.h" + +/* ADC definitions */ +#define ADC0 ADC_BASE +#define ADC1 (ADC_BASE + 0x400U) + +/* registers definitions */ +#define ADC_STAT(adcx) REG32((adcx) + 0x00U) /*!< ADC status register */ +#define ADC_CTL0(adcx) REG32((adcx) + 0x04U) /*!< ADC control register 0 */ +#define ADC_CTL1(adcx) REG32((adcx) + 0x08U) /*!< ADC control register 1 */ +#define ADC_SAMPT0(adcx) REG32((adcx) + 0x0CU) /*!< ADC sampling time register 0 */ +#define ADC_SAMPT1(adcx) REG32((adcx) + 0x10U) /*!< ADC sampling time register 1 */ +#define ADC_IOFF0(adcx) REG32((adcx) + 0x14U) /*!< ADC inserted channel data offset register 0 */ +#define ADC_IOFF1(adcx) REG32((adcx) + 0x18U) /*!< ADC inserted channel data offset register 1 */ +#define ADC_IOFF2(adcx) REG32((adcx) + 0x1CU) /*!< ADC inserted channel data offset register 2 */ +#define ADC_IOFF3(adcx) REG32((adcx) + 0x20U) /*!< ADC inserted channel data offset register 3 */ +#define ADC_WDHT(adcx) REG32((adcx) + 0x24U) /*!< ADC watchdog high threshold register */ +#define ADC_WDLT(adcx) REG32((adcx) + 0x28U) /*!< ADC watchdog low threshold register */ +#define ADC_RSQ0(adcx) REG32((adcx) + 0x2CU) /*!< ADC regular sequence register 0 */ +#define ADC_RSQ1(adcx) REG32((adcx) + 0x30U) /*!< ADC regular sequence register 1 */ +#define ADC_RSQ2(adcx) REG32((adcx) + 0x34U) /*!< ADC regular sequence register 2 */ +#define ADC_ISQ(adcx) REG32((adcx) + 0x38U) /*!< ADC inserted sequence register */ +#define ADC_IDATA0(adcx) REG32((adcx) + 0x3CU) /*!< ADC inserted data register 0 */ +#define ADC_IDATA1(adcx) REG32((adcx) + 0x40U) /*!< ADC inserted data register 1 */ +#define ADC_IDATA2(adcx) REG32((adcx) + 0x44U) /*!< ADC inserted data register 2 */ +#define ADC_IDATA3(adcx) REG32((adcx) + 0x48U) /*!< ADC inserted data register 3 */ +#define ADC_RDATA(adcx) REG32((adcx) + 0x4CU) /*!< ADC regular data register */ +#define ADC_OVSCR(adcx) REG32((adcx) + 0x80U) /*!< ADC oversample control register */ + +/* bits definitions */ +/* ADC_STAT */ +#define ADC_STAT_WDE BIT(0) /*!< analog watchdog event flag */ +#define ADC_STAT_EOC BIT(1) /*!< end of conversion */ +#define ADC_STAT_EOIC BIT(2) /*!< inserted channel end of conversion */ +#define ADC_STAT_STIC BIT(3) /*!< inserted channel start flag */ +#define ADC_STAT_STRC BIT(4) /*!< regular channel start flag */ + +/* ADC_CTL0 */ +#define ADC_CTL0_WDCHSEL BITS(0,4) /*!< analog watchdog channel select bits */ +#define ADC_CTL0_EOCIE BIT(5) /*!< interrupt enable for EOC */ +#define ADC_CTL0_WDEIE BIT(6) /*!< analog watchdog interrupt enable */ +#define ADC_CTL0_EOICIE BIT(7) /*!< interrupt enable for inserted channels */ +#define ADC_CTL0_SM BIT(8) /*!< scan mode */ +#define ADC_CTL0_WDSC BIT(9) /*!< when in scan mode, analog watchdog is effective on a single channel */ +#define ADC_CTL0_ICA BIT(10) /*!< automatic inserted group conversion */ +#define ADC_CTL0_DISRC BIT(11) /*!< discontinuous mode on regular channels */ +#define ADC_CTL0_DISIC BIT(12) /*!< discontinuous mode on inserted channels */ +#define ADC_CTL0_DISNUM BITS(13,15) /*!< discontinuous mode channel count */ +#define ADC_CTL0_SYNCM BITS(16,19) /*!< sync mode selection */ +#define ADC_CTL0_IWDEN BIT(22) /*!< analog watchdog enable on inserted channels */ +#define ADC_CTL0_RWDEN BIT(23) /*!< analog watchdog enable on regular channels */ + +/* ADC_CTL1 */ +#define ADC_CTL1_ADCON BIT(0) /*!< ADC converter on */ +#define ADC_CTL1_CTN BIT(1) /*!< continuous conversion */ +#define ADC_CTL1_CLB BIT(2) /*!< ADC calibration */ +#define ADC_CTL1_RSTCLB BIT(3) /*!< reset calibration */ +#define ADC_CTL1_DMA BIT(8) /*!< direct memory access mode */ +#define ADC_CTL1_DAL BIT(11) /*!< data alignment */ +#define ADC_CTL1_ETSIC BITS(12,14) /*!< external trigger select for inserted channel */ +#define ADC_CTL1_ETEIC BIT(15) /*!< external trigger enable for inserted channel */ +#define ADC_CTL1_ETSRC BITS(17,19) /*!< external trigger select for regular channel */ +#define ADC_CTL1_ETERC BIT(20) /*!< external trigger conversion mode for inserted channels */ +#define ADC_CTL1_SWICST BIT(21) /*!< start on inserted channel */ +#define ADC_CTL1_SWRCST BIT(22) /*!< start on regular channel */ +#define ADC_CTL1_TSVREN BIT(23) /*!< channel 16 and 17 enable of ADC0 */ + +/* ADC_SAMPTx x=0..1 */ +#define ADC_SAMPTX_SPTN BITS(0,2) /*!< channel n sample time selection */ + +/* ADC_IOFFx x=0..3 */ +#define ADC_IOFFX_IOFF BITS(0,11) /*!< data offset for inserted channel x */ + +/* ADC_WDHT */ +#define ADC_WDHT_WDHT BITS(0,11) /*!< analog watchdog high threshold */ + +/* ADC_WDLT */ +#define ADC_WDLT_WDLT BITS(0,11) /*!< analog watchdog low threshold */ + +/* ADC_RSQx x=0..2 */ +#define ADC_RSQX_RSQN BITS(0,4) /*!< nth conversion in regular sequence */ +#define ADC_RSQ0_RL BITS(20,23) /*!< regular channel sequence length */ + +/* ADC_ISQ */ +#define ADC_ISQ_ISQN BITS(0,4) /*!< nth conversion in inserted sequence */ +#define ADC_ISQ_IL BITS(20,21) /*!< inserted sequence length */ + +/* ADC_IDATAx x=0..3*/ +#define ADC_IDATAX_IDATAN BITS(0,15) /*!< inserted data n */ + +/* ADC_RDATA */ +#define ADC_RDATA_RDATA BITS(0,15) /*!< regular data */ +#define ADC_RDATA_ADC1RDTR BITS(16,31) /*!< ADC1 regular channel data */ + +/* ADC_OVSCR */ +#define ADC_OVSCR_OVSEN BIT(0) /*!< oversampling enable */ +#define ADC_OVSCR_OVSR BITS(2,4) /*!< oversampling ratio */ +#define ADC_OVSCR_OVSS BITS(5,8) /*!< oversampling shift */ +#define ADC_OVSCR_TOVS BIT(9) /*!< triggered oversampling */ +#define ADC_OVSCR_DRES BITS(12,13) /*!< ADC data resolution */ + +/* constants definitions */ +/* adc_stat register value */ +#define ADC_FLAG_WDE ADC_STAT_WDE /*!< analog watchdog event flag */ +#define ADC_FLAG_EOC ADC_STAT_EOC /*!< end of conversion */ +#define ADC_FLAG_EOIC ADC_STAT_EOIC /*!< inserted channel end of conversion */ +#define ADC_FLAG_STIC ADC_STAT_STIC /*!< inserted channel start flag */ +#define ADC_FLAG_STRC ADC_STAT_STRC /*!< regular channel start flag */ + +/* adc_ctl0 register value */ +#define CTL0_DISNUM(regval) (BITS(13,15) & ((uint32_t)(regval) << 13)) /*!< write value to ADC_CTL0_DISNUM bit field */ + +/* scan mode */ +#define ADC_SCAN_MODE ADC_CTL0_SM /*!< scan mode */ + +/* inserted channel group convert automatically */ +#define ADC_INSERTED_CHANNEL_AUTO ADC_CTL0_ICA /*!< inserted channel group convert automatically */ + +/* ADC sync mode */ +#define CTL0_SYNCM(regval) (BITS(16,19) & ((uint32_t)(regval) << 16)) /*!< write value to ADC_CTL0_SYNCM bit field */ +#define ADC_MODE_FREE CTL0_SYNCM(0) /*!< all the ADCs work independently */ +#define ADC_DAUL_REGULAL_PARALLEL_INSERTED_PARALLEL CTL0_SYNCM(1) /*!< ADC0 and ADC1 work in combined regular parallel + inserted parallel mode */ +#define ADC_DAUL_REGULAL_PARALLEL_INSERTED_ROTATION CTL0_SYNCM(2) /*!< ADC0 and ADC1 work in combined regular parallel + trigger rotation mode */ +#define ADC_DAUL_INSERTED_PARALLEL_REGULAL_FOLLOWUP_FAST CTL0_SYNCM(3) /*!< ADC0 and ADC1 work in combined inserted parallel + follow-up fast mode */ +#define ADC_DAUL_INSERTED_PARALLEL_REGULAL_FOLLOWUP_SLOW CTL0_SYNCM(4) /*!< ADC0 and ADC1 work in combined inserted parallel + follow-up slow mode */ +#define ADC_DAUL_INSERTED_PARALLEL CTL0_SYNCM(5) /*!< ADC0 and ADC1 work in inserted parallel mode only */ +#define ADC_DAUL_REGULAL_PARALLEL CTL0_SYNCM(6) /*!< ADC0 and ADC1 work in regular parallel mode only */ +#define ADC_DAUL_REGULAL_FOLLOWUP_FAST CTL0_SYNCM(7) /*!< ADC0 and ADC1 work in follow-up fast mode only */ +#define ADC_DAUL_REGULAL_FOLLOWUP_SLOW CTL0_SYNCM(8) /*!< ADC0 and ADC1 work in follow-up slow mode only */ +#define ADC_DAUL_INSERTED_TRIGGER_ROTATION CTL0_SYNCM(9) /*!< ADC0 and ADC1 work in trigger rotation mode only */ + +/* adc_ctl1 register value */ +#define ADC_DATAALIGN_RIGHT ((uint32_t)0x00000000U) /*!< LSB alignment */ +#define ADC_DATAALIGN_LEFT ADC_CTL1_DAL /*!< MSB alignment */ + +/* continuous mode */ +#define ADC_CONTINUOUS_MODE ADC_CTL1_CTN /*!< continuous mode */ + +/* external trigger select for regular channel */ +#define CTL1_ETSRC(regval) (BITS(17,19) & ((uint32_t)(regval) << 17)) /*!< write value to ADC_CTL1_ETSRC bit field */ +/* for ADC0 and ADC1 regular channel */ +#define ADC0_1_EXTTRIG_REGULAR_T0_CH0 CTL1_ETSRC(0) /*!< TIMER0 CH0 event select */ +#define ADC0_1_EXTTRIG_REGULAR_T0_CH1 CTL1_ETSRC(1) /*!< TIMER0 CH1 event select */ +#define ADC0_1_EXTTRIG_REGULAR_T0_CH2 CTL1_ETSRC(2) /*!< TIMER0 CH2 event select */ +#define ADC0_1_EXTTRIG_REGULAR_T1_CH1 CTL1_ETSRC(3) /*!< TIMER1 CH1 event select */ +#define ADC0_1_EXTTRIG_REGULAR_T2_TRGO CTL1_ETSRC(4) /*!< TIMER2 TRGO event select */ +#define ADC0_1_EXTTRIG_REGULAR_T3_CH3 CTL1_ETSRC(5) /*!< TIMER3 CH3 event select */ +#define ADC0_1_EXTTRIG_REGULAR_EXTI_11 CTL1_ETSRC(6) /*!< external interrupt line 11 */ +#define ADC0_1_EXTTRIG_REGULAR_NONE CTL1_ETSRC(7) /*!< software trigger */ + +/* external trigger mode for inserted channel */ +#define CTL1_ETSIC(regval) (BITS(12,14) & ((uint32_t)(regval) << 12)) /*!< write value to ADC_CTL1_ETSIC bit field */ +/* for ADC0 and ADC1 inserted channel */ +#define ADC0_1_EXTTRIG_INSERTED_T0_TRGO CTL1_ETSIC(0) /*!< TIMER0 TRGO event select */ +#define ADC0_1_EXTTRIG_INSERTED_T0_CH3 CTL1_ETSIC(1) /*!< TIMER0 CH3 event select */ +#define ADC0_1_EXTTRIG_INSERTED_T1_TRGO CTL1_ETSIC(2) /*!< TIMER1 TRGO event select */ +#define ADC0_1_EXTTRIG_INSERTED_T1_CH0 CTL1_ETSIC(3) /*!< TIMER1 CH0 event select */ +#define ADC0_1_EXTTRIG_INSERTED_T2_CH3 CTL1_ETSIC(4) /*!< TIMER2 CH3 event select */ +#define ADC0_1_EXTTRIG_INSERTED_T3_TRGO CTL1_ETSIC(5) /*!< TIMER3 TRGO event select */ +#define ADC0_1_EXTTRIG_INSERTED_EXTI_15 CTL1_ETSIC(6) /*!< external interrupt line 15 */ +#define ADC0_1_EXTTRIG_INSERTED_NONE CTL1_ETSIC(7) /*!< software trigger */ + +/* adc_samptx register value */ +#define SAMPTX_SPT(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_SAMPTX_SPT bit field */ +#define ADC_SAMPLETIME_1POINT5 SAMPTX_SPT(0) /*!< 1.5 sampling cycles */ +#define ADC_SAMPLETIME_7POINT5 SAMPTX_SPT(1) /*!< 7.5 sampling cycles */ +#define ADC_SAMPLETIME_13POINT5 SAMPTX_SPT(2) /*!< 13.5 sampling cycles */ +#define ADC_SAMPLETIME_28POINT5 SAMPTX_SPT(3) /*!< 28.5 sampling cycles */ +#define ADC_SAMPLETIME_41POINT5 SAMPTX_SPT(4) /*!< 41.5 sampling cycles */ +#define ADC_SAMPLETIME_55POINT5 SAMPTX_SPT(5) /*!< 55.5 sampling cycles */ +#define ADC_SAMPLETIME_71POINT5 SAMPTX_SPT(6) /*!< 71.5 sampling cycles */ +#define ADC_SAMPLETIME_239POINT5 SAMPTX_SPT(7) /*!< 239.5 sampling cycles */ + +/* adc_ioffx register value */ +#define IOFFX_IOFF(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_IOFFX_IOFF bit field */ + +/* adc_wdht register value */ +#define WDHT_WDHT(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_WDHT_WDHT bit field */ + +/* adc_wdlt register value */ +#define WDLT_WDLT(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) /*!< write value to ADC_WDLT_WDLT bit field */ + +/* adc_rsqx register value */ +#define RSQ0_RL(regval) (BITS(20,23) & ((uint32_t)(regval) << 20)) /*!< write value to ADC_RSQ0_RL bit field */ + +/* adc_isq register value */ +#define ISQ_IL(regval) (BITS(20,21) & ((uint32_t)(regval) << 20)) /*!< write value to ADC_ISQ_IL bit field */ + +/* ADC channel group definitions */ +#define ADC_REGULAR_CHANNEL ((uint8_t)0x01U) /*!< adc regular channel group */ +#define ADC_INSERTED_CHANNEL ((uint8_t)0x02U) /*!< adc inserted channel group */ +#define ADC_REGULAR_INSERTED_CHANNEL ((uint8_t)0x03U) /*!< both regular and inserted channel group */ + +#define ADC_CHANNEL_DISCON_DISABLE ((uint8_t)0x04U) /*!< disable discontinuous mode of regular & inserted channel */ + +/* ADC inserted channel definitions */ +#define ADC_INSERTED_CHANNEL_0 ((uint8_t)0x00U) /*!< adc inserted channel 0 */ +#define ADC_INSERTED_CHANNEL_1 ((uint8_t)0x01U) /*!< adc inserted channel 1 */ +#define ADC_INSERTED_CHANNEL_2 ((uint8_t)0x02U) /*!< adc inserted channel 2 */ +#define ADC_INSERTED_CHANNEL_3 ((uint8_t)0x03U) /*!< adc inserted channel 3 */ + +/* ADC channel definitions */ +#define ADC_CHANNEL_0 ((uint8_t)0x00U) /*!< ADC channel 0 */ +#define ADC_CHANNEL_1 ((uint8_t)0x01U) /*!< ADC channel 1 */ +#define ADC_CHANNEL_2 ((uint8_t)0x02U) /*!< ADC channel 2 */ +#define ADC_CHANNEL_3 ((uint8_t)0x03U) /*!< ADC channel 3 */ +#define ADC_CHANNEL_4 ((uint8_t)0x04U) /*!< ADC channel 4 */ +#define ADC_CHANNEL_5 ((uint8_t)0x05U) /*!< ADC channel 5 */ +#define ADC_CHANNEL_6 ((uint8_t)0x06U) /*!< ADC channel 6 */ +#define ADC_CHANNEL_7 ((uint8_t)0x07U) /*!< ADC channel 7 */ +#define ADC_CHANNEL_8 ((uint8_t)0x08U) /*!< ADC channel 8 */ +#define ADC_CHANNEL_9 ((uint8_t)0x09U) /*!< ADC channel 9 */ +#define ADC_CHANNEL_10 ((uint8_t)0x0AU) /*!< ADC channel 10 */ +#define ADC_CHANNEL_11 ((uint8_t)0x0BU) /*!< ADC channel 11 */ +#define ADC_CHANNEL_12 ((uint8_t)0x0CU) /*!< ADC channel 12 */ +#define ADC_CHANNEL_13 ((uint8_t)0x0DU) /*!< ADC channel 13 */ +#define ADC_CHANNEL_14 ((uint8_t)0x0EU) /*!< ADC channel 14 */ +#define ADC_CHANNEL_15 ((uint8_t)0x0FU) /*!< ADC channel 15 */ +#define ADC_CHANNEL_16 ((uint8_t)0x10U) /*!< ADC channel 16 */ +#define ADC_CHANNEL_17 ((uint8_t)0x11U) /*!< ADC channel 17 */ + +/* ADC interrupt */ +#define ADC_INT_WDE ADC_STAT_WDE /*!< analog watchdog event interrupt */ +#define ADC_INT_EOC ADC_STAT_EOC /*!< end of group conversion interrupt */ +#define ADC_INT_EOIC ADC_STAT_EOIC /*!< end of inserted group conversion interrupt */ + +/* ADC interrupt flag */ +#define ADC_INT_FLAG_WDE ADC_STAT_WDE /*!< analog watchdog event interrupt flag */ +#define ADC_INT_FLAG_EOC ADC_STAT_EOC /*!< end of group conversion interrupt flag */ +#define ADC_INT_FLAG_EOIC ADC_STAT_EOIC /*!< end of inserted group conversion interrupt flag */ + +/* ADC resolution definitions */ +#define OVSCR_DRES(regval) (BITS(12,13) & ((uint32_t)(regval) << 12)) +#define ADC_RESOLUTION_12B OVSCR_DRES(0) /*!< 12-bit ADC resolution */ +#define ADC_RESOLUTION_10B OVSCR_DRES(1) /*!< 10-bit ADC resolution */ +#define ADC_RESOLUTION_8B OVSCR_DRES(2) /*!< 8-bit ADC resolution */ +#define ADC_RESOLUTION_6B OVSCR_DRES(3) /*!< 6-bit ADC resolution */ + +/* ADC oversampling mode */ +#define ADC_OVERSAMPLING_ALL_CONVERT 0 /*!< all oversampled conversions for a channel are done consecutively after a trigger */ +#define ADC_OVERSAMPLING_ONE_CONVERT 1 /*!< each oversampled conversion for a channel needs a trigger */ + +/* ADC oversampling shift */ +#define OVSCR_OVSS(regval) (BITS(5,8) & ((uint32_t)(regval) << 5)) +#define ADC_OVERSAMPLING_SHIFT_NONE OVSCR_OVSS(0) /*!< no oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_1B OVSCR_OVSS(1) /*!< 1-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_2B OVSCR_OVSS(2) /*!< 2-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_3B OVSCR_OVSS(3) /*!< 3-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_4B OVSCR_OVSS(4) /*!< 4-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_5B OVSCR_OVSS(5) /*!< 5-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_6B OVSCR_OVSS(6) /*!< 6-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_7B OVSCR_OVSS(7) /*!< 7-bit oversampling shift */ +#define ADC_OVERSAMPLING_SHIFT_8B OVSCR_OVSS(8) /*!< 8-bit oversampling shift */ + +/* ADC oversampling ratio */ +#define OVSCR_OVSR(regval) (BITS(2,4) & ((uint32_t)(regval) << 2)) +#define ADC_OVERSAMPLING_RATIO_MUL2 OVSCR_OVSR(0) /*!< oversampling ratio X2 */ +#define ADC_OVERSAMPLING_RATIO_MUL4 OVSCR_OVSR(1) /*!< oversampling ratio X4 */ +#define ADC_OVERSAMPLING_RATIO_MUL8 OVSCR_OVSR(2) /*!< oversampling ratio X8 */ +#define ADC_OVERSAMPLING_RATIO_MUL16 OVSCR_OVSR(3) /*!< oversampling ratio X16 */ +#define ADC_OVERSAMPLING_RATIO_MUL32 OVSCR_OVSR(4) /*!< oversampling ratio X32 */ +#define ADC_OVERSAMPLING_RATIO_MUL64 OVSCR_OVSR(5) /*!< oversampling ratio X64 */ +#define ADC_OVERSAMPLING_RATIO_MUL128 OVSCR_OVSR(6) /*!< oversampling ratio X128 */ +#define ADC_OVERSAMPLING_RATIO_MUL256 OVSCR_OVSR(7) /*!< oversampling ratio X256 */ + +/* function declarations */ +/* initialization config */ +/* reset ADC */ +void adc_deinit(uint32_t adc_periph); +/* configure the ADC sync mode */ +void adc_mode_config(uint32_t mode); +/* enable or disable ADC special function */ +void adc_special_function_config(uint32_t adc_periph, uint32_t function, ControlStatus newvalue); +/* configure ADC data alignment */ +void adc_data_alignment_config(uint32_t adc_periph, uint32_t data_alignment); +/* enable ADC interface */ +void adc_enable(uint32_t adc_periph); +/* disable ADC interface */ +void adc_disable(uint32_t adc_periph); +/* ADC calibration and reset calibration */ +void adc_calibration_enable(uint32_t adc_periph); +/* enable the temperature sensor and Vrefint channel */ +void adc_tempsensor_vrefint_enable(void); +/* disable the temperature sensor and Vrefint channel */ +void adc_tempsensor_vrefint_disable(void); + +/* DMA config */ +/* enable DMA request */ +void adc_dma_mode_enable(uint32_t adc_periph); +/* disable DMA request */ +void adc_dma_mode_disable(uint32_t adc_periph); + +/* regular group and inserted group config */ +/* configure ADC discontinuous mode */ +void adc_discontinuous_mode_config(uint32_t adc_periph, uint8_t adc_channel_group, uint8_t length); + +/* configure the length of regular channel group or inserted channel group */ +void adc_channel_length_config(uint32_t adc_periph, uint8_t adc_channel_group, uint32_t length); +/* configure ADC regular channel */ +void adc_regular_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t adc_channel, uint32_t sample_time); +/* configure ADC inserted channel */ +void adc_inserted_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t adc_channel, uint32_t sample_time); +/* configure ADC inserted channel offset */ +void adc_inserted_channel_offset_config(uint32_t adc_periph, uint8_t inserted_channel, uint16_t offset); + +/* configure ADC external trigger source */ +void adc_external_trigger_source_config(uint32_t adc_periph, uint8_t adc_channel_group, uint32_t external_trigger_source); +/* configure ADC external trigger */ +void adc_external_trigger_config(uint32_t adc_periph, uint8_t adc_channel_group, ControlStatus newvalue); +/* enable ADC software trigger */ +void adc_software_trigger_enable(uint32_t adc_periph, uint8_t adc_channel_group); + +/* get channel data */ +/* read ADC regular group data register */ +uint16_t adc_regular_data_read(uint32_t adc_periph); +/* read ADC inserted group data register */ +uint16_t adc_inserted_data_read(uint32_t adc_periph, uint8_t inserted_channel); +/* read the last ADC0 and ADC1 conversion result data in sync mode */ +uint32_t adc_sync_mode_convert_value_read(void); + +/* watchdog config */ +/* configure ADC analog watchdog single channel */ +void adc_watchdog_single_channel_enable(uint32_t adc_periph, uint8_t adc_channel); +/* configure ADC analog watchdog group channel */ +void adc_watchdog_group_channel_enable(uint32_t adc_periph, uint8_t adc_channel_group); +/* disable ADC analog watchdog */ +void adc_watchdog_disable(uint32_t adc_periph); +/* configure ADC analog watchdog threshold */ +void adc_watchdog_threshold_config(uint32_t adc_periph, uint16_t low_threshold, uint16_t high_threshold); + +/* interrupt & flag functions */ +/* get the ADC flag bits */ +FlagStatus adc_flag_get(uint32_t adc_periph, uint32_t adc_flag); +/* clear the ADC flag bits */ +void adc_flag_clear(uint32_t adc_periph, uint32_t adc_flag); +/* get the bit state of ADCx software start conversion */ +FlagStatus adc_regular_software_startconv_flag_get(uint32_t adc_periph); +/* get the bit state of ADCx software inserted channel start conversion */ +FlagStatus adc_inserted_software_startconv_flag_get(uint32_t adc_periph); +/* get the ADC interrupt bits */ +FlagStatus adc_interrupt_flag_get(uint32_t adc_periph, uint32_t adc_interrupt); +/* clear the ADC flag */ +void adc_interrupt_flag_clear(uint32_t adc_periph, uint32_t adc_interrupt); +/* enable ADC interrupt */ +void adc_interrupt_enable(uint32_t adc_periph, uint32_t adc_interrupt); +/* disable ADC interrupt */ +void adc_interrupt_disable(uint32_t adc_periph, uint32_t adc_interrupt); + +/* ADC resolution & oversample */ +/* ADC resolution config */ +void adc_resolution_config(uint32_t adc_periph, uint32_t resolution); +/* ADC oversample mode config */ +void adc_oversample_mode_config(uint32_t adc_periph, uint8_t mode, uint16_t shift, uint8_t ratio); +/* enable ADC oversample mode */ +void adc_oversample_mode_enable(uint32_t adc_periph); +/* disable ADC oversample mode */ +void adc_oversample_mode_disable(uint32_t adc_periph); + +#endif /* GD32VF103_ADC_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h new file mode 100644 index 0000000..733d701 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_bkp.h @@ -0,0 +1,227 @@ +/*! + \file gd32vf103_bkp.h + \brief definitions for the BKP + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_BKP_H +#define GD32VF103_BKP_H + +#include "gd32vf103.h" + +/* BKP definitions */ +#define BKP BKP_BASE /*!< BKP base address */ + +/* registers definitions */ +#define BKP_DATA0 REG16((BKP) + 0x04U) /*!< BKP data register 0 */ +#define BKP_DATA1 REG16((BKP) + 0x08U) /*!< BKP data register 1 */ +#define BKP_DATA2 REG16((BKP) + 0x0CU) /*!< BKP data register 2 */ +#define BKP_DATA3 REG16((BKP) + 0x10U) /*!< BKP data register 3 */ +#define BKP_DATA4 REG16((BKP) + 0x14U) /*!< BKP data register 4 */ +#define BKP_DATA5 REG16((BKP) + 0x18U) /*!< BKP data register 5 */ +#define BKP_DATA6 REG16((BKP) + 0x1CU) /*!< BKP data register 6 */ +#define BKP_DATA7 REG16((BKP) + 0x20U) /*!< BKP data register 7 */ +#define BKP_DATA8 REG16((BKP) + 0x24U) /*!< BKP data register 8 */ +#define BKP_DATA9 REG16((BKP) + 0x28U) /*!< BKP data register 9 */ +#define BKP_DATA10 REG16((BKP) + 0x40U) /*!< BKP data register 10 */ +#define BKP_DATA11 REG16((BKP) + 0x44U) /*!< BKP data register 11 */ +#define BKP_DATA12 REG16((BKP) + 0x48U) /*!< BKP data register 12 */ +#define BKP_DATA13 REG16((BKP) + 0x4CU) /*!< BKP data register 13 */ +#define BKP_DATA14 REG16((BKP) + 0x50U) /*!< BKP data register 14 */ +#define BKP_DATA15 REG16((BKP) + 0x54U) /*!< BKP data register 15 */ +#define BKP_DATA16 REG16((BKP) + 0x58U) /*!< BKP data register 16 */ +#define BKP_DATA17 REG16((BKP) + 0x5CU) /*!< BKP data register 17 */ +#define BKP_DATA18 REG16((BKP) + 0x60U) /*!< BKP data register 18 */ +#define BKP_DATA19 REG16((BKP) + 0x64U) /*!< BKP data register 19 */ +#define BKP_DATA20 REG16((BKP) + 0x68U) /*!< BKP data register 20 */ +#define BKP_DATA21 REG16((BKP) + 0x6CU) /*!< BKP data register 21 */ +#define BKP_DATA22 REG16((BKP) + 0x70U) /*!< BKP data register 22 */ +#define BKP_DATA23 REG16((BKP) + 0x74U) /*!< BKP data register 23 */ +#define BKP_DATA24 REG16((BKP) + 0x78U) /*!< BKP data register 24 */ +#define BKP_DATA25 REG16((BKP) + 0x7CU) /*!< BKP data register 25 */ +#define BKP_DATA26 REG16((BKP) + 0x80U) /*!< BKP data register 26 */ +#define BKP_DATA27 REG16((BKP) + 0x84U) /*!< BKP data register 27 */ +#define BKP_DATA28 REG16((BKP) + 0x88U) /*!< BKP data register 28 */ +#define BKP_DATA29 REG16((BKP) + 0x8CU) /*!< BKP data register 29 */ +#define BKP_DATA30 REG16((BKP) + 0x90U) /*!< BKP data register 30 */ +#define BKP_DATA31 REG16((BKP) + 0x94U) /*!< BKP data register 31 */ +#define BKP_DATA32 REG16((BKP) + 0x98U) /*!< BKP data register 32 */ +#define BKP_DATA33 REG16((BKP) + 0x9CU) /*!< BKP data register 33 */ +#define BKP_DATA34 REG16((BKP) + 0xA0U) /*!< BKP data register 34 */ +#define BKP_DATA35 REG16((BKP) + 0xA4U) /*!< BKP data register 35 */ +#define BKP_DATA36 REG16((BKP) + 0xA8U) /*!< BKP data register 36 */ +#define BKP_DATA37 REG16((BKP) + 0xACU) /*!< BKP data register 37 */ +#define BKP_DATA38 REG16((BKP) + 0xB0U) /*!< BKP data register 38 */ +#define BKP_DATA39 REG16((BKP) + 0xB4U) /*!< BKP data register 39 */ +#define BKP_DATA40 REG16((BKP) + 0xB8U) /*!< BKP data register 40 */ +#define BKP_DATA41 REG16((BKP) + 0xBCU) /*!< BKP data register 41 */ +#define BKP_OCTL REG16((BKP) + 0x2CU) /*!< RTC signal output control register */ +#define BKP_TPCTL REG16((BKP) + 0x30U) /*!< tamper pin control register */ +#define BKP_TPCS REG16((BKP) + 0x34U) /*!< tamper control and status register */ + +/* bits definitions */ +/* BKP_DATA */ +#define BKP_DATA BITS(0,15) /*!< backup data */ + +/* BKP_OCTL */ +#define BKP_OCTL_RCCV BITS(0,6) /*!< RTC clock calibration value */ +#define BKP_OCTL_COEN BIT(7) /*!< RTC clock calibration output enable */ +#define BKP_OCTL_ASOEN BIT(8) /*!< RTC alarm or second signal output enable */ +#define BKP_OCTL_ROSEL BIT(9) /*!< RTC output selection */ + +/* BKP_TPCTL */ +#define BKP_TPCTL_TPEN BIT(0) /*!< tamper detection enable */ +#define BKP_TPCTL_TPAL BIT(1) /*!< tamper pin active level */ + +/* BKP_TPCS */ +#define BKP_TPCS_TER BIT(0) /*!< tamper event reset */ +#define BKP_TPCS_TIR BIT(1) /*!< tamper interrupt reset */ +#define BKP_TPCS_TPIE BIT(2) /*!< tamper interrupt enable */ +#define BKP_TPCS_TEF BIT(8) /*!< tamper event flag */ +#define BKP_TPCS_TIF BIT(9) /*!< tamper interrupt flag */ + +/* constants definitions */ +/* BKP data register number */ +typedef enum +{ + BKP_DATA_0 = 1, /*!< BKP data register 0 */ + BKP_DATA_1, /*!< BKP data register 1 */ + BKP_DATA_2, /*!< BKP data register 2 */ + BKP_DATA_3, /*!< BKP data register 3 */ + BKP_DATA_4, /*!< BKP data register 4 */ + BKP_DATA_5, /*!< BKP data register 5 */ + BKP_DATA_6, /*!< BKP data register 6 */ + BKP_DATA_7, /*!< BKP data register 7 */ + BKP_DATA_8, /*!< BKP data register 8 */ + BKP_DATA_9, /*!< BKP data register 9 */ + BKP_DATA_10, /*!< BKP data register 10 */ + BKP_DATA_11, /*!< BKP data register 11 */ + BKP_DATA_12, /*!< BKP data register 12 */ + BKP_DATA_13, /*!< BKP data register 13 */ + BKP_DATA_14, /*!< BKP data register 14 */ + BKP_DATA_15, /*!< BKP data register 15 */ + BKP_DATA_16, /*!< BKP data register 16 */ + BKP_DATA_17, /*!< BKP data register 17 */ + BKP_DATA_18, /*!< BKP data register 18 */ + BKP_DATA_19, /*!< BKP data register 19 */ + BKP_DATA_20, /*!< BKP data register 20 */ + BKP_DATA_21, /*!< BKP data register 21 */ + BKP_DATA_22, /*!< BKP data register 22 */ + BKP_DATA_23, /*!< BKP data register 23 */ + BKP_DATA_24, /*!< BKP data register 24 */ + BKP_DATA_25, /*!< BKP data register 25 */ + BKP_DATA_26, /*!< BKP data register 26 */ + BKP_DATA_27, /*!< BKP data register 27 */ + BKP_DATA_28, /*!< BKP data register 28 */ + BKP_DATA_29, /*!< BKP data register 29 */ + BKP_DATA_30, /*!< BKP data register 30 */ + BKP_DATA_31, /*!< BKP data register 31 */ + BKP_DATA_32, /*!< BKP data register 32 */ + BKP_DATA_33, /*!< BKP data register 33 */ + BKP_DATA_34, /*!< BKP data register 34 */ + BKP_DATA_35, /*!< BKP data register 35 */ + BKP_DATA_36, /*!< BKP data register 36 */ + BKP_DATA_37, /*!< BKP data register 37 */ + BKP_DATA_38, /*!< BKP data register 38 */ + BKP_DATA_39, /*!< BKP data register 39 */ + BKP_DATA_40, /*!< BKP data register 40 */ + BKP_DATA_41, /*!< BKP data register 41 */ +}bkp_data_register_enum; + +/* BKP register */ +#define BKP_DATA0_9(number) REG16((BKP) + 0x04U + (number) * 0x04U) +#define BKP_DATA10_41(number) REG16((BKP) + 0x40U + ((number)-10U) * 0x04U) + +/* get data of BKP data register */ +#define BKP_DATA_GET(regval) GET_BITS((uint32_t)(regval), 0, 15) + +/* RTC clock calibration value */ +#define OCTL_RCCV(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) + +/* RTC output selection */ +#define RTC_OUTPUT_ALARM_PULSE ((uint16_t)0x0000U) /*!< RTC alarm pulse is selected as the RTC output */ +#define RTC_OUTPUT_SECOND_PULSE ((uint16_t)0x0200U) /*!< RTC second pulse is selected as the RTC output */ + +/* tamper pin active level */ +#define TAMPER_PIN_ACTIVE_HIGH ((uint16_t)0x0000U) /*!< the tamper pin is active high */ +#define TAMPER_PIN_ACTIVE_LOW ((uint16_t)0x0002U) /*!< the tamper pin is active low */ + +/* tamper flag */ +#define BKP_FLAG_TAMPER BKP_TPCS_TEF /*!< tamper event flag */ + +/* tamper interrupt flag */ +#define BKP_INT_FLAG_TAMPER BKP_TPCS_TIF /*!< tamper interrupt flag */ + +/* function declarations */ +/* reset BKP registers */ +void bkp_deinit(void); +/* write BKP data register */ +void bkp_data_write(bkp_data_register_enum register_number, uint16_t data); +/* read BKP data register */ +uint16_t bkp_data_read(bkp_data_register_enum register_number); + +/* RTC related functions */ +/* enable RTC clock calibration output */ +void bkp_rtc_calibration_output_enable(void); +/* disable RTC clock calibration output */ +void bkp_rtc_calibration_output_disable(void); +/* enable RTC alarm or second signal output */ +void bkp_rtc_signal_output_enable(void); +/* disable RTC alarm or second signal output */ +void bkp_rtc_signal_output_disable(void); +/* select RTC output */ +void bkp_rtc_output_select(uint16_t outputsel); +/* set RTC clock calibration value */ +void bkp_rtc_calibration_value_set(uint8_t value); + +/* tamper pin related functions */ +/* enable tamper pin detection */ +void bkp_tamper_detection_enable(void); +/* disable tamper pin detection */ +void bkp_tamper_detection_disable(void); +/* set tamper pin active level */ +void bkp_tamper_active_level_set(uint16_t level); + +/* interrupt & flag functions */ +/* enable tamper interrupt */ +void bkp_interrupt_enable(void); +/* disable tamper interrupt */ +void bkp_interrupt_disable(void); +/* get tamper flag state */ +FlagStatus bkp_flag_get(void); +/* clear tamper flag state */ +void bkp_flag_clear(void); +/* get tamper interrupt flag state */ +FlagStatus bkp_interrupt_flag_get(void); +/* clear tamper interrupt flag state */ +void bkp_interrupt_flag_clear(void); + +#endif /* GD32VF103_BKP_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h new file mode 100644 index 0000000..c23674d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_can.h @@ -0,0 +1,717 @@ +/*! + \file gd32vf103_can.h + \brief definitions for the CAN + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_CAN_H +#define GD32VF103_CAN_H + +#include "gd32vf103.h" + +/* CAN definitions */ +#define CAN0 CAN_BASE /*!< CAN0 base address */ +#define CAN1 (CAN0 + 0x00000400U) /*!< CAN1 base address */ + +/* registers definitions */ +#define CAN_CTL(canx) REG32((canx) + 0x00U) /*!< CAN control register */ +#define CAN_STAT(canx) REG32((canx) + 0x04U) /*!< CAN status register */ +#define CAN_TSTAT(canx) REG32((canx) + 0x08U) /*!< CAN transmit status register*/ +#define CAN_RFIFO0(canx) REG32((canx) + 0x0CU) /*!< CAN receive FIFO0 register */ +#define CAN_RFIFO1(canx) REG32((canx) + 0x10U) /*!< CAN receive FIFO1 register */ +#define CAN_INTEN(canx) REG32((canx) + 0x14U) /*!< CAN interrupt enable register */ +#define CAN_ERR(canx) REG32((canx) + 0x18U) /*!< CAN error register */ +#define CAN_BT(canx) REG32((canx) + 0x1CU) /*!< CAN bit timing register */ +#define CAN_TMI0(canx) REG32((canx) + 0x180U) /*!< CAN transmit mailbox0 identifier register */ +#define CAN_TMP0(canx) REG32((canx) + 0x184U) /*!< CAN transmit mailbox0 property register */ +#define CAN_TMDATA00(canx) REG32((canx) + 0x188U) /*!< CAN transmit mailbox0 data0 register */ +#define CAN_TMDATA10(canx) REG32((canx) + 0x18CU) /*!< CAN transmit mailbox0 data1 register */ +#define CAN_TMI1(canx) REG32((canx) + 0x190U) /*!< CAN transmit mailbox1 identifier register */ +#define CAN_TMP1(canx) REG32((canx) + 0x194U) /*!< CAN transmit mailbox1 property register */ +#define CAN_TMDATA01(canx) REG32((canx) + 0x198U) /*!< CAN transmit mailbox1 data0 register */ +#define CAN_TMDATA11(canx) REG32((canx) + 0x19CU) /*!< CAN transmit mailbox1 data1 register */ +#define CAN_TMI2(canx) REG32((canx) + 0x1A0U) /*!< CAN transmit mailbox2 identifier register */ +#define CAN_TMP2(canx) REG32((canx) + 0x1A4U) /*!< CAN transmit mailbox2 property register */ +#define CAN_TMDATA02(canx) REG32((canx) + 0x1A8U) /*!< CAN transmit mailbox2 data0 register */ +#define CAN_TMDATA12(canx) REG32((canx) + 0x1ACU) /*!< CAN transmit mailbox2 data1 register */ +#define CAN_RFIFOMI0(canx) REG32((canx) + 0x1B0U) /*!< CAN receive FIFO0 mailbox identifier register */ +#define CAN_RFIFOMP0(canx) REG32((canx) + 0x1B4U) /*!< CAN receive FIFO0 mailbox property register */ +#define CAN_RFIFOMDATA00(canx) REG32((canx) + 0x1B8U) /*!< CAN receive FIFO0 mailbox data0 register */ +#define CAN_RFIFOMDATA10(canx) REG32((canx) + 0x1BCU) /*!< CAN receive FIFO0 mailbox data1 register */ +#define CAN_RFIFOMI1(canx) REG32((canx) + 0x1C0U) /*!< CAN receive FIFO1 mailbox identifier register */ +#define CAN_RFIFOMP1(canx) REG32((canx) + 0x1C4U) /*!< CAN receive FIFO1 mailbox property register */ +#define CAN_RFIFOMDATA01(canx) REG32((canx) + 0x1C8U) /*!< CAN receive FIFO1 mailbox data0 register */ +#define CAN_RFIFOMDATA11(canx) REG32((canx) + 0x1CCU) /*!< CAN receive FIFO1 mailbox data1 register */ +#define CAN_FCTL(canx) REG32((canx) + 0x200U) /*!< CAN filter control register */ +#define CAN_FMCFG(canx) REG32((canx) + 0x204U) /*!< CAN filter mode register */ +#define CAN_FSCFG(canx) REG32((canx) + 0x20CU) /*!< CAN filter scale register */ +#define CAN_FAFIFO(canx) REG32((canx) + 0x214U) /*!< CAN filter associated FIFO register */ +#define CAN_FW(canx) REG32((canx) + 0x21CU) /*!< CAN filter working register */ +#define CAN_F0DATA0(canx) REG32((canx) + 0x240U) /*!< CAN filter 0 data 0 register */ +#define CAN_F1DATA0(canx) REG32((canx) + 0x248U) /*!< CAN filter 1 data 0 register */ +#define CAN_F2DATA0(canx) REG32((canx) + 0x250U) /*!< CAN filter 2 data 0 register */ +#define CAN_F3DATA0(canx) REG32((canx) + 0x258U) /*!< CAN filter 3 data 0 register */ +#define CAN_F4DATA0(canx) REG32((canx) + 0x260U) /*!< CAN filter 4 data 0 register */ +#define CAN_F5DATA0(canx) REG32((canx) + 0x268U) /*!< CAN filter 5 data 0 register */ +#define CAN_F6DATA0(canx) REG32((canx) + 0x270U) /*!< CAN filter 6 data 0 register */ +#define CAN_F7DATA0(canx) REG32((canx) + 0x278U) /*!< CAN filter 7 data 0 register */ +#define CAN_F8DATA0(canx) REG32((canx) + 0x280U) /*!< CAN filter 8 data 0 register */ +#define CAN_F9DATA0(canx) REG32((canx) + 0x288U) /*!< CAN filter 9 data 0 register */ +#define CAN_F10DATA0(canx) REG32((canx) + 0x290U) /*!< CAN filter 10 data 0 register */ +#define CAN_F11DATA0(canx) REG32((canx) + 0x298U) /*!< CAN filter 11 data 0 register */ +#define CAN_F12DATA0(canx) REG32((canx) + 0x2A0U) /*!< CAN filter 12 data 0 register */ +#define CAN_F13DATA0(canx) REG32((canx) + 0x2A8U) /*!< CAN filter 13 data 0 register */ +#define CAN_F14DATA0(canx) REG32((canx) + 0x2B0U) /*!< CAN filter 14 data 0 register */ +#define CAN_F15DATA0(canx) REG32((canx) + 0x2B8U) /*!< CAN filter 15 data 0 register */ +#define CAN_F16DATA0(canx) REG32((canx) + 0x2C0U) /*!< CAN filter 16 data 0 register */ +#define CAN_F17DATA0(canx) REG32((canx) + 0x2C8U) /*!< CAN filter 17 data 0 register */ +#define CAN_F18DATA0(canx) REG32((canx) + 0x2D0U) /*!< CAN filter 18 data 0 register */ +#define CAN_F19DATA0(canx) REG32((canx) + 0x2D8U) /*!< CAN filter 19 data 0 register */ +#define CAN_F20DATA0(canx) REG32((canx) + 0x2E0U) /*!< CAN filter 20 data 0 register */ +#define CAN_F21DATA0(canx) REG32((canx) + 0x2E8U) /*!< CAN filter 21 data 0 register */ +#define CAN_F22DATA0(canx) REG32((canx) + 0x2F0U) /*!< CAN filter 22 data 0 register */ +#define CAN_F23DATA0(canx) REG32((canx) + 0x3F8U) /*!< CAN filter 23 data 0 register */ +#define CAN_F24DATA0(canx) REG32((canx) + 0x300U) /*!< CAN filter 24 data 0 register */ +#define CAN_F25DATA0(canx) REG32((canx) + 0x308U) /*!< CAN filter 25 data 0 register */ +#define CAN_F26DATA0(canx) REG32((canx) + 0x310U) /*!< CAN filter 26 data 0 register */ +#define CAN_F27DATA0(canx) REG32((canx) + 0x318U) /*!< CAN filter 27 data 0 register */ +#define CAN_F0DATA1(canx) REG32((canx) + 0x244U) /*!< CAN filter 0 data 1 register */ +#define CAN_F1DATA1(canx) REG32((canx) + 0x24CU) /*!< CAN filter 1 data 1 register */ +#define CAN_F2DATA1(canx) REG32((canx) + 0x254U) /*!< CAN filter 2 data 1 register */ +#define CAN_F3DATA1(canx) REG32((canx) + 0x25CU) /*!< CAN filter 3 data 1 register */ +#define CAN_F4DATA1(canx) REG32((canx) + 0x264U) /*!< CAN filter 4 data 1 register */ +#define CAN_F5DATA1(canx) REG32((canx) + 0x26CU) /*!< CAN filter 5 data 1 register */ +#define CAN_F6DATA1(canx) REG32((canx) + 0x274U) /*!< CAN filter 6 data 1 register */ +#define CAN_F7DATA1(canx) REG32((canx) + 0x27CU) /*!< CAN filter 7 data 1 register */ +#define CAN_F8DATA1(canx) REG32((canx) + 0x284U) /*!< CAN filter 8 data 1 register */ +#define CAN_F9DATA1(canx) REG32((canx) + 0x28CU) /*!< CAN filter 9 data 1 register */ +#define CAN_F10DATA1(canx) REG32((canx) + 0x294U) /*!< CAN filter 10 data 1 register */ +#define CAN_F11DATA1(canx) REG32((canx) + 0x29CU) /*!< CAN filter 11 data 1 register */ +#define CAN_F12DATA1(canx) REG32((canx) + 0x2A4U) /*!< CAN filter 12 data 1 register */ +#define CAN_F13DATA1(canx) REG32((canx) + 0x2ACU) /*!< CAN filter 13 data 1 register */ +#define CAN_F14DATA1(canx) REG32((canx) + 0x2B4U) /*!< CAN filter 14 data 1 register */ +#define CAN_F15DATA1(canx) REG32((canx) + 0x2BCU) /*!< CAN filter 15 data 1 register */ +#define CAN_F16DATA1(canx) REG32((canx) + 0x2C4U) /*!< CAN filter 16 data 1 register */ +#define CAN_F17DATA1(canx) REG32((canx) + 0x24CU) /*!< CAN filter 17 data 1 register */ +#define CAN_F18DATA1(canx) REG32((canx) + 0x2D4U) /*!< CAN filter 18 data 1 register */ +#define CAN_F19DATA1(canx) REG32((canx) + 0x2DCU) /*!< CAN filter 19 data 1 register */ +#define CAN_F20DATA1(canx) REG32((canx) + 0x2E4U) /*!< CAN filter 20 data 1 register */ +#define CAN_F21DATA1(canx) REG32((canx) + 0x2ECU) /*!< CAN filter 21 data 1 register */ +#define CAN_F22DATA1(canx) REG32((canx) + 0x2F4U) /*!< CAN filter 22 data 1 register */ +#define CAN_F23DATA1(canx) REG32((canx) + 0x2FCU) /*!< CAN filter 23 data 1 register */ +#define CAN_F24DATA1(canx) REG32((canx) + 0x304U) /*!< CAN filter 24 data 1 register */ +#define CAN_F25DATA1(canx) REG32((canx) + 0x30CU) /*!< CAN filter 25 data 1 register */ +#define CAN_F26DATA1(canx) REG32((canx) + 0x314U) /*!< CAN filter 26 data 1 register */ +#define CAN_F27DATA1(canx) REG32((canx) + 0x31CU) /*!< CAN filter 27 data 1 register */ + +/* CAN transmit mailbox bank */ +#define CAN_TMI(canx, bank) REG32((canx) + 0x180U + ((bank) * 0x10U)) /*!< CAN transmit mailbox identifier register */ +#define CAN_TMP(canx, bank) REG32((canx) + 0x184U + ((bank) * 0x10U)) /*!< CAN transmit mailbox property register */ +#define CAN_TMDATA0(canx, bank) REG32((canx) + 0x188U + ((bank) * 0x10U)) /*!< CAN transmit mailbox data0 register */ +#define CAN_TMDATA1(canx, bank) REG32((canx) + 0x18CU + ((bank) * 0x10U)) /*!< CAN transmit mailbox data1 register */ + +/* CAN filter bank */ +#define CAN_FDATA0(canx, bank) REG32((canx) + 0x240U + ((bank) * 0x8U) + 0x0U) /*!< CAN filter data 0 register */ +#define CAN_FDATA1(canx, bank) REG32((canx) + 0x240U + ((bank) * 0x8U) + 0x4U) /*!< CAN filter data 1 register */ + +/* CAN receive fifo mailbox bank */ +#define CAN_RFIFOMI(canx, bank) REG32((canx) + 0x1B0U + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox identifier register */ +#define CAN_RFIFOMP(canx, bank) REG32((canx) + 0x1B4U + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox property register */ +#define CAN_RFIFOMDATA0(canx, bank) REG32((canx) + 0x1B8U + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox data0 register */ +#define CAN_RFIFOMDATA1(canx, bank) REG32((canx) + 0x1BCU + ((bank) * 0x10U)) /*!< CAN receive FIFO mailbox data1 register */ + +/* bits definitions */ +/* CAN_CTL */ +#define CAN_CTL_IWMOD BIT(0) /*!< initial working mode */ +#define CAN_CTL_SLPWMOD BIT(1) /*!< sleep working mode */ +#define CAN_CTL_TFO BIT(2) /*!< transmit FIFO order */ +#define CAN_CTL_RFOD BIT(3) /*!< receive FIFO overwrite disable */ +#define CAN_CTL_ARD BIT(4) /*!< automatic retransmission disable */ +#define CAN_CTL_AWU BIT(5) /*!< automatic wakeup */ +#define CAN_CTL_ABOR BIT(6) /*!< automatic bus-off recovery */ +#define CAN_CTL_TTC BIT(7) /*!< time triggered communication */ +#define CAN_CTL_SWRST BIT(15) /*!< CAN software reset */ +#define CAN_CTL_DFZ BIT(16) /*!< CAN debug freeze */ + +/* CAN_STAT */ +#define CAN_STAT_IWS BIT(0) /*!< initial working state */ +#define CAN_STAT_SLPWS BIT(1) /*!< sleep working state */ +#define CAN_STAT_ERRIF BIT(2) /*!< error interrupt flag*/ +#define CAN_STAT_WUIF BIT(3) /*!< status change interrupt flag of wakeup from sleep working mode */ +#define CAN_STAT_SLPIF BIT(4) /*!< status change interrupt flag of sleep working mode entering */ +#define CAN_STAT_TS BIT(8) /*!< transmitting state */ +#define CAN_STAT_RS BIT(9) /*!< receiving state */ +#define CAN_STAT_LASTRX BIT(10) /*!< last sample value of rx pin */ +#define CAN_STAT_RXL BIT(11) /*!< CAN rx signal */ + +/* CAN_TSTAT */ +#define CAN_TSTAT_MTF0 BIT(0) /*!< mailbox0 transmit finished */ +#define CAN_TSTAT_MTFNERR0 BIT(1) /*!< mailbox0 transmit finished and no error */ +#define CAN_TSTAT_MAL0 BIT(2) /*!< mailbox0 arbitration lost */ +#define CAN_TSTAT_MTE0 BIT(3) /*!< mailbox0 transmit error */ +#define CAN_TSTAT_MST0 BIT(7) /*!< mailbox0 stop transmitting */ +#define CAN_TSTAT_MTF1 BIT(8) /*!< mailbox1 transmit finished */ +#define CAN_TSTAT_MTFNERR1 BIT(9) /*!< mailbox1 transmit finished and no error */ +#define CAN_TSTAT_MAL1 BIT(10) /*!< mailbox1 arbitration lost */ +#define CAN_TSTAT_MTE1 BIT(11) /*!< mailbox1 transmit error */ +#define CAN_TSTAT_MST1 BIT(15) /*!< mailbox1 stop transmitting */ +#define CAN_TSTAT_MTF2 BIT(16) /*!< mailbox2 transmit finished */ +#define CAN_TSTAT_MTFNERR2 BIT(17) /*!< mailbox2 transmit finished and no error */ +#define CAN_TSTAT_MAL2 BIT(18) /*!< mailbox2 arbitration lost */ +#define CAN_TSTAT_MTE2 BIT(19) /*!< mailbox2 transmit error */ +#define CAN_TSTAT_MST2 BIT(23) /*!< mailbox2 stop transmitting */ +#define CAN_TSTAT_NUM BITS(24,25) /*!< mailbox number */ +#define CAN_TSTAT_TME0 BIT(26) /*!< transmit mailbox0 empty */ +#define CAN_TSTAT_TME1 BIT(27) /*!< transmit mailbox1 empty */ +#define CAN_TSTAT_TME2 BIT(28) /*!< transmit mailbox2 empty */ +#define CAN_TSTAT_TMLS0 BIT(29) /*!< last sending priority flag for mailbox0 */ +#define CAN_TSTAT_TMLS1 BIT(30) /*!< last sending priority flag for mailbox1 */ +#define CAN_TSTAT_TMLS2 BIT(31) /*!< last sending priority flag for mailbox2 */ + +/* CAN_RFIFO0 */ +#define CAN_RFIFO0_RFL0 BITS(0,1) /*!< receive FIFO0 length */ +#define CAN_RFIFO0_RFF0 BIT(3) /*!< receive FIFO0 full */ +#define CAN_RFIFO0_RFO0 BIT(4) /*!< receive FIFO0 overfull */ +#define CAN_RFIFO0_RFD0 BIT(5) /*!< receive FIFO0 dequeue */ + +/* CAN_RFIFO1 */ +#define CAN_RFIFO1_RFL1 BITS(0,1) /*!< receive FIFO1 length */ +#define CAN_RFIFO1_RFF1 BIT(3) /*!< receive FIFO1 full */ +#define CAN_RFIFO1_RFO1 BIT(4) /*!< receive FIFO1 overfull */ +#define CAN_RFIFO1_RFD1 BIT(5) /*!< receive FIFO1 dequeue */ + +/* CAN_INTEN */ +#define CAN_INTEN_TMEIE BIT(0) /*!< transmit mailbox empty interrupt enable */ +#define CAN_INTEN_RFNEIE0 BIT(1) /*!< receive FIFO0 not empty interrupt enable */ +#define CAN_INTEN_RFFIE0 BIT(2) /*!< receive FIFO0 full interrupt enable */ +#define CAN_INTEN_RFOIE0 BIT(3) /*!< receive FIFO0 overfull interrupt enable */ +#define CAN_INTEN_RFNEIE1 BIT(4) /*!< receive FIFO1 not empty interrupt enable */ +#define CAN_INTEN_RFFIE1 BIT(5) /*!< receive FIFO1 full interrupt enable */ +#define CAN_INTEN_RFOIE1 BIT(6) /*!< receive FIFO1 overfull interrupt enable */ +#define CAN_INTEN_WERRIE BIT(8) /*!< warning error interrupt enable */ +#define CAN_INTEN_PERRIE BIT(9) /*!< passive error interrupt enable */ +#define CAN_INTEN_BOIE BIT(10) /*!< bus-off interrupt enable */ +#define CAN_INTEN_ERRNIE BIT(11) /*!< error number interrupt enable */ +#define CAN_INTEN_ERRIE BIT(15) /*!< error interrupt enable */ +#define CAN_INTEN_WIE BIT(16) /*!< wakeup interrupt enable */ +#define CAN_INTEN_SLPWIE BIT(17) /*!< sleep working interrupt enable */ + +/* CAN_ERR */ +#define CAN_ERR_WERR BIT(0) /*!< warning error */ +#define CAN_ERR_PERR BIT(1) /*!< passive error */ +#define CAN_ERR_BOERR BIT(2) /*!< bus-off error */ +#define CAN_ERR_ERRN BITS(4,6) /*!< error number */ +#define CAN_ERR_TECNT BITS(16,23) /*!< transmit error count */ +#define CAN_ERR_RECNT BITS(24,31) /*!< receive error count */ + +/* CAN_BT */ +#define CAN_BT_BAUDPSC BITS(0,9) /*!< baudrate prescaler */ +#define CAN_BT_BS1 BITS(16,19) /*!< bit segment 1 */ +#define CAN_BT_BS2 BITS(20,22) /*!< bit segment 2 */ +#define CAN_BT_SJW BITS(24,25) /*!< resynchronization jump width */ +#define CAN_BT_LCMOD BIT(30) /*!< loopback communication mode */ +#define CAN_BT_SCMOD BIT(31) /*!< silent communication mode */ + +/* CAN_TMIx */ +#define CAN_TMI_TEN BIT(0) /*!< transmit enable */ +#define CAN_TMI_FT BIT(1) /*!< frame type */ +#define CAN_TMI_FF BIT(2) /*!< frame format */ +#define CAN_TMI_EFID BITS(3,31) /*!< the frame identifier */ +#define CAN_TMI_SFID BITS(21,31) /*!< the frame identifier */ + +/* CAN_TMPx */ +#define CAN_TMP_DLENC BITS(0,3) /*!< data length code */ +#define CAN_TMP_TSEN BIT(8) /*!< time stamp enable */ +#define CAN_TMP_TS BITS(16,31) /*!< time stamp */ + +/* CAN_TMDATA0x */ +#define CAN_TMDATA0_DB0 BITS(0,7) /*!< transmit data byte 0 */ +#define CAN_TMDATA0_DB1 BITS(8,15) /*!< transmit data byte 1 */ +#define CAN_TMDATA0_DB2 BITS(16,23) /*!< transmit data byte 2 */ +#define CAN_TMDATA0_DB3 BITS(24,31) /*!< transmit data byte 3 */ + +/* CAN_TMDATA1x */ +#define CAN_TMDATA1_DB4 BITS(0,7) /*!< transmit data byte 4 */ +#define CAN_TMDATA1_DB5 BITS(8,15) /*!< transmit data byte 5 */ +#define CAN_TMDATA1_DB6 BITS(16,23) /*!< transmit data byte 6 */ +#define CAN_TMDATA1_DB7 BITS(24,31) /*!< transmit data byte 7 */ + +/* CAN_RFIFOMIx */ +#define CAN_RFIFOMI_FT BIT(1) /*!< frame type */ +#define CAN_RFIFOMI_FF BIT(2) /*!< frame format */ +#define CAN_RFIFOMI_EFID BITS(3,31) /*!< the frame identifier */ +#define CAN_RFIFOMI_SFID BITS(21,31) /*!< the frame identifier */ + +/* CAN_RFIFOMPx */ +#define CAN_RFIFOMP_DLENC BITS(0,3) /*!< receive data length code */ +#define CAN_RFIFOMP_FI BITS(8,15) /*!< filter index */ +#define CAN_RFIFOMP_TS BITS(16,31) /*!< time stamp */ + +/* CAN_RFIFOMDATA0x */ +#define CAN_RFIFOMDATA0_DB0 BITS(0,7) /*!< receive data byte 0 */ +#define CAN_RFIFOMDATA0_DB1 BITS(8,15) /*!< receive data byte 1 */ +#define CAN_RFIFOMDATA0_DB2 BITS(16,23) /*!< receive data byte 2 */ +#define CAN_RFIFOMDATA0_DB3 BITS(24,31) /*!< receive data byte 3 */ + +/* CAN_RFIFOMDATA1x */ +#define CAN_RFIFOMDATA1_DB4 BITS(0,7) /*!< receive data byte 4 */ +#define CAN_RFIFOMDATA1_DB5 BITS(8,15) /*!< receive data byte 5 */ +#define CAN_RFIFOMDATA1_DB6 BITS(16,23) /*!< receive data byte 6 */ +#define CAN_RFIFOMDATA1_DB7 BITS(24,31) /*!< receive data byte 7 */ + +/* CAN_FCTL */ +#define CAN_FCTL_FLD BIT(0) /*!< filter lock disable */ +#define CAN_FCTL_HBC1F BITS(8,13) /*!< header bank of CAN1 filter */ + +/* CAN_FMCFG */ +#define CAN_FMCFG_FMOD(regval) BIT(regval) /*!< filter mode, list or mask*/ + +/* CAN_FSCFG */ +#define CAN_FSCFG_FS(regval) BIT(regval) /*!< filter scale, 32 bits or 16 bits*/ + +/* CAN_FAFIFO */ +#define CAN_FAFIFOR_FAF(regval) BIT(regval) /*!< filter associated with FIFO */ + +/* CAN_FW */ +#define CAN_FW_FW(regval) BIT(regval) /*!< filter working */ + +/* CAN_FxDATAy */ +#define CAN_FDATA_FD(regval) BIT(regval) /*!< filter data */ + +/* consts definitions */ +/* define the CAN bit position and its register index offset */ +#define CAN_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define CAN_REG_VAL(canx, offset) (REG32((canx) + ((uint32_t)(offset) >> 6))) +#define CAN_BIT_POS(val) ((uint32_t)(val) & 0x1FU) + +#define CAN_REGIDX_BITS(regidx, bitpos0, bitpos1) (((uint32_t)(regidx) << 12) | ((uint32_t)(bitpos0) << 6) | (uint32_t)(bitpos1)) +#define CAN_REG_VALS(canx, offset) (REG32((canx) + ((uint32_t)(offset) >> 12))) +#define CAN_BIT_POS0(val) (((uint32_t)(val) >> 6) & 0x1FU) +#define CAN_BIT_POS1(val) ((uint32_t)(val) & 0x1FU) + +/* register offset */ +#define STAT_REG_OFFSET ((uint8_t)0x04U) /*!< STAT register offset */ +#define TSTAT_REG_OFFSET ((uint8_t)0x08U) /*!< TSTAT register offset */ +#define RFIFO0_REG_OFFSET ((uint8_t)0x0CU) /*!< RFIFO0 register offset */ +#define RFIFO1_REG_OFFSET ((uint8_t)0x10U) /*!< RFIFO1 register offset */ +#define ERR_REG_OFFSET ((uint8_t)0x18U) /*!< ERR register offset */ + +/* CAN flags */ +typedef enum { + /* flags in TSTAT register */ + CAN_FLAG_MTE2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 19U), /*!< mailbox 2 transmit error */ + CAN_FLAG_MTE1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 11U), /*!< mailbox 1 transmit error */ + CAN_FLAG_MTE0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 3U), /*!< mailbox 0 transmit error */ + CAN_FLAG_MTF2 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 16U), /*!< mailbox 2 transmit finished */ + CAN_FLAG_MTF1 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 8U), /*!< mailbox 1 transmit finished */ + CAN_FLAG_MTF0 = CAN_REGIDX_BIT(TSTAT_REG_OFFSET, 0U), /*!< mailbox 0 transmit finished */ + /* flags in RFIFO0 register */ + CAN_FLAG_RFO0 = CAN_REGIDX_BIT(RFIFO0_REG_OFFSET, 4U), /*!< receive FIFO0 overfull */ + CAN_FLAG_RFF0 = CAN_REGIDX_BIT(RFIFO0_REG_OFFSET, 3U), /*!< receive FIFO0 full */ + /* flags in RFIFO1 register */ + CAN_FLAG_RFO1 = CAN_REGIDX_BIT(RFIFO1_REG_OFFSET, 4U), /*!< receive FIFO1 overfull */ + CAN_FLAG_RFF1 = CAN_REGIDX_BIT(RFIFO1_REG_OFFSET, 3U), /*!< receive FIFO1 full */ + /* flags in ERR register */ + CAN_FLAG_BOERR = CAN_REGIDX_BIT(ERR_REG_OFFSET, 2U), /*!< bus-off error */ + CAN_FLAG_PERR = CAN_REGIDX_BIT(ERR_REG_OFFSET, 1U), /*!< passive error */ + CAN_FLAG_WERR = CAN_REGIDX_BIT(ERR_REG_OFFSET, 0U), /*!< warning error */ +} can_flag_enum; + +/* CAN interrupt flags */ +typedef enum { + /* interrupt flags in STAT register */ + CAN_INT_FLAG_SLPIF = CAN_REGIDX_BITS(STAT_REG_OFFSET, 4U, 17U), /*!< status change interrupt flag of sleep working mode entering */ + CAN_INT_FLAG_WUIF = CAN_REGIDX_BITS(STAT_REG_OFFSET, 3U, 16), /*!< status change interrupt flag of wakeup from sleep working mode */ + CAN_INT_FLAG_ERRIF = CAN_REGIDX_BITS(STAT_REG_OFFSET, 2U, 15), /*!< error interrupt flag */ + /* interrupt flags in TSTAT register */ + CAN_INT_FLAG_MTF2 = CAN_REGIDX_BITS(TSTAT_REG_OFFSET, 16U, 0U), /*!< mailbox 2 transmit finished interrupt flag */ + CAN_INT_FLAG_MTF1 = CAN_REGIDX_BITS(TSTAT_REG_OFFSET, 8U, 0U), /*!< mailbox 1 transmit finished interrupt flag */ + CAN_INT_FLAG_MTF0 = CAN_REGIDX_BITS(TSTAT_REG_OFFSET, 0U, 0U), /*!< mailbox 0 transmit finished interrupt flag */ + /* interrupt flags in RFIFO0 register */ + CAN_INT_FLAG_RFO0 = CAN_REGIDX_BITS(RFIFO0_REG_OFFSET, 4U, 3U), /*!< receive FIFO0 overfull interrupt flag */ + CAN_INT_FLAG_RFF0 = CAN_REGIDX_BITS(RFIFO0_REG_OFFSET, 3U, 2U), /*!< receive FIFO0 full interrupt flag */ + /* interrupt flags in RFIFO0 register */ + CAN_INT_FLAG_RFO1 = CAN_REGIDX_BITS(RFIFO1_REG_OFFSET, 4U, 6U), /*!< receive FIFO1 overfull interrupt flag */ + CAN_INT_FLAG_RFF1 = CAN_REGIDX_BITS(RFIFO1_REG_OFFSET, 3U, 5U), /*!< receive FIFO1 full interrupt flag */ +} can_interrupt_flag_enum; + +/* CAN initiliaze parameters struct */ +typedef struct { + uint8_t working_mode; /*!< CAN working mode */ + uint8_t resync_jump_width; /*!< CAN resynchronization jump width */ + uint8_t time_segment_1; /*!< time segment 1 */ + uint8_t time_segment_2; /*!< time segment 2 */ + ControlStatus time_triggered; /*!< time triggered communication mode */ + ControlStatus auto_bus_off_recovery; /*!< automatic bus-off recovery */ + ControlStatus auto_wake_up; /*!< automatic wake-up mode */ + ControlStatus no_auto_retrans; /*!< automatic retransmission mode disable */ + ControlStatus rec_fifo_overwrite; /*!< receive FIFO overwrite mode */ + ControlStatus trans_fifo_order; /*!< transmit FIFO order */ + uint16_t prescaler; /*!< baudrate prescaler */ +} can_parameter_struct; + +/* CAN transmit message struct */ +typedef struct { + uint32_t tx_sfid; /*!< standard format frame identifier */ + uint32_t tx_efid; /*!< extended format frame identifier */ + uint8_t tx_ff; /*!< format of frame, standard or extended format */ + uint8_t tx_ft; /*!< type of frame, data or remote */ + uint8_t tx_dlen; /*!< data length */ + uint8_t tx_data[8]; /*!< transmit data */ +} can_trasnmit_message_struct; + +/* CAN receive message struct */ +typedef struct { + uint32_t rx_sfid; /*!< standard format frame identifier */ + uint32_t rx_efid; /*!< extended format frame identifier */ + uint8_t rx_ff; /*!< format of frame, standard or extended format */ + uint8_t rx_ft; /*!< type of frame, data or remote */ + uint8_t rx_dlen; /*!< data length */ + uint8_t rx_data[8]; /*!< receive data */ + uint8_t rx_fi; /*!< filtering index */ +} can_receive_message_struct; + +/* CAN filter parameters struct */ +typedef struct { + uint16_t filter_list_high; /*!< filter list number high bits*/ + uint16_t filter_list_low; /*!< filter list number low bits */ + uint16_t filter_mask_high; /*!< filter mask number high bits */ + uint16_t filter_mask_low; /*!< filter mask number low bits */ + uint16_t filter_fifo_number; /*!< receive FIFO associated with the filter */ + uint16_t filter_number; /*!< filter number */ + uint16_t filter_mode; /*!< filter mode, list or mask */ + uint16_t filter_bits; /*!< filter scale */ + ControlStatus filter_enable; /*!< filter work or not */ +} can_filter_parameter_struct; + +/* CAN errors */ +typedef enum { + CAN_ERROR_NONE = 0, /*!< no error */ + CAN_ERROR_FILL, /*!< fill error */ + CAN_ERROR_FORMATE, /*!< format error */ + CAN_ERROR_ACK, /*!< ACK error */ + CAN_ERROR_BITRECESSIVE, /*!< bit recessive error */ + CAN_ERROR_BITDOMINANTER, /*!< bit dominant error */ + CAN_ERROR_CRC, /*!< CRC error */ + CAN_ERROR_SOFTWARECFG, /*!< software configure */ +} can_error_enum; + +/* transmit states */ +typedef enum { + CAN_TRANSMIT_FAILED = 0, /*!< CAN transmitted failure */ + CAN_TRANSMIT_OK = 1, /*!< CAN transmitted success */ + CAN_TRANSMIT_PENDING = 2, /*!< CAN transmitted pending */ + CAN_TRANSMIT_NOMAILBOX = 4, /*!< no empty mailbox to be used for CAN */ +} can_transmit_state_enum; + +typedef enum { + CAN_INIT_STRUCT = 0, /* CAN initiliaze parameters struct */ + CAN_FILTER_STRUCT, /* CAN filter parameters struct */ + CAN_TX_MESSAGE_STRUCT, /* CAN transmit message struct */ + CAN_RX_MESSAGE_STRUCT, /* CAN receive message struct */ +} can_struct_type_enum; + +/* CAN baudrate prescaler*/ +#define BT_BAUDPSC(regval) (BITS(0,9) & ((uint32_t)(regval) << 0)) + +/* CAN bit segment 1*/ +#define BT_BS1(regval) (BITS(16,19) & ((uint32_t)(regval) << 16)) + +/* CAN bit segment 2*/ +#define BT_BS2(regval) (BITS(20,22) & ((uint32_t)(regval) << 20)) + +/* CAN resynchronization jump width*/ +#define BT_SJW(regval) (BITS(24,25) & ((uint32_t)(regval) << 24)) + +/* CAN communication mode*/ +#define BT_MODE(regval) (BITS(30,31) & ((uint32_t)(regval) << 30)) + +/* CAN FDATA high 16 bits */ +#define FDATA_MASK_HIGH(regval) (BITS(16,31) & ((uint32_t)(regval) << 16)) + +/* CAN FDATA low 16 bits */ +#define FDATA_MASK_LOW(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) + +/* CAN1 filter start bank_number*/ +#define FCTL_HBC1F(regval) (BITS(8,13) & ((uint32_t)(regval) << 8)) + +/* CAN transmit mailbox extended identifier*/ +#define TMI_EFID(regval) (BITS(3,31) & ((uint32_t)(regval) << 3)) + +/* CAN transmit mailbox standard identifier*/ +#define TMI_SFID(regval) (BITS(21,31) & ((uint32_t)(regval) << 21)) + +/* transmit data byte 0 */ +#define TMDATA0_DB0(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) + +/* transmit data byte 1 */ +#define TMDATA0_DB1(regval) (BITS(8,15) & ((uint32_t)(regval) << 8)) + +/* transmit data byte 2 */ +#define TMDATA0_DB2(regval) (BITS(16,23) & ((uint32_t)(regval) << 16)) + +/* transmit data byte 3 */ +#define TMDATA0_DB3(regval) (BITS(24,31) & ((uint32_t)(regval) << 24)) + +/* transmit data byte 4 */ +#define TMDATA1_DB4(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) + +/* transmit data byte 5 */ +#define TMDATA1_DB5(regval) (BITS(8,15) & ((uint32_t)(regval) << 8)) + +/* transmit data byte 6 */ +#define TMDATA1_DB6(regval) (BITS(16,23) & ((uint32_t)(regval) << 16)) + +/* transmit data byte 7 */ +#define TMDATA1_DB7(regval) (BITS(24,31) & ((uint32_t)(regval) << 24)) + +/* receive mailbox extended identifier*/ +#define GET_RFIFOMI_EFID(regval) GET_BITS((uint32_t)(regval), 3, 31) + +/* receive mailbox standrad identifier*/ +#define GET_RFIFOMI_SFID(regval) GET_BITS((uint32_t)(regval), 21, 31) + +/* receive data length */ +#define GET_RFIFOMP_DLENC(regval) GET_BITS((uint32_t)(regval), 0, 3) + +/* the index of the filter by which the frame is passed */ +#define GET_RFIFOMP_FI(regval) GET_BITS((uint32_t)(regval), 8, 15) + +/* receive data byte 0 */ +#define GET_RFIFOMDATA0_DB0(regval) GET_BITS((uint32_t)(regval), 0, 7) + +/* receive data byte 1 */ +#define GET_RFIFOMDATA0_DB1(regval) GET_BITS((uint32_t)(regval), 8, 15) + +/* receive data byte 2 */ +#define GET_RFIFOMDATA0_DB2(regval) GET_BITS((uint32_t)(regval), 16, 23) + +/* receive data byte 3 */ +#define GET_RFIFOMDATA0_DB3(regval) GET_BITS((uint32_t)(regval), 24, 31) + +/* receive data byte 4 */ +#define GET_RFIFOMDATA1_DB4(regval) GET_BITS((uint32_t)(regval), 0, 7) + +/* receive data byte 5 */ +#define GET_RFIFOMDATA1_DB5(regval) GET_BITS((uint32_t)(regval), 8, 15) + +/* receive data byte 6 */ +#define GET_RFIFOMDATA1_DB6(regval) GET_BITS((uint32_t)(regval), 16, 23) + +/* receive data byte 7 */ +#define GET_RFIFOMDATA1_DB7(regval) GET_BITS((uint32_t)(regval), 24, 31) + +/* error number */ +#define GET_ERR_ERRN(regval) GET_BITS((uint32_t)(regval), 4, 6) + +/* transmit error count */ +#define GET_ERR_TECNT(regval) GET_BITS((uint32_t)(regval), 16, 23) + +/* receive error count */ +#define GET_ERR_RECNT(regval) GET_BITS((uint32_t)(regval), 24, 31) + +/* CAN errors */ +#define ERR_ERRN(regval) (BITS(4,6) & ((uint32_t)(regval) << 4)) +#define CAN_ERRN_0 ERR_ERRN(0) /* no error */ +#define CAN_ERRN_1 ERR_ERRN(1) /*!< fill error */ +#define CAN_ERRN_2 ERR_ERRN(2) /*!< format error */ +#define CAN_ERRN_3 ERR_ERRN(3) /*!< ACK error */ +#define CAN_ERRN_4 ERR_ERRN(4) /*!< bit recessive error */ +#define CAN_ERRN_5 ERR_ERRN(5) /*!< bit dominant error */ +#define CAN_ERRN_6 ERR_ERRN(6) /*!< CRC error */ +#define CAN_ERRN_7 ERR_ERRN(7) /*!< software error */ + +#define CAN_STATE_PENDING ((uint32_t)0x00000000U) /*!< CAN pending */ + +/* CAN communication mode */ +#define CAN_NORMAL_MODE ((uint8_t)0x00U) /*!< normal communication mode */ +#define CAN_LOOPBACK_MODE ((uint8_t)0x01U) /*!< loopback communication mode */ +#define CAN_SILENT_MODE ((uint8_t)0x02U) /*!< silent communication mode */ +#define CAN_SILENT_LOOPBACK_MODE ((uint8_t)0x03U) /*!< loopback and silent communication mode */ + +/* CAN resynchronisation jump width */ +#define CAN_BT_SJW_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ +#define CAN_BT_SJW_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ +#define CAN_BT_SJW_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ +#define CAN_BT_SJW_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ + +/* CAN time segment 1 */ +#define CAN_BT_BS1_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ +#define CAN_BT_BS1_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ +#define CAN_BT_BS1_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ +#define CAN_BT_BS1_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ +#define CAN_BT_BS1_5TQ ((uint8_t)0x04U) /*!< 5 time quanta */ +#define CAN_BT_BS1_6TQ ((uint8_t)0x05U) /*!< 6 time quanta */ +#define CAN_BT_BS1_7TQ ((uint8_t)0x06U) /*!< 7 time quanta */ +#define CAN_BT_BS1_8TQ ((uint8_t)0x07U) /*!< 8 time quanta */ +#define CAN_BT_BS1_9TQ ((uint8_t)0x08U) /*!< 9 time quanta */ +#define CAN_BT_BS1_10TQ ((uint8_t)0x09U) /*!< 10 time quanta */ +#define CAN_BT_BS1_11TQ ((uint8_t)0x0AU) /*!< 11 time quanta */ +#define CAN_BT_BS1_12TQ ((uint8_t)0x0BU) /*!< 12 time quanta */ +#define CAN_BT_BS1_13TQ ((uint8_t)0x0CU) /*!< 13 time quanta */ +#define CAN_BT_BS1_14TQ ((uint8_t)0x0DU) /*!< 14 time quanta */ +#define CAN_BT_BS1_15TQ ((uint8_t)0x0EU) /*!< 15 time quanta */ +#define CAN_BT_BS1_16TQ ((uint8_t)0x0FU) /*!< 16 time quanta */ + +/* CAN time segment 2 */ +#define CAN_BT_BS2_1TQ ((uint8_t)0x00U) /*!< 1 time quanta */ +#define CAN_BT_BS2_2TQ ((uint8_t)0x01U) /*!< 2 time quanta */ +#define CAN_BT_BS2_3TQ ((uint8_t)0x02U) /*!< 3 time quanta */ +#define CAN_BT_BS2_4TQ ((uint8_t)0x03U) /*!< 4 time quanta */ +#define CAN_BT_BS2_5TQ ((uint8_t)0x04U) /*!< 5 time quanta */ +#define CAN_BT_BS2_6TQ ((uint8_t)0x05U) /*!< 6 time quanta */ +#define CAN_BT_BS2_7TQ ((uint8_t)0x06U) /*!< 7 time quanta */ +#define CAN_BT_BS2_8TQ ((uint8_t)0x07U) /*!< 8 time quanta */ + +/* CAN mailbox number */ +#define CAN_MAILBOX0 ((uint8_t)0x00U) /*!< mailbox0 */ +#define CAN_MAILBOX1 ((uint8_t)0x01U) /*!< mailbox1 */ +#define CAN_MAILBOX2 ((uint8_t)0x02U) /*!< mailbox2 */ +#define CAN_NOMAILBOX ((uint8_t)0x03U) /*!< no mailbox empty */ + +/* CAN frame format */ +#define CAN_FF_STANDARD ((uint32_t)0x00000000U) /*!< standard frame */ +#define CAN_FF_EXTENDED ((uint32_t)0x00000004U) /*!< extended frame */ + +/* CAN receive fifo */ +#define CAN_FIFO0 ((uint8_t)0x00U) /*!< receive FIFO0 */ +#define CAN_FIFO1 ((uint8_t)0x01U) /*!< receive FIFO1 */ + +/* frame number of receive fifo */ +#define CAN_RFIF_RFL_MASK ((uint32_t)0x00000003U) /*!< mask for frame number in receive FIFOx */ + +#define CAN_SFID_MASK ((uint32_t)0x000007FFU) /*!< mask of standard identifier */ +#define CAN_EFID_MASK ((uint32_t)0x1FFFFFFFU) /*!< mask of extended identifier */ + +/* CAN working mode */ +#define CAN_MODE_INITIALIZE ((uint8_t)0x01U) /*!< CAN initialize mode */ +#define CAN_MODE_NORMAL ((uint8_t)0x02U) /*!< CAN normal mode */ +#define CAN_MODE_SLEEP ((uint8_t)0x04U) /*!< CAN sleep mode */ + +/* filter bits */ +#define CAN_FILTERBITS_16BIT ((uint8_t)0x00U) /*!< CAN filter 16 bits */ +#define CAN_FILTERBITS_32BIT ((uint8_t)0x01U) /*!< CAN filter 32 bits */ + +/* filter mode */ +#define CAN_FILTERMODE_MASK ((uint8_t)0x00U) /*!< mask mode */ +#define CAN_FILTERMODE_LIST ((uint8_t)0x01U) /*!< list mode */ + +/* filter 16 bits mask */ +#define CAN_FILTER_MASK_16BITS ((uint32_t)0x0000FFFFU) /*!< can filter 16 bits mask */ + +/* frame type */ +#define CAN_FT_DATA ((uint32_t)0x00000000U) /*!< data frame */ +#define CAN_FT_REMOTE ((uint32_t)0x00000002U) /*!< remote frame */ + +/* CAN timeout */ +#define CAN_TIMEOUT ((uint32_t)0x0000FFFFU) /*!< timeout value */ + +/* interrupt enable bits */ +#define CAN_INT_TME CAN_INTEN_TMEIE /*!< transmit mailbox empty interrupt enable */ +#define CAN_INT_RFNE0 CAN_INTEN_RFNEIE0 /*!< receive FIFO0 not empty interrupt enable */ +#define CAN_INT_RFF0 CAN_INTEN_RFFIE0 /*!< receive FIFO0 full interrupt enable */ +#define CAN_INT_RFO0 CAN_INTEN_RFOIE0 /*!< receive FIFO0 overfull interrupt enable */ +#define CAN_INT_RFNE1 CAN_INTEN_RFNEIE1 /*!< receive FIFO1 not empty interrupt enable */ +#define CAN_INT_RFF1 CAN_INTEN_RFFIE1 /*!< receive FIFO1 full interrupt enable */ +#define CAN_INT_RFO1 CAN_INTEN_RFOIE1 /*!< receive FIFO1 overfull interrupt enable */ +#define CAN_INT_WERR CAN_INTEN_WERRIE /*!< warning error interrupt enable */ +#define CAN_INT_PERR CAN_INTEN_PERRIE /*!< passive error interrupt enable */ +#define CAN_INT_BO CAN_INTEN_BOIE /*!< bus-off interrupt enable */ +#define CAN_INT_ERRN CAN_INTEN_ERRNIE /*!< error number interrupt enable */ +#define CAN_INT_ERR CAN_INTEN_ERRIE /*!< error interrupt enable */ +#define CAN_INT_WAKEUP CAN_INTEN_WIE /*!< wakeup interrupt enable */ +#define CAN_INT_SLPW CAN_INTEN_SLPWIE /*!< sleep working interrupt enable */ + +/* function declarations */ +/* deinitialize CAN */ +void can_deinit(uint32_t can_periph); +/* initialize CAN struct */ +void can_struct_para_init(can_struct_type_enum type, void* p_struct); +/* initialize CAN */ +ErrStatus can_init(uint32_t can_periph, + can_parameter_struct* can_parameter_init); +/* CAN filter init */ +void can_filter_init(can_filter_parameter_struct* can_filter_parameter_init); +/* set can1 fliter start bank number */ +void can1_filter_start_bank(uint8_t start_bank); +/* enable functions */ +/* CAN debug freeze enable */ +void can_debug_freeze_enable(uint32_t can_periph); +/* CAN debug freeze disable */ +void can_debug_freeze_disable(uint32_t can_periph); +/* CAN time trigger mode enable */ +void can_time_trigger_mode_enable(uint32_t can_periph); +/* CAN time trigger mode disable */ +void can_time_trigger_mode_disable(uint32_t can_periph); + +/* transmit functions */ +/* transmit CAN message */ +uint8_t can_message_transmit(uint32_t can_periph, + can_trasnmit_message_struct* transmit_message); +/* get CAN transmit state */ +can_transmit_state_enum can_transmit_states(uint32_t can_periph, + uint8_t mailbox_number); +/* stop CAN transmission */ +void can_transmission_stop(uint32_t can_periph, uint8_t mailbox_number); +/* CAN receive message */ +void can_message_receive(uint32_t can_periph, uint8_t fifo_number, + can_receive_message_struct* receive_message); +/* CAN release fifo */ +void can_fifo_release(uint32_t can_periph, uint8_t fifo_number); +/* CAN receive message length */ +uint8_t can_receive_message_length_get(uint32_t can_periph, uint8_t fifo_number); +/* CAN working mode */ +ErrStatus can_working_mode_set(uint32_t can_periph, uint8_t working_mode); +/* CAN wakeup from sleep mode */ +ErrStatus can_wakeup(uint32_t can_periph); + +/* CAN get error */ +can_error_enum can_error_get(uint32_t can_periph); +/* get CAN receive error number */ +uint8_t can_receive_error_number_get(uint32_t can_periph); +/* get CAN transmit error number */ +uint8_t can_transmit_error_number_get(uint32_t can_periph); + +/* CAN interrupt enable */ +void can_interrupt_enable(uint32_t can_periph, uint32_t interrupt); +/* CAN interrupt disable */ +void can_interrupt_disable(uint32_t can_periph, uint32_t interrupt); +/* CAN get flag state */ +FlagStatus can_flag_get(uint32_t can_periph, can_flag_enum flag); +/* CAN clear flag state */ +void can_flag_clear(uint32_t can_periph, can_flag_enum flag); +/* CAN get interrupt flag state */ +FlagStatus can_interrupt_flag_get(uint32_t can_periph, + can_interrupt_flag_enum flag); +/* CAN clear interrupt flag state */ +void can_interrupt_flag_clear(uint32_t can_periph, can_interrupt_flag_enum flag); + +#endif /* GD32VF103_CAN_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h new file mode 100644 index 0000000..78b94e7 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_crc.h @@ -0,0 +1,78 @@ +/*! + \file gd32vf103_crc.h + \brief definitions for the CRC + + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_CRC_H +#define GD32VF103_CRC_H + +#include "gd32vf103.h" + +/* CRC definitions */ +#define CRC CRC_BASE + +/* registers definitions */ +#define CRC_DATA REG32(CRC + 0x00U) /*!< CRC data register */ +#define CRC_FDATA REG32(CRC + 0x04U) /*!< CRC free data register */ +#define CRC_CTL REG32(CRC + 0x08U) /*!< CRC control register */ + +/* bits definitions */ +/* CRC_DATA */ +#define CRC_DATA_DATA BITS(0, 31) /*!< CRC calculation result bits */ + +/* CRC_FDATA */ +#define CRC_FDATA_FDATA BITS(0, 7) /*!< CRC free data bits */ + +/* CRC_CTL */ +#define CRC_CTL_RST BIT(0) /*!< CRC reset CRC_DATA register bit */ + +/* function declarations */ +/* deinit CRC calculation unit */ +void crc_deinit(void); + +/* reset data register(CRC_DATA) to the value of 0xFFFFFFFF */ +void crc_data_register_reset(void); +/* read the value of the data register */ +uint32_t crc_data_register_read(void); + +/* read the value of the free data register */ +uint8_t crc_free_data_register_read(void); +/* write data to the free data register */ +void crc_free_data_register_write(uint8_t free_data); + +/* calculate the CRC value of a 32-bit data */ +uint32_t crc_single_data_calculate(uint32_t sdata); +/* calculate the CRC value of an array of 32-bit values */ +uint32_t crc_block_data_calculate(uint32_t array[], uint32_t size); + +#endif /* GD32VF103_CRC_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h new file mode 100644 index 0000000..3ebc930 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dac.h @@ -0,0 +1,242 @@ +/*! + \file gd32vf103_dac.h + \brief definitions for the DAC + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_DAC_H +#define GD32VF103_DAC_H + +#include "gd32vf103.h" + +/* DACx(x=0,1) definitions */ +#define DAC DAC_BASE +#define DAC0 (0U) +#define DAC1 (1U) + +/* registers definitions */ +#define DAC_CTL REG32(DAC + 0x00U) /*!< DAC control register */ +#define DAC_SWT REG32(DAC + 0x04U) /*!< DAC software trigger register */ +#define DAC0_R12DH REG32(DAC + 0x08U) /*!< DAC0 12-bit right-aligned data holding register */ +#define DAC0_L12DH REG32(DAC + 0x0CU) /*!< DAC0 12-bit left-aligned data holding register */ +#define DAC0_R8DH REG32(DAC + 0x10U) /*!< DAC0 8-bit right-aligned data holding register */ +#define DAC1_R12DH REG32(DAC + 0x14U) /*!< DAC1 12-bit right-aligned data holding register */ +#define DAC1_L12DH REG32(DAC + 0x18U) /*!< DAC1 12-bit left-aligned data holding register */ +#define DAC1_R8DH REG32(DAC + 0x1CU) /*!< DAC1 8-bit right-aligned data holding register */ +#define DACC_R12DH REG32(DAC + 0x20U) /*!< DAC concurrent mode 12-bit right-aligned data holding register */ +#define DACC_L12DH REG32(DAC + 0x24U) /*!< DAC concurrent mode 12-bit left-aligned data holding register */ +#define DACC_R8DH REG32(DAC + 0x28U) /*!< DAC concurrent mode 8-bit right-aligned data holding register */ +#define DAC0_DO REG32(DAC + 0x2CU) /*!< DAC0 data output register */ +#define DAC1_DO REG32(DAC + 0x30U) /*!< DAC1 data output register */ + +/* bits definitions */ +/* DAC_CTL */ +#define DAC_CTL_DEN0 BIT(0) /*!< DAC0 enable/disable bit */ +#define DAC_CTL_DBOFF0 BIT(1) /*!< DAC0 output buffer turn on/turn off bit */ +#define DAC_CTL_DTEN0 BIT(2) /*!< DAC0 trigger enable/disable bit */ +#define DAC_CTL_DTSEL0 BITS(3,5) /*!< DAC0 trigger source selection enable/disable bits */ +#define DAC_CTL_DWM0 BITS(6,7) /*!< DAC0 noise wave mode */ +#define DAC_CTL_DWBW0 BITS(8,11) /*!< DAC0 noise wave bit width */ +#define DAC_CTL_DDMAEN0 BIT(12) /*!< DAC0 DMA enable/disable bit */ +#define DAC_CTL_DEN1 BIT(16) /*!< DAC1 enable/disable bit */ +#define DAC_CTL_DBOFF1 BIT(17) /*!< DAC1 output buffer turn on/turn off bit */ +#define DAC_CTL_DTEN1 BIT(18) /*!< DAC1 trigger enable/disable bit */ +#define DAC_CTL_DTSEL1 BITS(19,21) /*!< DAC1 trigger source selection enable/disable bits */ +#define DAC_CTL_DWM1 BITS(22,23) /*!< DAC1 noise wave mode */ +#define DAC_CTL_DWBW1 BITS(24,27) /*!< DAC1 noise wave bit width */ +#define DAC_CTL_DDMAEN1 BIT(28) /*!< DAC1 DMA enable/disable bit */ + +/* DAC_SWT */ +#define DAC_SWT_SWTR0 BIT(0) /*!< DAC0 software trigger bit, cleared by hardware */ +#define DAC_SWT_SWTR1 BIT(1) /*!< DAC1 software trigger bit, cleared by hardware */ + +/* DAC0_R12DH */ +#define DAC0_R12DH_DAC0_DH BITS(0,11) /*!< DAC0 12-bit right-aligned data bits */ + +/* DAC0_L12DH */ +#define DAC0_L12DH_DAC0_DH BITS(4,15) /*!< DAC0 12-bit left-aligned data bits */ + +/* DAC0_R8DH */ +#define DAC0_R8DH_DAC0_DH BITS(0,7) /*!< DAC0 8-bit right-aligned data bits */ + +/* DAC1_R12DH */ +#define DAC1_R12DH_DAC1_DH BITS(0,11) /*!< DAC1 12-bit right-aligned data bits */ + +/* DAC1_L12DH */ +#define DAC1_L12DH_DAC1_DH BITS(4,15) /*!< DAC1 12-bit left-aligned data bits */ + +/* DAC1_R8DH */ +#define DAC1_R8DH_DAC1_DH BITS(0,7) /*!< DAC1 8-bit right-aligned data bits */ + +/* DACC_R12DH */ +#define DACC_R12DH_DAC0_DH BITS(0,11) /*!< DAC concurrent mode DAC0 12-bit right-aligned data bits */ +#define DACC_R12DH_DAC1_DH BITS(16,27) /*!< DAC concurrent mode DAC1 12-bit right-aligned data bits */ + +/* DACC_L12DH */ +#define DACC_L12DH_DAC0_DH BITS(4,15) /*!< DAC concurrent mode DAC0 12-bit left-aligned data bits */ +#define DACC_L12DH_DAC1_DH BITS(20,31) /*!< DAC concurrent mode DAC1 12-bit left-aligned data bits */ + +/* DACC_R8DH */ +#define DACC_R8DH_DAC0_DH BITS(0,7) /*!< DAC concurrent mode DAC0 8-bit right-aligned data bits */ +#define DACC_R8DH_DAC1_DH BITS(8,15) /*!< DAC concurrent mode DAC1 8-bit right-aligned data bits */ + +/* DAC0_DO */ +#define DAC0_DO_DAC0_DO BITS(0,11) /*!< DAC0 12-bit output data bits */ + +/* DAC1_DO */ +#define DAC1_DO_DAC1_DO BITS(0,11) /*!< DAC1 12-bit output data bits */ + +/* constants definitions */ +/* DAC trigger source */ +#define CTL_DTSEL(regval) (BITS(3,5) & ((uint32_t)(regval) << 3)) +#define DAC_TRIGGER_T5_TRGO CTL_DTSEL(0) /*!< TIMER5 TRGO */ +#define DAC_TRIGGER_T2_TRGO CTL_DTSEL(1) /*!< TIMER2 TRGO */ +#define DAC_TRIGGER_T6_TRGO CTL_DTSEL(2) /*!< TIMER6 TRGO */ +#define DAC_TRIGGER_T4_TRGO CTL_DTSEL(3) /*!< TIMER4 TRGO */ +#define DAC_TRIGGER_T1_TRGO CTL_DTSEL(4) /*!< TIMER1 TRGO */ +#define DAC_TRIGGER_T3_TRGO CTL_DTSEL(5) /*!< TIMER3 TRGO */ +#define DAC_TRIGGER_EXTI_9 CTL_DTSEL(6) /*!< EXTI interrupt line9 event */ +#define DAC_TRIGGER_SOFTWARE CTL_DTSEL(7) /*!< software trigger */ + +/* DAC noise wave mode */ +#define CTL_DWM(regval) (BITS(6,7) & ((uint32_t)(regval) << 6)) +#define DAC_WAVE_DISABLE CTL_DWM(0) /*!< wave disable */ +#define DAC_WAVE_MODE_LFSR CTL_DWM(1) /*!< LFSR noise mode */ +#define DAC_WAVE_MODE_TRIANGLE CTL_DWM(2) /*!< triangle noise mode */ + +/* DAC noise wave bit width */ +#define DWBW(regval) (BITS(8,11) & ((uint32_t)(regval) << 8)) +#define DAC_WAVE_BIT_WIDTH_1 DWBW(0) /*!< bit width of the wave signal is 1 */ +#define DAC_WAVE_BIT_WIDTH_2 DWBW(1) /*!< bit width of the wave signal is 2 */ +#define DAC_WAVE_BIT_WIDTH_3 DWBW(2) /*!< bit width of the wave signal is 3 */ +#define DAC_WAVE_BIT_WIDTH_4 DWBW(3) /*!< bit width of the wave signal is 4 */ +#define DAC_WAVE_BIT_WIDTH_5 DWBW(4) /*!< bit width of the wave signal is 5 */ +#define DAC_WAVE_BIT_WIDTH_6 DWBW(5) /*!< bit width of the wave signal is 6 */ +#define DAC_WAVE_BIT_WIDTH_7 DWBW(6) /*!< bit width of the wave signal is 7 */ +#define DAC_WAVE_BIT_WIDTH_8 DWBW(7) /*!< bit width of the wave signal is 8 */ +#define DAC_WAVE_BIT_WIDTH_9 DWBW(8) /*!< bit width of the wave signal is 9 */ +#define DAC_WAVE_BIT_WIDTH_10 DWBW(9) /*!< bit width of the wave signal is 10 */ +#define DAC_WAVE_BIT_WIDTH_11 DWBW(10) /*!< bit width of the wave signal is 11 */ +#define DAC_WAVE_BIT_WIDTH_12 DWBW(11) /*!< bit width of the wave signal is 12 */ + +/* unmask LFSR bits in DAC LFSR noise mode */ +#define DAC_LFSR_BIT0 DAC_WAVE_BIT_WIDTH_1 /*!< unmask the LFSR bit0 */ +#define DAC_LFSR_BITS1_0 DAC_WAVE_BIT_WIDTH_2 /*!< unmask the LFSR bits[1:0] */ +#define DAC_LFSR_BITS2_0 DAC_WAVE_BIT_WIDTH_3 /*!< unmask the LFSR bits[2:0] */ +#define DAC_LFSR_BITS3_0 DAC_WAVE_BIT_WIDTH_4 /*!< unmask the LFSR bits[3:0] */ +#define DAC_LFSR_BITS4_0 DAC_WAVE_BIT_WIDTH_5 /*!< unmask the LFSR bits[4:0] */ +#define DAC_LFSR_BITS5_0 DAC_WAVE_BIT_WIDTH_6 /*!< unmask the LFSR bits[5:0] */ +#define DAC_LFSR_BITS6_0 DAC_WAVE_BIT_WIDTH_7 /*!< unmask the LFSR bits[6:0] */ +#define DAC_LFSR_BITS7_0 DAC_WAVE_BIT_WIDTH_8 /*!< unmask the LFSR bits[7:0] */ +#define DAC_LFSR_BITS8_0 DAC_WAVE_BIT_WIDTH_9 /*!< unmask the LFSR bits[8:0] */ +#define DAC_LFSR_BITS9_0 DAC_WAVE_BIT_WIDTH_10 /*!< unmask the LFSR bits[9:0] */ +#define DAC_LFSR_BITS10_0 DAC_WAVE_BIT_WIDTH_11 /*!< unmask the LFSR bits[10:0] */ +#define DAC_LFSR_BITS11_0 DAC_WAVE_BIT_WIDTH_12 /*!< unmask the LFSR bits[11:0] */ + +/* DAC data alignment */ +#define DATA_ALIGN(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define DAC_ALIGN_12B_R DATA_ALIGN(0) /*!< data right 12b alignment */ +#define DAC_ALIGN_12B_L DATA_ALIGN(1) /*!< data left 12b alignment */ +#define DAC_ALIGN_8B_R DATA_ALIGN(2) /*!< data right 8b alignment */ +/* triangle amplitude in DAC triangle noise mode */ +#define DAC_TRIANGLE_AMPLITUDE_1 DAC_WAVE_BIT_WIDTH_1 /*!< triangle amplitude is 1 */ +#define DAC_TRIANGLE_AMPLITUDE_3 DAC_WAVE_BIT_WIDTH_2 /*!< triangle amplitude is 3 */ +#define DAC_TRIANGLE_AMPLITUDE_7 DAC_WAVE_BIT_WIDTH_3 /*!< triangle amplitude is 7 */ +#define DAC_TRIANGLE_AMPLITUDE_15 DAC_WAVE_BIT_WIDTH_4 /*!< triangle amplitude is 15 */ +#define DAC_TRIANGLE_AMPLITUDE_31 DAC_WAVE_BIT_WIDTH_5 /*!< triangle amplitude is 31 */ +#define DAC_TRIANGLE_AMPLITUDE_63 DAC_WAVE_BIT_WIDTH_6 /*!< triangle amplitude is 63 */ +#define DAC_TRIANGLE_AMPLITUDE_127 DAC_WAVE_BIT_WIDTH_7 /*!< triangle amplitude is 127 */ +#define DAC_TRIANGLE_AMPLITUDE_255 DAC_WAVE_BIT_WIDTH_8 /*!< triangle amplitude is 255 */ +#define DAC_TRIANGLE_AMPLITUDE_511 DAC_WAVE_BIT_WIDTH_9 /*!< triangle amplitude is 511 */ +#define DAC_TRIANGLE_AMPLITUDE_1023 DAC_WAVE_BIT_WIDTH_10 /*!< triangle amplitude is 1023 */ +#define DAC_TRIANGLE_AMPLITUDE_2047 DAC_WAVE_BIT_WIDTH_11 /*!< triangle amplitude is 2047 */ +#define DAC_TRIANGLE_AMPLITUDE_4095 DAC_WAVE_BIT_WIDTH_12 /*!< triangle amplitude is 4095 */ + +/* function declarations */ +/* initialization functions */ +/* deinitialize DAC */ +void dac_deinit(void); +/* enable DAC */ +void dac_enable(uint32_t dac_periph); +/* disable DAC */ +void dac_disable(uint32_t dac_periph); +/* enable DAC DMA */ +void dac_dma_enable(uint32_t dac_periph); +/* disable DAC DMA */ +void dac_dma_disable(uint32_t dac_periph); +/* enable DAC output buffer */ +void dac_output_buffer_enable(uint32_t dac_periph); +/* disable DAC output buffer */ +void dac_output_buffer_disable(uint32_t dac_periph); +/* get the last data output value */ +uint16_t dac_output_value_get(uint32_t dac_periph); +/* set DAC data holding register value */ +void dac_data_set(uint32_t dac_periph, uint32_t dac_align, uint16_t data); + +/* DAC trigger configuration */ +/* enable DAC trigger */ +void dac_trigger_enable(uint32_t dac_periph); +/* disable DAC trigger */ +void dac_trigger_disable(uint32_t dac_periph); +/* configure DAC trigger source */ +void dac_trigger_source_config(uint32_t dac_periph, uint32_t triggersource); +/* enable DAC software trigger */ +void dac_software_trigger_enable(uint32_t dac_periph); +/* disable DAC software trigger */ +void dac_software_trigger_disable(uint32_t dac_periph); + +/* DAC wave mode configuration */ +/* configure DAC wave mode */ +void dac_wave_mode_config(uint32_t dac_periph, uint32_t wave_mode); +/* configure DAC wave bit width */ +void dac_wave_bit_width_config(uint32_t dac_periph, uint32_t bit_width); +/* configure DAC LFSR noise mode */ +void dac_lfsr_noise_config(uint32_t dac_periph, uint32_t unmask_bits); +/* configure DAC triangle noise mode */ +void dac_triangle_noise_config(uint32_t dac_periph, uint32_t amplitude); + +/* DAC concurrent mode configuration */ +/* enable DAC concurrent mode */ +void dac_concurrent_enable(void); +/* disable DAC concurrent mode */ +void dac_concurrent_disable(void); +/* enable DAC concurrent software trigger */ +void dac_concurrent_software_trigger_enable(void); +/* disable DAC concurrent software trigger */ +void dac_concurrent_software_trigger_disable(void); +/* enable DAC concurrent buffer function */ +void dac_concurrent_output_buffer_enable(void); +/* disable DAC concurrent buffer function */ +void dac_concurrent_output_buffer_disable(void); +/* set DAC concurrent mode data holding register value */ +void dac_concurrent_data_set(uint32_t dac_align, uint16_t data0, uint16_t data1); + +#endif /* GD32VF103_DAC_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h new file mode 100644 index 0000000..262abc7 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dbg.h @@ -0,0 +1,109 @@ +/*! + \file gd32vf103_dbg.h + \brief definitions for the DBG + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_DBG_H +#define GD32VF103_DBG_H + +#include "gd32vf103.h" + +/* DBG definitions */ +#define DBG DBG_BASE + +/* registers definitions */ +#define DBG_ID REG32(DBG + 0x00U) /*!< DBG_ID code register */ +#define DBG_CTL REG32(DBG + 0x04U) /*!< DBG control register */ + +/* bits definitions */ +/* DBG_ID */ +#define DBG_ID_ID_CODE BITS(0,31) /*!< DBG ID code values */ + +/* DBG_CTL */ +#define DBG_CTL_SLP_HOLD BIT(0) /*!< keep debugger connection during sleep mode */ +#define DBG_CTL_DSLP_HOLD BIT(1) /*!< keep debugger connection during deepsleep mode */ +#define DBG_CTL_STB_HOLD BIT(2) /*!< keep debugger connection during standby mode */ +#define DBG_CTL_FWDGT_HOLD BIT(8) /*!< debug FWDGT kept when core is halted */ +#define DBG_CTL_WWDGT_HOLD BIT(9) /*!< debug WWDGT kept when core is halted */ +#define DBG_CTL_TIMER0_HOLD BIT(10) /*!< hold TIMER0 counter when core is halted */ +#define DBG_CTL_TIMER1_HOLD BIT(11) /*!< hold TIMER1 counter when core is halted */ +#define DBG_CTL_TIMER2_HOLD BIT(12) /*!< hold TIMER2 counter when core is halted */ +#define DBG_CTL_TIMER3_HOLD BIT(13) /*!< hold TIMER3 counter when core is halted */ +#define DBG_CTL_CAN0_HOLD BIT(14) /*!< debug CAN0 kept when core is halted */ +#define DBG_CTL_I2C0_HOLD BIT(15) /*!< hold I2C0 smbus when core is halted */ +#define DBG_CTL_I2C1_HOLD BIT(16) /*!< hold I2C1 smbus when core is halted */ +#define DBG_CTL_TIMER4_HOLD BIT(18) /*!< hold TIMER4 counter when core is halted */ +#define DBG_CTL_TIMER5_HOLD BIT(19) /*!< hold TIMER5 counter when core is halted */ +#define DBG_CTL_TIMER6_HOLD BIT(20) /*!< hold TIMER6 counter when core is halted */ +#define DBG_CTL_CAN1_HOLD BIT(21) /*!< debug CAN1 kept when core is halted */ + +/* constants definitions */ +/* debug hold when core is halted */ +typedef enum +{ + DBG_FWDGT_HOLD = BIT(8), /*!< debug FWDGT kept when core is halted */ + DBG_WWDGT_HOLD = BIT(9), /*!< debug WWDGT kept when core is halted */ + DBG_TIMER0_HOLD = BIT(10), /*!< hold TIMER0 counter when core is halted */ + DBG_TIMER1_HOLD = BIT(11), /*!< hold TIMER1 counter when core is halted */ + DBG_TIMER2_HOLD = BIT(12), /*!< hold TIMER2 counter when core is halted */ + DBG_TIMER3_HOLD = BIT(13), /*!< hold TIMER3 counter when core is halted */ + DBG_CAN0_HOLD = BIT(14), /*!< debug CAN0 kept when core is halted */ + DBG_I2C0_HOLD = BIT(15), /*!< hold I2C0 smbus when core is halted */ + DBG_I2C1_HOLD = BIT(16), /*!< hold I2C1 smbus when core is halted */ + DBG_TIMER4_HOLD = BIT(17), /*!< hold TIMER4 counter when core is halted */ + DBG_TIMER5_HOLD = BIT(18), /*!< hold TIMER5 counter when core is halted */ + DBG_TIMER6_HOLD = BIT(19), /*!< hold TIMER6 counter when core is halted */ + DBG_CAN1_HOLD = BIT(21), /*!< debug CAN1 kept when core is halted */ +}dbg_periph_enum; + +/* DBG low power mode configurations */ +#define DBG_LOW_POWER_SLEEP DBG_CTL_SLP_HOLD /*!< keep debugger connection during sleep mode */ +#define DBG_LOW_POWER_DEEPSLEEP DBG_CTL_DSLP_HOLD /*!< keep debugger connection during deepsleep mode */ +#define DBG_LOW_POWER_STANDBY DBG_CTL_STB_HOLD /*!< keep debugger connection during standby mode */ + +/* function declarations */ +/* read DBG_ID code register */ +uint32_t dbg_id_get(void); + +/* low power behavior configuration */ +/* enable low power behavior when the MCU is in debug mode */ +void dbg_low_power_enable(uint32_t dbg_low_power); +/* disable low power behavior when the MCU is in debug mode */ +void dbg_low_power_disable(uint32_t dbg_low_power); + +/* peripheral behavior configuration */ +/* enable peripheral behavior when the MCU is in debug mode */ +void dbg_periph_enable(dbg_periph_enum dbg_periph); +/* disable peripheral behavior when the MCU is in debug mode */ +void dbg_periph_disable(dbg_periph_enum dbg_periph); + +#endif /* GD32VF103_DBG_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h new file mode 100644 index 0000000..9b027d4 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_dma.h @@ -0,0 +1,282 @@ +/*! + \file gd32vf103_dma.h + \brief definitions for the DMA + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_DMA_H +#define GD32VF103_DMA_H + +#include "gd32vf103.h" + +/* DMA definitions */ +#define DMA0 (DMA_BASE) /*!< DMA0 base address */ +#define DMA1 (DMA_BASE + 0x0400U) /*!< DMA1 base address */ + +/* registers definitions */ +#define DMA_INTF(dmax) REG32((dmax) + 0x00U) /*!< DMA interrupt flag register */ +#define DMA_INTC(dmax) REG32((dmax) + 0x04U) /*!< DMA interrupt flag clear register */ + +#define DMA_CH0CTL(dmax) REG32((dmax) + 0x08U) /*!< DMA channel 0 control register */ +#define DMA_CH0CNT(dmax) REG32((dmax) + 0x0CU) /*!< DMA channel 0 counter register */ +#define DMA_CH0PADDR(dmax) REG32((dmax) + 0x10U) /*!< DMA channel 0 peripheral base address register */ +#define DMA_CH0MADDR(dmax) REG32((dmax) + 0x14U) /*!< DMA channel 0 memory base address register */ + +#define DMA_CH1CTL(dmax) REG32((dmax) + 0x1CU) /*!< DMA channel 1 control register */ +#define DMA_CH1CNT(dmax) REG32((dmax) + 0x20U) /*!< DMA channel 1 counter register */ +#define DMA_CH1PADDR(dmax) REG32((dmax) + 0x24U) /*!< DMA channel 1 peripheral base address register */ +#define DMA_CH1MADDR(dmax) REG32((dmax) + 0x28U) /*!< DMA channel 1 memory base address register */ + +#define DMA_CH2CTL(dmax) REG32((dmax) + 0x30U) /*!< DMA channel 2 control register */ +#define DMA_CH2CNT(dmax) REG32((dmax) + 0x34U) /*!< DMA channel 2 counter register */ +#define DMA_CH2PADDR(dmax) REG32((dmax) + 0x38U) /*!< DMA channel 2 peripheral base address register */ +#define DMA_CH2MADDR(dmax) REG32((dmax) + 0x3CU) /*!< DMA channel 2 memory base address register */ + +#define DMA_CH3CTL(dmax) REG32((dmax) + 0x44U) /*!< DMA channel 3 control register */ +#define DMA_CH3CNT(dmax) REG32((dmax) + 0x48U) /*!< DMA channel 3 counter register */ +#define DMA_CH3PADDR(dmax) REG32((dmax) + 0x4CU) /*!< DMA channel 3 peripheral base address register */ +#define DMA_CH3MADDR(dmax) REG32((dmax) + 0x50U) /*!< DMA channel 3 memory base address register */ + +#define DMA_CH4CTL(dmax) REG32((dmax) + 0x58U) /*!< DMA channel 4 control register */ +#define DMA_CH4CNT(dmax) REG32((dmax) + 0x5CU) /*!< DMA channel 4 counter register */ +#define DMA_CH4PADDR(dmax) REG32((dmax) + 0x60U) /*!< DMA channel 4 peripheral base address register */ +#define DMA_CH4MADDR(dmax) REG32((dmax) + 0x64U) /*!< DMA channel 4 memory base address register */ + +#define DMA_CH5CTL(dmax) REG32((dmax) + 0x6CU) /*!< DMA channel 5 control register */ +#define DMA_CH5CNT(dmax) REG32((dmax) + 0x70U) /*!< DMA channel 5 counter register */ +#define DMA_CH5PADDR(dmax) REG32((dmax) + 0x74U) /*!< DMA channel 5 peripheral base address register */ +#define DMA_CH5MADDR(dmax) REG32((dmax) + 0x78U) /*!< DMA channel 5 memory base address register */ + +#define DMA_CH6CTL(dmax) REG32((dmax) + 0x80U) /*!< DMA channel 6 control register */ +#define DMA_CH6CNT(dmax) REG32((dmax) + 0x84U) /*!< DMA channel 6 counter register */ +#define DMA_CH6PADDR(dmax) REG32((dmax) + 0x88U) /*!< DMA channel 6 peripheral base address register */ +#define DMA_CH6MADDR(dmax) REG32((dmax) + 0x8CU) /*!< DMA channel 6 memory base address register */ + +/* bits definitions */ +/* DMA_INTF */ +#define DMA_INTF_GIF BIT(0) /*!< global interrupt flag of channel */ +#define DMA_INTF_FTFIF BIT(1) /*!< full transfer finish flag of channel */ +#define DMA_INTF_HTFIF BIT(2) /*!< half transfer finish flag of channel */ +#define DMA_INTF_ERRIF BIT(3) /*!< error flag of channel */ + +/* DMA_INTC */ +#define DMA_INTC_GIFC BIT(0) /*!< clear global interrupt flag of channel */ +#define DMA_INTC_FTFIFC BIT(1) /*!< clear transfer finish flag of channel */ +#define DMA_INTC_HTFIFC BIT(2) /*!< clear half transfer finish flag of channel */ +#define DMA_INTC_ERRIFC BIT(3) /*!< clear error flag of channel */ + +/* DMA_CHxCTL, x=0..6 */ +#define DMA_CHXCTL_CHEN BIT(0) /*!< channel enable */ +#define DMA_CHXCTL_FTFIE BIT(1) /*!< enable bit for channel full transfer finish interrupt */ +#define DMA_CHXCTL_HTFIE BIT(2) /*!< enable bit for channel half transfer finish interrupt */ +#define DMA_CHXCTL_ERRIE BIT(3) /*!< enable bit for channel error interrupt */ +#define DMA_CHXCTL_DIR BIT(4) /*!< transfer direction */ +#define DMA_CHXCTL_CMEN BIT(5) /*!< circular mode enable */ +#define DMA_CHXCTL_PNAGA BIT(6) /*!< next address generation algorithm of peripheral */ +#define DMA_CHXCTL_MNAGA BIT(7) /*!< next address generation algorithm of memory */ +#define DMA_CHXCTL_PWIDTH BITS(8,9) /*!< transfer data width of peripheral */ +#define DMA_CHXCTL_MWIDTH BITS(10,11) /*!< transfer data width of memory */ +#define DMA_CHXCTL_PRIO BITS(12,13) /*!< priority level */ +#define DMA_CHXCTL_M2M BIT(14) /*!< memory to memory mode */ + +/* DMA_CHxCNT, x=0..6 */ +#define DMA_CHXCNT_CNT BITS(0,15) /*!< transfer counter */ + +/* DMA_CHxPADDR, x=0..6 */ +#define DMA_CHXPADDR_PADDR BITS(0,31) /*!< peripheral base address */ + +/* DMA_CHxMADDR, x=0..6 */ +#define DMA_CHXMADDR_MADDR BITS(0,31) /*!< memory base address */ + +/* constants definitions */ +/* DMA channel select */ +typedef enum +{ + DMA_CH0 = 0, /*!< DMA Channel0 */ + DMA_CH1, /*!< DMA Channel1 */ + DMA_CH2, /*!< DMA Channel2 */ + DMA_CH3, /*!< DMA Channel3 */ + DMA_CH4, /*!< DMA Channel4 */ + DMA_CH5, /*!< DMA Channel5 */ + DMA_CH6 /*!< DMA Channel6 */ +} dma_channel_enum; + +/* DMA initialize struct */ +typedef struct +{ + uint32_t periph_addr; /*!< peripheral base address */ + uint32_t periph_width; /*!< transfer data size of peripheral */ + uint32_t memory_addr; /*!< memory base address */ + uint32_t memory_width; /*!< transfer data size of memory */ + uint32_t number; /*!< channel transfer number */ + uint32_t priority; /*!< channel priority level */ + uint8_t periph_inc; /*!< peripheral increasing mode */ + uint8_t memory_inc; /*!< memory increasing mode */ + uint8_t direction; /*!< channel data transfer direction */ + +} dma_parameter_struct; + +#define DMA_FLAG_ADD(flag, shift) ((flag) << ((shift) * 4U)) /*!< DMA channel flag shift */ + +/* DMA_register address */ +#define DMA_CHCTL(dma, channel) REG32(((dma) + 0x08U) + 0x14U * (uint32_t)(channel)) /*!< the address of DMA channel CHXCTL register */ +#define DMA_CHCNT(dma, channel) REG32(((dma) + 0x0CU) + 0x14U * (uint32_t)(channel)) /*!< the address of DMA channel CHXCNT register */ +#define DMA_CHPADDR(dma, channel) REG32(((dma) + 0x10U) + 0x14U * (uint32_t)(channel)) /*!< the address of DMA channel CHXPADDR register */ +#define DMA_CHMADDR(dma, channel) REG32(((dma) + 0x14U) + 0x14U * (uint32_t)(channel)) /*!< the address of DMA channel CHXMADDR register */ + +/* DMA reset value */ +#define DMA_CHCTL_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXCTL register */ +#define DMA_CHCNT_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXCNT register */ +#define DMA_CHPADDR_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXPADDR register */ +#define DMA_CHMADDR_RESET_VALUE ((uint32_t)0x00000000U) /*!< the reset value of DMA channel CHXMADDR register */ +#define DMA_CHINTF_RESET_VALUE (DMA_INTF_GIF | DMA_INTF_FTFIF | \ + DMA_INTF_HTFIF | DMA_INTF_ERRIF) /*!< clear DMA channel DMA_INTF register */ + +/* DMA_INTF register */ +/* interrupt flag bits */ +#define DMA_INT_FLAG_G DMA_INTF_GIF /*!< global interrupt flag of channel */ +#define DMA_INT_FLAG_FTF DMA_INTF_FTFIF /*!< full transfer finish interrupt flag of channel */ +#define DMA_INT_FLAG_HTF DMA_INTF_HTFIF /*!< half transfer finish interrupt flag of channel */ +#define DMA_INT_FLAG_ERR DMA_INTF_ERRIF /*!< error interrupt flag of channel */ + +/* flag bits */ +#define DMA_FLAG_G DMA_INTF_GIF /*!< global interrupt flag of channel */ +#define DMA_FLAG_FTF DMA_INTF_FTFIF /*!< full transfer finish flag of channel */ +#define DMA_FLAG_HTF DMA_INTF_HTFIF /*!< half transfer finish flag of channel */ +#define DMA_FLAG_ERR DMA_INTF_ERRIF /*!< error flag of channel */ + +/* DMA_CHxCTL register */ +/* interrupt enable bits */ +#define DMA_INT_FTF DMA_CHXCTL_FTFIE /*!< enable bit for channel full transfer finish interrupt */ +#define DMA_INT_HTF DMA_CHXCTL_HTFIE /*!< enable bit for channel half transfer finish interrupt */ +#define DMA_INT_ERR DMA_CHXCTL_ERRIE /*!< enable bit for channel error interrupt */ + +/* transfer direction */ +#define DMA_PERIPHERAL_TO_MEMORY ((uint8_t)0x0000U) /*!< read from peripheral and write to memory */ +#define DMA_MEMORY_TO_PERIPHERAL ((uint8_t)0x0001U) /*!< read from memory and write to peripheral */ + +/* peripheral increasing mode */ +#define DMA_PERIPH_INCREASE_DISABLE ((uint8_t)0x0000U) /*!< next address of peripheral is fixed address mode */ +#define DMA_PERIPH_INCREASE_ENABLE ((uint8_t)0x0001U) /*!< next address of peripheral is increasing address mode */ + +/* memory increasing mode */ +#define DMA_MEMORY_INCREASE_DISABLE ((uint8_t)0x0000U) /*!< next address of memory is fixed address mode */ +#define DMA_MEMORY_INCREASE_ENABLE ((uint8_t)0x0001U) /*!< next address of memory is increasing address mode */ + +/* transfer data size of peripheral */ +#define CHCTL_PWIDTH(regval) (BITS(8,9) & ((uint32_t)(regval) << 8)) /*!< transfer data size of peripheral */ +#define DMA_PERIPHERAL_WIDTH_8BIT CHCTL_PWIDTH(0U) /*!< transfer data size of peripheral is 8-bit */ +#define DMA_PERIPHERAL_WIDTH_16BIT CHCTL_PWIDTH(1U) /*!< transfer data size of peripheral is 16-bit */ +#define DMA_PERIPHERAL_WIDTH_32BIT CHCTL_PWIDTH(2U) /*!< transfer data size of peripheral is 32-bit */ + +/* transfer data size of memory */ +#define CHCTL_MWIDTH(regval) (BITS(10,11) & ((uint32_t)(regval) << 10)) /*!< transfer data size of memory */ +#define DMA_MEMORY_WIDTH_8BIT CHCTL_MWIDTH(0U) /*!< transfer data size of memory is 8-bit */ +#define DMA_MEMORY_WIDTH_16BIT CHCTL_MWIDTH(1U) /*!< transfer data size of memory is 16-bit */ +#define DMA_MEMORY_WIDTH_32BIT CHCTL_MWIDTH(2U) /*!< transfer data size of memory is 32-bit */ + +/* channel priority level */ +#define CHCTL_PRIO(regval) (BITS(12,13) & ((uint32_t)(regval) << 12)) /*!< DMA channel priority level */ +#define DMA_PRIORITY_LOW CHCTL_PRIO(0U) /*!< low priority */ +#define DMA_PRIORITY_MEDIUM CHCTL_PRIO(1U) /*!< medium priority */ +#define DMA_PRIORITY_HIGH CHCTL_PRIO(2U) /*!< high priority */ +#define DMA_PRIORITY_ULTRA_HIGH CHCTL_PRIO(3U) /*!< ultra high priority */ + +/* memory to memory mode */ +#define DMA_MEMORY_TO_MEMORY_DISABLE ((uint32_t)0x00000000U) /*!< disable memory to memory mode */ +#define DMA_MEMORY_TO_MEMORY_ENABLE ((uint32_t)0x00000001U) /*!< enable memory to memory mode */ + +/* DMA_CHxCNT register */ +/* transfer counter */ +#define DMA_CHANNEL_CNT_MASK DMA_CHXCNT_CNT /*!< transfer counter mask */ + +/* function declarations */ +/* DMA deinitialization and initialization functions */ +/* deinitialize DMA a channel registers */ +void dma_deinit(uint32_t dma_periph, dma_channel_enum channelx); +/* initialize the parameters of DMA struct with the default values */ +void dma_struct_para_init(dma_parameter_struct* init_struct); +/* initialize DMA channel */ +void dma_init(uint32_t dma_periph, dma_channel_enum channelx, dma_parameter_struct *init_struct); +/* enable DMA circulation mode */ +void dma_circulation_enable(uint32_t dma_periph, dma_channel_enum channelx); +/* disable DMA circulation mode */ +void dma_circulation_disable(uint32_t dma_periph, dma_channel_enum channelx); +/* enable memory to memory mode */ +void dma_memory_to_memory_enable(uint32_t dma_periph, dma_channel_enum channelx); +/* disable memory to memory mode */ +void dma_memory_to_memory_disable(uint32_t dma_periph, dma_channel_enum channelx); +/* enable DMA channel */ +void dma_channel_enable(uint32_t dma_periph, dma_channel_enum channelx); +/* disable DMA channel */ +void dma_channel_disable(uint32_t dma_periph, dma_channel_enum channelx); + +/* DMA configuration functions */ +/* set DMA peripheral base address */ +void dma_periph_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address); +/* set DMA memory base address */ +void dma_memory_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address); +/* set the number of remaining data to be transferred by the DMA */ +void dma_transfer_number_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t number); +/* get the number of remaining data to be transferred by the DMA */ +uint32_t dma_transfer_number_get(uint32_t dma_periph, dma_channel_enum channelx); +/* configure priority level of DMA channel */ +void dma_priority_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t priority); +/* configure transfer data size of memory */ +void dma_memory_width_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t mwidth); +/* configure transfer data size of peripheral */ +void dma_periph_width_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t pwidth); +/* enable next address increasement algorithm of memory */ +void dma_memory_increase_enable(uint32_t dma_periph, dma_channel_enum channelx); +/* disable next address increasement algorithm of memory */ +void dma_memory_increase_disable(uint32_t dma_periph, dma_channel_enum channelx); +/* enable next address increasement algorithm of peripheral */ +void dma_periph_increase_enable(uint32_t dma_periph, dma_channel_enum channelx); +/* disable next address increasement algorithm of peripheral */ +void dma_periph_increase_disable(uint32_t dma_periph, dma_channel_enum channelx); +/* configure the direction of data transfer on the channel */ +void dma_transfer_direction_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t direction); + +/* flag and interrupt functions */ +/* check DMA flag is set or not */ +FlagStatus dma_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag); +/* clear the flag of a DMA channel */ +void dma_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag); +/* check DMA flag and interrupt enable bit is set or not */ +FlagStatus dma_interrupt_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag); +/* clear the interrupt flag of a DMA channel */ +void dma_interrupt_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag); +/* enable DMA interrupt */ +void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source); +/* disable DMA interrupt */ +void dma_interrupt_disable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source); + +#endif /* GD32VF103_DMA_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h new file mode 100644 index 0000000..b36f9a6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_eclic.h @@ -0,0 +1,66 @@ +/*! + \file gd32vf103_eclic.h + \brief definitions for the ECLIC(Enhancement Core-Local Interrupt Controller) + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_ECLIC_H +#define GD32VF103_ECLIC_H + +#include "gd32vf103.h" + +/* constants definitions */ +#define ECLIC_PRIGROUP_LEVEL0_PRIO4 0 /*!< 0 bits for level 4 bits for priority */ +#define ECLIC_PRIGROUP_LEVEL1_PRIO3 1 /*!< 1 bits for level 3 bits for priority */ +#define ECLIC_PRIGROUP_LEVEL2_PRIO2 2 /*!< 2 bits for level 2 bits for priority */ +#define ECLIC_PRIGROUP_LEVEL3_PRIO1 3 /*!< 3 bits for level 1 bits for priority */ +#define ECLIC_PRIGROUP_LEVEL4_PRIO0 4 /*!< 4 bits for level 0 bits for priority */ + +#define __SEV eclic_send_event + +/* function declarations */ +/* enable the global interrupt */ +void eclic_global_interrupt_enable(void); +/* disable the global interrupt */ +void eclic_global_interrupt_disable(void); +/* set the priority group */ +void eclic_priority_group_set(uint32_t prigroup); +/* enable the interrupt request */ +void eclic_irq_enable(uint32_t source, uint8_t level, uint8_t priority); +/* disable the interrupt request */ +void eclic_irq_disable(uint32_t source); + +/* reset system */ +void eclic_system_reset(void); +/* send event(SEV) */ +void eclic_send_event(void); + +#endif /* GD32VF103_ECLIC_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h new file mode 100644 index 0000000..8022104 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exmc.h @@ -0,0 +1,126 @@ +/*! + \file gd32vf103_exmc.h + \brief definitions for the EXMC + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_EXMC_H +#define GD32VF103_EXMC_H + +#include "gd32vf103.h" + +/* EXMC definitions */ +#define EXMC (EXMC_BASE) /*!< EXMC register base address */ + +/* registers definitions */ +/* NOR/PSRAM */ +#define EXMC_SNCTL0 REG32(EXMC + 0x00U) /*!< EXMC SRAM/NOR flash control register 0 */ +#define EXMC_SNTCFG0 REG32(EXMC + 0x04U) /*!< EXMC SRAM/NOR flash timing configuration register 0 */ +#define EXMC_SNWTCFG0 REG32(EXMC + 0x104U) /*!< EXMC SRAM/NOR flash write timing configuration register 0 */ + +/* bits definitions */ +/* NOR/PSRAM */ +/* EXMC_SNCTLx, x=0 */ +#define EXMC_SNCTL_NRBKEN BIT(0) /*!< NOR bank enable */ +#define EXMC_SNCTL_NRMUX BIT(1) /*!< NOR bank memory address/data multiplexing */ +#define EXMC_SNCTL_NRTP BITS(2,3) /*!< NOR bank memory type */ +#define EXMC_SNCTL_NRW BITS(4,5) /*!< NOR bank memory data bus width */ +#define EXMC_SNCTL_NREN BIT(6) /*!< NOR flash access enable */ +#define EXMC_SNCTL_NRWTPOL BIT(9) /*!< NWAIT signal polarity */ +#define EXMC_SNCTL_WREN BIT(12) /*!< write enable */ +#define EXMC_SNCTL_NRWTEN BIT(13) /*!< NWAIT signal enable */ +#define EXMC_SNCTL_ASYNCWAIT BIT(15) /*!< asynchronous wait */ + +/* EXMC_SNTCFGx, x=0 */ +#define EXMC_SNTCFG_ASET BITS(0,3) /*!< address setup time */ +#define EXMC_SNTCFG_AHLD BITS(4,7) /*!< address hold time */ +#define EXMC_SNTCFG_DSET BITS(8,15) /*!< data setup time */ +#define EXMC_SNTCFG_BUSLAT BITS(16,19) /*!< bus latency */ + +/* constants definitions */ +/* EXMC NOR/SRAM timing initialize struct */ +typedef struct +{ + uint32_t bus_latency; /*!< configure the bus latency */ + uint32_t asyn_data_setuptime; /*!< configure the data setup time,asynchronous access mode valid */ + uint32_t asyn_address_holdtime; /*!< configure the address hold time,asynchronous access mode valid */ + uint32_t asyn_address_setuptime; /*!< configure the data setup time,asynchronous access mode valid */ +}exmc_norsram_timing_parameter_struct; + +/* EXMC NOR/SRAM initialize struct */ +typedef struct +{ + uint32_t norsram_region; /*!< select the region of EXMC NOR/SRAM bank */ + uint32_t asyn_wait; /*!< enable or disable the asynchronous wait function */ + uint32_t nwait_signal; /*!< enable or disable the NWAIT signal */ + uint32_t memory_write; /*!< enable or disable the write operation */ + uint32_t nwait_polarity; /*!< specifies the polarity of NWAIT signal from memory */ + uint32_t databus_width; /*!< specifies the databus width of external memory */ + uint32_t memory_type; /*!< specifies the type of external memory */ + uint32_t address_data_mux; /*!< specifies whether the data bus and address bus are multiplexed */ + exmc_norsram_timing_parameter_struct* read_write_timing; /*!< timing parameters for read and write */ +}exmc_norsram_parameter_struct; + +/* EXMC register address */ +#define EXMC_SNCTL(region) REG32(EXMC + 0x08U * (region)) /*!< EXMC SRAM/NOR flash control register */ +#define EXMC_SNTCFG(region) REG32(EXMC + 0x04U + 0x08U * (region)) /*!< EXMC SRAM/NOR flash timing configuration register */ + +/* NOR bank memory data bus width */ +#define SNCTL_NRW(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) +#define EXMC_NOR_DATABUS_WIDTH_8B SNCTL_NRW(0) /*!< NOR data width 8 bits */ +#define EXMC_NOR_DATABUS_WIDTH_16B SNCTL_NRW(1) /*!< NOR data width 16 bits */ + +/* NOR bank memory type */ +#define SNCTL_NRTP(regval) (BITS(2,3) & ((uint32_t)(regval) << 2)) +#define EXMC_MEMORY_TYPE_SRAM SNCTL_NRTP(0) /*!< SRAM,ROM */ +#define EXMC_MEMORY_TYPE_PSRAM SNCTL_NRTP(1) /*!< PSRAM,CRAM */ +#define EXMC_MEMORY_TYPE_NOR SNCTL_NRTP(2) /*!< NOR flash */ + +/* EXMC NOR/SRAM bank region definition */ +#define EXMC_BANK0_NORSRAM_REGION0 ((uint32_t)0x00000000U) /*!< bank0 NOR/SRAM region0 */ + +/* EXMC NWAIT signal polarity configuration */ +#define EXMC_NWAIT_POLARITY_LOW ((uint32_t)0x00000000U) /*!< low level is active of NWAIT */ +#define EXMC_NWAIT_POLARITY_HIGH ((uint32_t)0x00000200U) /*!< high level is active of NWAIT */ + +/* function declarations */ +/* deinitialize EXMC NOR/SRAM region */ +void exmc_norsram_deinit(uint32_t norsram_region); +/* exmc_norsram_parameter_struct parameter initialize */ +void exmc_norsram_struct_para_init(exmc_norsram_parameter_struct* exmc_norsram_init_struct); +/* initialize EXMC NOR/SRAM region */ +void exmc_norsram_init(exmc_norsram_parameter_struct* exmc_norsram_init_struct); +/* EXMC NOR/SRAM bank enable */ +void exmc_norsram_enable(uint32_t norsram_region); +/* EXMC NOR/SRAM bank disable */ +void exmc_norsram_disable(uint32_t norsram_region); + +#endif /* GD32VF103_EXMC_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h new file mode 100644 index 0000000..8e8ca85 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_exti.h @@ -0,0 +1,245 @@ +/*! + \file gd32vf103_exti.h + \brief definitions for the EXTI + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_EXTI_H +#define GD32VF103_EXTI_H + +#include "gd32vf103.h" + +/* EXTI definitions */ +#define EXTI EXTI_BASE + +/* registers definitions */ +#define EXTI_INTEN REG32(EXTI + 0x00U) /*!< interrupt enable register */ +#define EXTI_EVEN REG32(EXTI + 0x04U) /*!< event enable register */ +#define EXTI_RTEN REG32(EXTI + 0x08U) /*!< rising edge trigger enable register */ +#define EXTI_FTEN REG32(EXTI + 0x0CU) /*!< falling trigger enable register */ +#define EXTI_SWIEV REG32(EXTI + 0x10U) /*!< software interrupt event register */ +#define EXTI_PD REG32(EXTI + 0x14U) /*!< pending register */ + +/* bits definitions */ +/* EXTI_INTEN */ +#define EXTI_INTEN_INTEN0 BIT(0) /*!< interrupt from line 0 */ +#define EXTI_INTEN_INTEN1 BIT(1) /*!< interrupt from line 1 */ +#define EXTI_INTEN_INTEN2 BIT(2) /*!< interrupt from line 2 */ +#define EXTI_INTEN_INTEN3 BIT(3) /*!< interrupt from line 3 */ +#define EXTI_INTEN_INTEN4 BIT(4) /*!< interrupt from line 4 */ +#define EXTI_INTEN_INTEN5 BIT(5) /*!< interrupt from line 5 */ +#define EXTI_INTEN_INTEN6 BIT(6) /*!< interrupt from line 6 */ +#define EXTI_INTEN_INTEN7 BIT(7) /*!< interrupt from line 7 */ +#define EXTI_INTEN_INTEN8 BIT(8) /*!< interrupt from line 8 */ +#define EXTI_INTEN_INTEN9 BIT(9) /*!< interrupt from line 9 */ +#define EXTI_INTEN_INTEN10 BIT(10) /*!< interrupt from line 10 */ +#define EXTI_INTEN_INTEN11 BIT(11) /*!< interrupt from line 11 */ +#define EXTI_INTEN_INTEN12 BIT(12) /*!< interrupt from line 12 */ +#define EXTI_INTEN_INTEN13 BIT(13) /*!< interrupt from line 13 */ +#define EXTI_INTEN_INTEN14 BIT(14) /*!< interrupt from line 14 */ +#define EXTI_INTEN_INTEN15 BIT(15) /*!< interrupt from line 15 */ +#define EXTI_INTEN_INTEN16 BIT(16) /*!< interrupt from line 16 */ +#define EXTI_INTEN_INTEN17 BIT(17) /*!< interrupt from line 17 */ +#define EXTI_INTEN_INTEN18 BIT(18) /*!< interrupt from line 18 */ + +/* EXTI_EVEN */ +#define EXTI_EVEN_EVEN0 BIT(0) /*!< event from line 0 */ +#define EXTI_EVEN_EVEN1 BIT(1) /*!< event from line 1 */ +#define EXTI_EVEN_EVEN2 BIT(2) /*!< event from line 2 */ +#define EXTI_EVEN_EVEN3 BIT(3) /*!< event from line 3 */ +#define EXTI_EVEN_EVEN4 BIT(4) /*!< event from line 4 */ +#define EXTI_EVEN_EVEN5 BIT(5) /*!< event from line 5 */ +#define EXTI_EVEN_EVEN6 BIT(6) /*!< event from line 6 */ +#define EXTI_EVEN_EVEN7 BIT(7) /*!< event from line 7 */ +#define EXTI_EVEN_EVEN8 BIT(8) /*!< event from line 8 */ +#define EXTI_EVEN_EVEN9 BIT(9) /*!< event from line 9 */ +#define EXTI_EVEN_EVEN10 BIT(10) /*!< event from line 10 */ +#define EXTI_EVEN_EVEN11 BIT(11) /*!< event from line 11 */ +#define EXTI_EVEN_EVEN12 BIT(12) /*!< event from line 12 */ +#define EXTI_EVEN_EVEN13 BIT(13) /*!< event from line 13 */ +#define EXTI_EVEN_EVEN14 BIT(14) /*!< event from line 14 */ +#define EXTI_EVEN_EVEN15 BIT(15) /*!< event from line 15 */ +#define EXTI_EVEN_EVEN16 BIT(16) /*!< event from line 16 */ +#define EXTI_EVEN_EVEN17 BIT(17) /*!< event from line 17 */ +#define EXTI_EVEN_EVEN18 BIT(18) /*!< event from line 18 */ + +/* EXTI_RTEN */ +#define EXTI_RTEN_RTEN0 BIT(0) /*!< rising edge from line 0 */ +#define EXTI_RTEN_RTEN1 BIT(1) /*!< rising edge from line 1 */ +#define EXTI_RTEN_RTEN2 BIT(2) /*!< rising edge from line 2 */ +#define EXTI_RTEN_RTEN3 BIT(3) /*!< rising edge from line 3 */ +#define EXTI_RTEN_RTEN4 BIT(4) /*!< rising edge from line 4 */ +#define EXTI_RTEN_RTEN5 BIT(5) /*!< rising edge from line 5 */ +#define EXTI_RTEN_RTEN6 BIT(6) /*!< rising edge from line 6 */ +#define EXTI_RTEN_RTEN7 BIT(7) /*!< rising edge from line 7 */ +#define EXTI_RTEN_RTEN8 BIT(8) /*!< rising edge from line 8 */ +#define EXTI_RTEN_RTEN9 BIT(9) /*!< rising edge from line 9 */ +#define EXTI_RTEN_RTEN10 BIT(10) /*!< rising edge from line 10 */ +#define EXTI_RTEN_RTEN11 BIT(11) /*!< rising edge from line 11 */ +#define EXTI_RTEN_RTEN12 BIT(12) /*!< rising edge from line 12 */ +#define EXTI_RTEN_RTEN13 BIT(13) /*!< rising edge from line 13 */ +#define EXTI_RTEN_RTEN14 BIT(14) /*!< rising edge from line 14 */ +#define EXTI_RTEN_RTEN15 BIT(15) /*!< rising edge from line 15 */ +#define EXTI_RTEN_RTEN16 BIT(16) /*!< rising edge from line 16 */ +#define EXTI_RTEN_RTEN17 BIT(17) /*!< rising edge from line 17 */ +#define EXTI_RTEN_RTEN18 BIT(18) /*!< rising edge from line 18 */ + +/* EXTI_FTEN */ +#define EXTI_FTEN_FTEN0 BIT(0) /*!< falling edge from line 0 */ +#define EXTI_FTEN_FTEN1 BIT(1) /*!< falling edge from line 1 */ +#define EXTI_FTEN_FTEN2 BIT(2) /*!< falling edge from line 2 */ +#define EXTI_FTEN_FTEN3 BIT(3) /*!< falling edge from line 3 */ +#define EXTI_FTEN_FTEN4 BIT(4) /*!< falling edge from line 4 */ +#define EXTI_FTEN_FTEN5 BIT(5) /*!< falling edge from line 5 */ +#define EXTI_FTEN_FTEN6 BIT(6) /*!< falling edge from line 6 */ +#define EXTI_FTEN_FTEN7 BIT(7) /*!< falling edge from line 7 */ +#define EXTI_FTEN_FTEN8 BIT(8) /*!< falling edge from line 8 */ +#define EXTI_FTEN_FTEN9 BIT(9) /*!< falling edge from line 9 */ +#define EXTI_FTEN_FTEN10 BIT(10) /*!< falling edge from line 10 */ +#define EXTI_FTEN_FTEN11 BIT(11) /*!< falling edge from line 11 */ +#define EXTI_FTEN_FTEN12 BIT(12) /*!< falling edge from line 12 */ +#define EXTI_FTEN_FTEN13 BIT(13) /*!< falling edge from line 13 */ +#define EXTI_FTEN_FTEN14 BIT(14) /*!< falling edge from line 14 */ +#define EXTI_FTEN_FTEN15 BIT(15) /*!< falling edge from line 15 */ +#define EXTI_FTEN_FTEN16 BIT(16) /*!< falling edge from line 16 */ +#define EXTI_FTEN_FTEN17 BIT(17) /*!< falling edge from line 17 */ +#define EXTI_FTEN_FTEN18 BIT(18) /*!< falling edge from line 18 */ + +/* EXTI_SWIEV */ +#define EXTI_SWIEV_SWIEV0 BIT(0) /*!< software interrupt/event request from line 0 */ +#define EXTI_SWIEV_SWIEV1 BIT(1) /*!< software interrupt/event request from line 1 */ +#define EXTI_SWIEV_SWIEV2 BIT(2) /*!< software interrupt/event request from line 2 */ +#define EXTI_SWIEV_SWIEV3 BIT(3) /*!< software interrupt/event request from line 3 */ +#define EXTI_SWIEV_SWIEV4 BIT(4) /*!< software interrupt/event request from line 4 */ +#define EXTI_SWIEV_SWIEV5 BIT(5) /*!< software interrupt/event request from line 5 */ +#define EXTI_SWIEV_SWIEV6 BIT(6) /*!< software interrupt/event request from line 6 */ +#define EXTI_SWIEV_SWIEV7 BIT(7) /*!< software interrupt/event request from line 7 */ +#define EXTI_SWIEV_SWIEV8 BIT(8) /*!< software interrupt/event request from line 8 */ +#define EXTI_SWIEV_SWIEV9 BIT(9) /*!< software interrupt/event request from line 9 */ +#define EXTI_SWIEV_SWIEV10 BIT(10) /*!< software interrupt/event request from line 10 */ +#define EXTI_SWIEV_SWIEV11 BIT(11) /*!< software interrupt/event request from line 11 */ +#define EXTI_SWIEV_SWIEV12 BIT(12) /*!< software interrupt/event request from line 12 */ +#define EXTI_SWIEV_SWIEV13 BIT(13) /*!< software interrupt/event request from line 13 */ +#define EXTI_SWIEV_SWIEV14 BIT(14) /*!< software interrupt/event request from line 14 */ +#define EXTI_SWIEV_SWIEV15 BIT(15) /*!< software interrupt/event request from line 15 */ +#define EXTI_SWIEV_SWIEV16 BIT(16) /*!< software interrupt/event request from line 16 */ +#define EXTI_SWIEV_SWIEV17 BIT(17) /*!< software interrupt/event request from line 17 */ +#define EXTI_SWIEV_SWIEV18 BIT(18) /*!< software interrupt/event request from line 18 */ + +/* EXTI_PD */ +#define EXTI_PD_PD0 BIT(0) /*!< interrupt/event pending status from line 0 */ +#define EXTI_PD_PD1 BIT(1) /*!< interrupt/event pending status from line 1 */ +#define EXTI_PD_PD2 BIT(2) /*!< interrupt/event pending status from line 2 */ +#define EXTI_PD_PD3 BIT(3) /*!< interrupt/event pending status from line 3 */ +#define EXTI_PD_PD4 BIT(4) /*!< interrupt/event pending status from line 4 */ +#define EXTI_PD_PD5 BIT(5) /*!< interrupt/event pending status from line 5 */ +#define EXTI_PD_PD6 BIT(6) /*!< interrupt/event pending status from line 6 */ +#define EXTI_PD_PD7 BIT(7) /*!< interrupt/event pending status from line 7 */ +#define EXTI_PD_PD8 BIT(8) /*!< interrupt/event pending status from line 8 */ +#define EXTI_PD_PD9 BIT(9) /*!< interrupt/event pending status from line 9 */ +#define EXTI_PD_PD10 BIT(10) /*!< interrupt/event pending status from line 10 */ +#define EXTI_PD_PD11 BIT(11) /*!< interrupt/event pending status from line 11 */ +#define EXTI_PD_PD12 BIT(12) /*!< interrupt/event pending status from line 12 */ +#define EXTI_PD_PD13 BIT(13) /*!< interrupt/event pending status from line 13 */ +#define EXTI_PD_PD14 BIT(14) /*!< interrupt/event pending status from line 14 */ +#define EXTI_PD_PD15 BIT(15) /*!< interrupt/event pending status from line 15 */ +#define EXTI_PD_PD16 BIT(16) /*!< interrupt/event pending status from line 16 */ +#define EXTI_PD_PD17 BIT(17) /*!< interrupt/event pending status from line 17 */ +#define EXTI_PD_PD18 BIT(18) /*!< interrupt/event pending status from line 18 */ + +/* constants definitions */ +/* EXTI line number */ +typedef enum { + EXTI_0 = BIT(0), /*!< EXTI line 0 */ + EXTI_1 = BIT(1), /*!< EXTI line 1 */ + EXTI_2 = BIT(2), /*!< EXTI line 2 */ + EXTI_3 = BIT(3), /*!< EXTI line 3 */ + EXTI_4 = BIT(4), /*!< EXTI line 4 */ + EXTI_5 = BIT(5), /*!< EXTI line 5 */ + EXTI_6 = BIT(6), /*!< EXTI line 6 */ + EXTI_7 = BIT(7), /*!< EXTI line 7 */ + EXTI_8 = BIT(8), /*!< EXTI line 8 */ + EXTI_9 = BIT(9), /*!< EXTI line 9 */ + EXTI_10 = BIT(10), /*!< EXTI line 10 */ + EXTI_11 = BIT(11), /*!< EXTI line 11 */ + EXTI_12 = BIT(12), /*!< EXTI line 12 */ + EXTI_13 = BIT(13), /*!< EXTI line 13 */ + EXTI_14 = BIT(14), /*!< EXTI line 14 */ + EXTI_15 = BIT(15), /*!< EXTI line 15 */ + EXTI_16 = BIT(16), /*!< EXTI line 16 */ + EXTI_17 = BIT(17), /*!< EXTI line 17 */ + EXTI_18 = BIT(18), /*!< EXTI line 18 */ +} exti_line_enum; + +/* external interrupt and event */ +typedef enum { + EXTI_INTERRUPT = 0, /*!< EXTI interrupt mode */ + EXTI_EVENT /*!< EXTI event mode */ +} exti_mode_enum; + +/* interrupt trigger mode */ +typedef enum { + EXTI_TRIG_RISING = 0, /*!< EXTI rising edge trigger */ + EXTI_TRIG_FALLING, /*!< EXTI falling edge trigger */ + EXTI_TRIG_BOTH, /*!< EXTI rising edge and falling edge trigger */ + EXTI_TRIG_NONE /*!< without rising edge or falling edge trigger */ +} exti_trig_type_enum; + +/* function declarations */ +/* initialization, EXTI lines configuration functions */ +/* deinitialize the EXTI */ +void exti_deinit(void); +/* enable the configuration of EXTI initialize */ +void exti_init(exti_line_enum linex, exti_mode_enum mode, exti_trig_type_enum trig_type); +/* enable the interrupts from EXTI line x */ +void exti_interrupt_enable(exti_line_enum linex); +/* enable the events from EXTI line x */ +void exti_event_enable(exti_line_enum linex); +/* disable the interrupts from EXTI line x */ +void exti_interrupt_disable(exti_line_enum linex); +/* disable the events from EXTI line x */ +void exti_event_disable(exti_line_enum linex); + +/* interrupt & flag functions */ +/* get EXTI lines pending flag */ +FlagStatus exti_flag_get(exti_line_enum linex); +/* clear EXTI lines pending flag */ +void exti_flag_clear(exti_line_enum linex); +/* get EXTI lines flag when the interrupt flag is set */ +FlagStatus exti_interrupt_flag_get(exti_line_enum linex); +/* clear EXTI lines pending flag */ +void exti_interrupt_flag_clear(exti_line_enum linex); +/* enable the EXTI software interrupt event */ +void exti_software_interrupt_enable(exti_line_enum linex); +/* disable the EXTI software interrupt event */ +void exti_software_interrupt_disable(exti_line_enum linex); + +#endif /* GD32VF103_EXTI_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h new file mode 100644 index 0000000..05ecbd6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fmc.h @@ -0,0 +1,312 @@ +/*! + \file gd32vf103_fmc.h + \brief definitions for the FMC + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + \version 2019-09-18, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_FMC_H +#define GD32VF103_FMC_H + +#include "gd32vf103.h" + +/* FMC and option byte definition */ +#define FMC FMC_BASE /*!< FMC register base address */ +#define OB OB_BASE /*!< option bytes base address */ + +/* registers definitions */ +#define FMC_WS REG32((FMC) + 0x00U) /*!< FMC wait state register */ +#define FMC_KEY REG32((FMC) + 0x04U) /*!< FMC unlock key register */ +#define FMC_OBKEY REG32((FMC) + 0x08U) /*!< FMC option bytes unlock key register */ +#define FMC_STAT REG32((FMC) + 0x0CU) /*!< FMC status register */ +#define FMC_CTL REG32((FMC) + 0x10U) /*!< FMC control register */ +#define FMC_ADDR REG32((FMC) + 0x14U) /*!< FMC address register */ +#define FMC_OBSTAT REG32((FMC) + 0x1CU) /*!< FMC option bytes status register */ +#define FMC_WP REG32((FMC) + 0x20U) /*!< FMC erase/program protection register */ +#define FMC_PID REG32((FMC) + 0x100U) /*!< FMC product ID register */ + +#define OB_SPC REG16((OB) + 0x00U) /*!< option byte security protection value */ +#define OB_USER REG16((OB) + 0x02U) /*!< option byte user value*/ +#define OB_WP0 REG16((OB) + 0x08U) /*!< option byte write protection 0 */ +#define OB_WP1 REG16((OB) + 0x0AU) /*!< option byte write protection 1 */ +#define OB_WP2 REG16((OB) + 0x0CU) /*!< option byte write protection 2 */ +#define OB_WP3 REG16((OB) + 0x0EU) /*!< option byte write protection 3 */ + +/* bits definitions */ +/* FMC_WS */ +#define FMC_WS_WSCNT BITS(0,2) /*!< wait state counter */ + +/* FMC_KEY */ +#define FMC_KEY_KEY BITS(0,31) /*!< FMC_CTL unlock key bits */ + +/* FMC_OBKEY */ +#define FMC_OBKEY_OBKEY BITS(0,31) /*!< option bytes unlock key bits */ + +/* FMC_STAT */ +#define FMC_STAT_BUSY BIT(0) /*!< flash busy flag bit */ +#define FMC_STAT_PGERR BIT(2) /*!< flash program error flag bit */ +#define FMC_STAT_WPERR BIT(4) /*!< erase/program protection error flag bit */ +#define FMC_STAT_ENDF BIT(5) /*!< end of operation flag bit */ + +/* FMC_CTL */ +#define FMC_CTL_PG BIT(0) /*!< main flash program command bit */ +#define FMC_CTL_PER BIT(1) /*!< main flash page erase command bit */ +#define FMC_CTL_MER BIT(2) /*!< main flash mass erase command bit */ +#define FMC_CTL_OBPG BIT(4) /*!< option bytes program command bit */ +#define FMC_CTL_OBER BIT(5) /*!< option bytes erase command bit */ +#define FMC_CTL_START BIT(6) /*!< send erase command to FMC bit */ +#define FMC_CTL_LK BIT(7) /*!< FMC_CTL lock bit */ +#define FMC_CTL_OBWEN BIT(9) /*!< option bytes erase/program enable bit */ +#define FMC_CTL_ERRIE BIT(10) /*!< error interrupt enable bit */ +#define FMC_CTL_ENDIE BIT(12) /*!< end of operation interrupt enable bit */ + +/* FMC_ADDR */ +#define FMC_ADDR0_ADDR BITS(0,31) /*!< Flash erase/program command address bits */ + +/* FMC_OBSTAT */ +#define FMC_OBSTAT_OBERR BIT(0) /*!< option bytes read error bit. */ +#define FMC_OBSTAT_SPC BIT(1) /*!< option bytes security protection code */ +#define FMC_OBSTAT_USER BITS(2,9) /*!< store USER of option bytes block after system reset */ +#define FMC_OBSTAT_DATA BITS(10,25) /*!< store DATA of option bytes block after system reset. */ + +/* FMC_WP */ +#define FMC_WP_WP BITS(0,31) /*!< store WP of option bytes block after system reset */ + +/* FMC_WSEN */ +#define FMC_WSEN_WSEN BIT(0) /*!< FMC wait state enable bit */ + +/* FMC_PID */ +#define FMC_PID_PID BITS(0,31) /*!< product ID bits */ + +/* constants definitions */ +/* define the FMC bit position and its register index offset */ +#define FMC_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define FMC_REG_VAL(offset) (REG32(FMC + ((uint32_t)(offset) >> 6))) +#define FMC_BIT_POS(val) ((uint32_t)(val) & 0x1FU) +#define FMC_REGIDX_BITS(regidx, bitpos0, bitpos1) (((uint32_t)(regidx) << 12) | ((uint32_t)(bitpos0) << 6) | (uint32_t)(bitpos1)) +#define FMC_REG_VALS(offset) (REG32(FMC + ((uint32_t)(offset) >> 12))) +#define FMC_BIT_POS0(val) (((uint32_t)(val) >> 6) & 0x1FU) +#define FMC_BIT_POS1(val) ((uint32_t)(val) & 0x1FU) +#define FMC_REG_OFFSET_GET(flag) ((uint32_t)(flag) >> 12) + +/* configuration register */ +#define FMC_STAT_REG_OFFSET 0x0CU /*!< status register offset */ +#define FMC_CTL_REG_OFFSET 0x10U /*!< control register offset */ +#define FMC_OBSTAT_REG_OFFSET 0x1CU /*!< option byte status register offset */ + +/* fmc state */ +typedef enum +{ + FMC_READY, /*!< the operation has been completed */ + FMC_BUSY, /*!< the operation is in progress */ + FMC_PGERR, /*!< program error */ + FMC_WPERR, /*!< erase/program protection error */ + FMC_TOERR, /*!< timeout error */ +}fmc_state_enum; + +/* FMC interrupt enable */ +typedef enum +{ + FMC_INT_END = FMC_REGIDX_BIT(FMC_CTL_REG_OFFSET, 12U), /*!< enable FMC end of program interrupt */ + FMC_INT_ERR = FMC_REGIDX_BIT(FMC_CTL_REG_OFFSET, 10U), /*!< enable FMC error interrupt */ +}fmc_int_enum; + +/* FMC flags */ +typedef enum +{ + FMC_FLAG_BUSY = FMC_REGIDX_BIT(FMC_STAT_REG_OFFSET, 0U), /*!< FMC busy flag */ + FMC_FLAG_PGERR = FMC_REGIDX_BIT(FMC_STAT_REG_OFFSET, 2U), /*!< FMC operation error flag bit */ + FMC_FLAG_WPERR = FMC_REGIDX_BIT(FMC_STAT_REG_OFFSET, 4U), /*!< FMC erase/program protection error flag bit */ + FMC_FLAG_END = FMC_REGIDX_BIT(FMC_STAT_REG_OFFSET, 5U), /*!< FMC end of operation flag bit */ + FMC_FLAG_OBERR = FMC_REGIDX_BIT(FMC_OBSTAT_REG_OFFSET, 0U), /*!< FMC option bytes read error flag */ +}fmc_flag_enum; + +/* FMC interrupt flags */ +typedef enum +{ + FMC_INT_FLAG_PGERR = FMC_REGIDX_BITS(FMC_STAT_REG_OFFSET, 2U, 10U), /*!< FMC operation error interrupt flag bit */ + FMC_INT_FLAG_WPERR = FMC_REGIDX_BITS(FMC_STAT_REG_OFFSET, 4U, 10U), /*!< FMC erase/program protection error interrupt flag bit */ + FMC_INT_FLAG_END = FMC_REGIDX_BITS(FMC_STAT_REG_OFFSET, 5U, 12U), /*!< FMC end of operation interrupt flag bit */ +}fmc_interrupt_flag_enum; + +/* unlock key */ +#define UNLOCK_KEY0 ((uint32_t)0x45670123U) /*!< unlock key 0 */ +#define UNLOCK_KEY1 ((uint32_t)0xCDEF89ABU) /*!< unlock key 1 */ + +/* FMC wait state counter */ +#define WS_WSCNT(regval) (BITS(0,2) & ((uint32_t)(regval))) +#define WS_WSCNT_0 WS_WSCNT(0) /*!< FMC 0 wait */ +#define WS_WSCNT_1 WS_WSCNT(1) /*!< FMC 1 wait */ +#define WS_WSCNT_2 WS_WSCNT(2) /*!< FMC 2 wait */ + +/* option bytes software/hardware free watch dog timer */ +#define OB_FWDGT_SW ((uint8_t)0x01U) /*!< software free watchdog */ +#define OB_FWDGT_HW ((uint8_t)0x00U) /*!< hardware free watchdog */ + +/* option bytes reset or not entering deep sleep mode */ +#define OB_DEEPSLEEP_NRST ((uint8_t)0x02U) /*!< no reset when entering deepsleep mode */ +#define OB_DEEPSLEEP_RST ((uint8_t)0x00U) /*!< generate a reset instead of entering deepsleep mode */ + +/* option bytes reset or not entering standby mode */ +#define OB_STDBY_NRST ((uint8_t)0x04U) /*!< no reset when entering deepsleep mode */ +#define OB_STDBY_RST ((uint8_t)0x00U) /*!< generate a reset instead of entering standby mode */ + +/* option bytes boot bank value */ +#define OB_BOOT_B0 ((uint8_t)0x08U) /*!< boot from bank0 */ + +#define OB_USER_MASK ((uint8_t)0xF0U) /*!< MASK value */ + +/* read protect configure */ +#define FMC_NSPC ((uint8_t)0xA5U) /*!< no security protection */ +#define FMC_USPC ((uint8_t)0xBBU) /*!< under security protection */ + +/* OB_SPC */ +#define OB_SPC_SPC ((uint32_t)0x000000FFU) /*!< option byte security protection value */ +#define OB_SPC_SPC_N ((uint32_t)0x0000FF00U) /*!< option byte security protection complement value */ + +/* OB_USER */ +#define OB_USER_USER ((uint32_t)0x00FF0000U) /*!< user option value */ +#define OB_USER_USER_N ((uint32_t)0xFF000000U) /*!< user option complement value */ + +/* OB_WP0 */ +#define OB_WP0_WP0 ((uint32_t)0x000000FFU) /*!< FMC write protection option value */ + +/* OB_WP1 */ +#define OB_WP1_WP1 ((uint32_t)0x0000FF00U) /*!< FMC write protection option complement value */ + +/* OB_WP2 */ +#define OB_WP2_WP2 ((uint32_t)0x00FF0000U) /*!< FMC write protection option value */ + +/* OB_WP3 */ +#define OB_WP3_WP3 ((uint32_t)0xFF000000U) /*!< FMC write protection option complement value */ + +/* option bytes write protection */ +#define OB_WP_0 ((uint32_t)0x00000001U) /*!< erase/program protection of sector 0 */ +#define OB_WP_1 ((uint32_t)0x00000002U) /*!< erase/program protection of sector 1 */ +#define OB_WP_2 ((uint32_t)0x00000004U) /*!< erase/program protection of sector 2 */ +#define OB_WP_3 ((uint32_t)0x00000008U) /*!< erase/program protection of sector 3 */ +#define OB_WP_4 ((uint32_t)0x00000010U) /*!< erase/program protection of sector 4 */ +#define OB_WP_5 ((uint32_t)0x00000020U) /*!< erase/program protection of sector 5 */ +#define OB_WP_6 ((uint32_t)0x00000040U) /*!< erase/program protection of sector 6 */ +#define OB_WP_7 ((uint32_t)0x00000080U) /*!< erase/program protection of sector 7 */ +#define OB_WP_8 ((uint32_t)0x00000100U) /*!< erase/program protection of sector 8 */ +#define OB_WP_9 ((uint32_t)0x00000200U) /*!< erase/program protection of sector 9 */ +#define OB_WP_10 ((uint32_t)0x00000400U) /*!< erase/program protection of sector 10 */ +#define OB_WP_11 ((uint32_t)0x00000800U) /*!< erase/program protection of sector 11 */ +#define OB_WP_12 ((uint32_t)0x00001000U) /*!< erase/program protection of sector 12 */ +#define OB_WP_13 ((uint32_t)0x00002000U) /*!< erase/program protection of sector 13 */ +#define OB_WP_14 ((uint32_t)0x00004000U) /*!< erase/program protection of sector 14 */ +#define OB_WP_15 ((uint32_t)0x00008000U) /*!< erase/program protection of sector 15 */ +#define OB_WP_16 ((uint32_t)0x00010000U) /*!< erase/program protection of sector 16 */ +#define OB_WP_17 ((uint32_t)0x00020000U) /*!< erase/program protection of sector 17 */ +#define OB_WP_18 ((uint32_t)0x00040000U) /*!< erase/program protection of sector 18 */ +#define OB_WP_19 ((uint32_t)0x00080000U) /*!< erase/program protection of sector 19 */ +#define OB_WP_20 ((uint32_t)0x00100000U) /*!< erase/program protection of sector 20 */ +#define OB_WP_21 ((uint32_t)0x00200000U) /*!< erase/program protection of sector 21 */ +#define OB_WP_22 ((uint32_t)0x00400000U) /*!< erase/program protection of sector 22 */ +#define OB_WP_23 ((uint32_t)0x00800000U) /*!< erase/program protection of sector 23 */ +#define OB_WP_24 ((uint32_t)0x01000000U) /*!< erase/program protection of sector 24 */ +#define OB_WP_25 ((uint32_t)0x02000000U) /*!< erase/program protection of sector 25 */ +#define OB_WP_26 ((uint32_t)0x04000000U) /*!< erase/program protection of sector 26 */ +#define OB_WP_27 ((uint32_t)0x08000000U) /*!< erase/program protection of sector 27 */ +#define OB_WP_28 ((uint32_t)0x10000000U) /*!< erase/program protection of sector 28 */ +#define OB_WP_29 ((uint32_t)0x20000000U) /*!< erase/program protection of sector 29 */ +#define OB_WP_30 ((uint32_t)0x40000000U) /*!< erase/program protection of sector 30 */ +#define OB_WP_31 ((uint32_t)0x80000000U) /*!< erase/program protection of sector 31 */ +#define OB_WP_ALL ((uint32_t)0xFFFFFFFFU) /*!< erase/program protection of all sectors */ + +/* FMC timeout */ +#define FMC_TIMEOUT_COUNT ((uint32_t)0x000F0000U) /*!< FMC timeout count value */ + +/* FMC BANK address */ +#define FMC_SIZE (*(uint16_t *)0x1FFFF7E0U) /*!< FMC size */ +#define SRAM_SIZE (*(uint16_t *)0x1FFFF7E2U) /*!< SRAM size*/ + +/* function declarations */ +/* FMC main memory programming functions */ +/* set the FMC wait state counter */ +void fmc_wscnt_set(uint32_t wscnt); +/* unlock the main FMC operation */ +void fmc_unlock(void); +/* lock the main FMC operation */ +void fmc_lock(void); +/* FMC erase page */ +fmc_state_enum fmc_page_erase(uint32_t page_address); +/* FMC erase whole chip */ +fmc_state_enum fmc_mass_erase(void); +/* FMC program a word at the corresponding address */ +fmc_state_enum fmc_word_program(uint32_t address, uint32_t data); +/* FMC program a half word at the corresponding address */ +fmc_state_enum fmc_halfword_program(uint32_t address, uint16_t data); + +/* FMC option bytes programming functions */ +/* unlock the option byte operation */ +void ob_unlock(void); +/* lock the option byte operation */ +void ob_lock(void); +/* erase the FMC option byte */ +fmc_state_enum ob_erase(void); +/* enable write protection */ +fmc_state_enum ob_write_protection_enable(uint32_t ob_wp); +/* configure security protection */ +fmc_state_enum ob_security_protection_config(uint8_t ob_spc); +/* program the FMC user option byte */ +fmc_state_enum ob_user_write(uint8_t ob_fwdgt, uint8_t ob_deepsleep, uint8_t ob_stdby, uint8_t ob_boot); +/* program the FMC data option byte */ +fmc_state_enum ob_data_program(uint32_t address, uint8_t data); +/* get OB_USER in register FMC_OBSTAT */ +uint8_t ob_user_get(void); +/* get OB_DATA in register FMC_OBSTAT */ +uint16_t ob_data_get(void); +/* get the FMC option byte write protection */ +uint32_t ob_write_protection_get(void); +/* get FMC option byte security protection state */ +FlagStatus ob_spc_get(void); + +/* FMC interrupts and flags management functions */ +/* enable FMC interrupt */ +void fmc_interrupt_enable(uint32_t interrupt); +/* disable FMC interrupt */ +void fmc_interrupt_disable(uint32_t interrupt); +/* check flag is set or not */ +FlagStatus fmc_flag_get(uint32_t flag); +/* clear the FMC flag */ +void fmc_flag_clear(uint32_t flag); +/* get FMC interrupt flag state */ +FlagStatus fmc_interrupt_flag_get(fmc_interrupt_flag_enum flag); +/* clear FMC interrupt flag state */ +void fmc_interrupt_flag_clear(fmc_interrupt_flag_enum flag); +/* return the FMC state */ +fmc_state_enum fmc_state_get(void); +/* check FMC ready or not */ +fmc_state_enum fmc_ready_wait(uint32_t timeout); + +#endif /* GD32VF103_FMC_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h new file mode 100644 index 0000000..941cdc1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_fwdgt.h @@ -0,0 +1,104 @@ +/*! + \file gd32vf103_fwdgt.h + \brief definitions for the FWDGT + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_FWDGT_H +#define GD32VF103_FWDGT_H + +#include "gd32vf103.h" + +/* FWDGT definitions */ +#define FWDGT FWDGT_BASE /*!< FWDGT base address */ + +/* registers definitions */ +#define FWDGT_CTL REG32((FWDGT) + 0x00000000U) /*!< FWDGT control register */ +#define FWDGT_PSC REG32((FWDGT) + 0x00000004U) /*!< FWDGT prescaler register */ +#define FWDGT_RLD REG32((FWDGT) + 0x00000008U) /*!< FWDGT reload register */ +#define FWDGT_STAT REG32((FWDGT) + 0x0000000CU) /*!< FWDGT status register */ + +/* bits definitions */ +/* FWDGT_CTL */ +#define FWDGT_CTL_CMD BITS(0,15) /*!< FWDGT command value */ + +/* FWDGT_PSC */ +#define FWDGT_PSC_PSC BITS(0,2) /*!< FWDGT prescaler divider value */ + +/* FWDGT_RLD */ +#define FWDGT_RLD_RLD BITS(0,11) /*!< FWDGT counter reload value */ + +/* FWDGT_STAT */ +#define FWDGT_STAT_PUD BIT(0) /*!< FWDGT prescaler divider value update */ +#define FWDGT_STAT_RUD BIT(1) /*!< FWDGT counter reload value update */ + +/* constants definitions */ +/* psc register value */ +#define PSC_PSC(regval) (BITS(0,2) & ((uint32_t)(regval) << 0)) +#define FWDGT_PSC_DIV4 ((uint8_t)PSC_PSC(0)) /*!< FWDGT prescaler set to 4 */ +#define FWDGT_PSC_DIV8 ((uint8_t)PSC_PSC(1)) /*!< FWDGT prescaler set to 8 */ +#define FWDGT_PSC_DIV16 ((uint8_t)PSC_PSC(2)) /*!< FWDGT prescaler set to 16 */ +#define FWDGT_PSC_DIV32 ((uint8_t)PSC_PSC(3)) /*!< FWDGT prescaler set to 32 */ +#define FWDGT_PSC_DIV64 ((uint8_t)PSC_PSC(4)) /*!< FWDGT prescaler set to 64 */ +#define FWDGT_PSC_DIV128 ((uint8_t)PSC_PSC(5)) /*!< FWDGT prescaler set to 128 */ +#define FWDGT_PSC_DIV256 ((uint8_t)PSC_PSC(6)) /*!< FWDGT prescaler set to 256 */ + +/* control value */ +#define FWDGT_WRITEACCESS_ENABLE ((uint16_t)0x5555U) /*!< FWDGT_CTL bits write access enable value */ +#define FWDGT_WRITEACCESS_DISABLE ((uint16_t)0x0000U) /*!< FWDGT_CTL bits write access disable value */ +#define FWDGT_KEY_RELOAD ((uint16_t)0xAAAAU) /*!< FWDGT_CTL bits fwdgt counter reload value */ +#define FWDGT_KEY_ENABLE ((uint16_t)0xCCCCU) /*!< FWDGT_CTL bits fwdgt counter enable value */ + +/* FWDGT timeout value */ +#define FWDGT_PSC_TIMEOUT ((uint32_t)0x000FFFFFU) /*!< FWDGT_PSC register write operation state flag timeout */ +#define FWDGT_RLD_TIMEOUT ((uint32_t)0x000FFFFFU) /*!< FWDGT_RLD register write operation state flag timeout */ + +/* FWDGT flag definitions */ +#define FWDGT_FLAG_PUD FWDGT_STAT_PUD /*!< FWDGT prescaler divider value update flag */ +#define FWDGT_FLAG_RUD FWDGT_STAT_RUD /*!< FWDGT counter reload value update flag */ + +/* function declarations */ +/* enable write access to FWDGT_PSC and FWDGT_RLD */ +void fwdgt_write_enable(void); +/* disable write access to FWDGT_PSC and FWDGT_RLD */ +void fwdgt_write_disable(void); +/* start the free watchdog timer counter */ +void fwdgt_enable(void); + +/* reload the counter of FWDGT */ +void fwdgt_counter_reload(void); +/* configure counter reload value, and prescaler divider value */ +ErrStatus fwdgt_config(uint16_t reload_value, uint8_t prescaler_div); + +/* get flag state of FWDGT */ +FlagStatus fwdgt_flag_get(uint16_t flag); + +#endif /* GD32VF103_FWDGT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h new file mode 100644 index 0000000..d547299 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_gpio.h @@ -0,0 +1,421 @@ +/*! + \file gd32vf103_gpio.h + \brief definitions for the GPIO + + \version 2019-06-5, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_GPIO_H +#define GD32VF103_GPIO_H + +#include "gd32vf103.h" + +/* GPIOx(x=A,B,C,D,E) definitions */ +#define GPIOA (GPIO_BASE + 0x00000000U) +#define GPIOB (GPIO_BASE + 0x00000400U) +#define GPIOC (GPIO_BASE + 0x00000800U) +#define GPIOD (GPIO_BASE + 0x00000C00U) +#define GPIOE (GPIO_BASE + 0x00001000U) + +/* AFIO definitions */ +#define AFIO AFIO_BASE + +/* registers definitions */ + +/* GPIO registers definitions */ +#define GPIO_CTL0(gpiox) REG32((gpiox) + 0x00U) /*!< GPIO port control register 0 */ +#define GPIO_CTL1(gpiox) REG32((gpiox) + 0x04U) /*!< GPIO port control register 1 */ +#define GPIO_ISTAT(gpiox) REG32((gpiox) + 0x08U) /*!< GPIO port input status register */ +#define GPIO_OCTL(gpiox) REG32((gpiox) + 0x0CU) /*!< GPIO port output control register */ +#define GPIO_BOP(gpiox) REG32((gpiox) + 0x10U) /*!< GPIO port bit operation register */ +#define GPIO_BC(gpiox) REG32((gpiox) + 0x14U) /*!< GPIO bit clear register */ +#define GPIO_LOCK(gpiox) REG32((gpiox) + 0x18U) /*!< GPIO port configuration lock register */ + +/* AFIO registers definitions */ +#define AFIO_EC REG32(AFIO + 0x00U) /*!< AFIO event control register */ +#define AFIO_PCF0 REG32(AFIO + 0x04U) /*!< AFIO port configuration register 0 */ +#define AFIO_EXTISS0 REG32(AFIO + 0x08U) /*!< AFIO port EXTI sources selection register 0 */ +#define AFIO_EXTISS1 REG32(AFIO + 0x0CU) /*!< AFIO port EXTI sources selection register 1 */ +#define AFIO_EXTISS2 REG32(AFIO + 0x10U) /*!< AFIO port EXTI sources selection register 2 */ +#define AFIO_EXTISS3 REG32(AFIO + 0x14U) /*!< AFIO port EXTI sources selection register 3 */ +#define AFIO_PCF1 REG32(AFIO + 0x1CU) /*!< AFIO port configuration register 1 */ + +/* bits definitions */ +/* GPIO_CTL0 */ +#define GPIO_CTL0_MD0 BITS(0, 1) /*!< port 0 mode bits */ +#define GPIO_CTL0_CTL0 BITS(2, 3) /*!< pin 0 configuration bits */ +#define GPIO_CTL0_MD1 BITS(4, 5) /*!< port 1 mode bits */ +#define GPIO_CTL0_CTL1 BITS(6, 7) /*!< pin 1 configuration bits */ +#define GPIO_CTL0_MD2 BITS(8, 9) /*!< port 2 mode bits */ +#define GPIO_CTL0_CTL2 BITS(10, 11) /*!< pin 2 configuration bits */ +#define GPIO_CTL0_MD3 BITS(12, 13) /*!< port 3 mode bits */ +#define GPIO_CTL0_CTL3 BITS(14, 15) /*!< pin 3 configuration bits */ +#define GPIO_CTL0_MD4 BITS(16, 17) /*!< port 4 mode bits */ +#define GPIO_CTL0_CTL4 BITS(18, 19) /*!< pin 4 configuration bits */ +#define GPIO_CTL0_MD5 BITS(20, 21) /*!< port 5 mode bits */ +#define GPIO_CTL0_CTL5 BITS(22, 23) /*!< pin 5 configuration bits */ +#define GPIO_CTL0_MD6 BITS(24, 25) /*!< port 6 mode bits */ +#define GPIO_CTL0_CTL6 BITS(26, 27) /*!< pin 6 configuration bits */ +#define GPIO_CTL0_MD7 BITS(28, 29) /*!< port 7 mode bits */ +#define GPIO_CTL0_CTL7 BITS(30, 31) /*!< pin 7 configuration bits */ + +/* GPIO_CTL1 */ +#define GPIO_CTL1_MD8 BITS(0, 1) /*!< port 8 mode bits */ +#define GPIO_CTL1_CTL8 BITS(2, 3) /*!< pin 8 configuration bits */ +#define GPIO_CTL1_MD9 BITS(4, 5) /*!< port 9 mode bits */ +#define GPIO_CTL1_CTL9 BITS(6, 7) /*!< pin 9 configuration bits */ +#define GPIO_CTL1_MD10 BITS(8, 9) /*!< port 10 mode bits */ +#define GPIO_CTL1_CTL10 BITS(10, 11) /*!< pin 10 configuration bits */ +#define GPIO_CTL1_MD11 BITS(12, 13) /*!< port 11 mode bits */ +#define GPIO_CTL1_CTL11 BITS(14, 15) /*!< pin 11 configuration bits */ +#define GPIO_CTL1_MD12 BITS(16, 17) /*!< port 12 mode bits */ +#define GPIO_CTL1_CTL12 BITS(18, 19) /*!< pin 12 configuration bits */ +#define GPIO_CTL1_MD13 BITS(20, 21) /*!< port 13 mode bits */ +#define GPIO_CTL1_CTL13 BITS(22, 23) /*!< pin 13 configuration bits */ +#define GPIO_CTL1_MD14 BITS(24, 25) /*!< port 14 mode bits */ +#define GPIO_CTL1_CTL14 BITS(26, 27) /*!< pin 14 configuration bits */ +#define GPIO_CTL1_MD15 BITS(28, 29) /*!< port 15 mode bits */ +#define GPIO_CTL1_CTL15 BITS(30, 31) /*!< pin 15 configuration bits */ + +/* GPIO_ISTAT */ +#define GPIO_ISTAT_ISTAT0 BIT(0) /*!< pin 0 input status */ +#define GPIO_ISTAT_ISTAT1 BIT(1) /*!< pin 1 input status */ +#define GPIO_ISTAT_ISTAT2 BIT(2) /*!< pin 2 input status */ +#define GPIO_ISTAT_ISTAT3 BIT(3) /*!< pin 3 input status */ +#define GPIO_ISTAT_ISTAT4 BIT(4) /*!< pin 4 input status */ +#define GPIO_ISTAT_ISTAT5 BIT(5) /*!< pin 5 input status */ +#define GPIO_ISTAT_ISTAT6 BIT(6) /*!< pin 6 input status */ +#define GPIO_ISTAT_ISTAT7 BIT(7) /*!< pin 7 input status */ +#define GPIO_ISTAT_ISTAT8 BIT(8) /*!< pin 8 input status */ +#define GPIO_ISTAT_ISTAT9 BIT(9) /*!< pin 9 input status */ +#define GPIO_ISTAT_ISTAT10 BIT(10) /*!< pin 10 input status */ +#define GPIO_ISTAT_ISTAT11 BIT(11) /*!< pin 11 input status */ +#define GPIO_ISTAT_ISTAT12 BIT(12) /*!< pin 12 input status */ +#define GPIO_ISTAT_ISTAT13 BIT(13) /*!< pin 13 input status */ +#define GPIO_ISTAT_ISTAT14 BIT(14) /*!< pin 14 input status */ +#define GPIO_ISTAT_ISTAT15 BIT(15) /*!< pin 15 input status */ + +/* GPIO_OCTL */ +#define GPIO_OCTL_OCTL0 BIT(0) /*!< pin 0 output bit */ +#define GPIO_OCTL_OCTL1 BIT(1) /*!< pin 1 output bit */ +#define GPIO_OCTL_OCTL2 BIT(2) /*!< pin 2 output bit */ +#define GPIO_OCTL_OCTL3 BIT(3) /*!< pin 3 output bit */ +#define GPIO_OCTL_OCTL4 BIT(4) /*!< pin 4 output bit */ +#define GPIO_OCTL_OCTL5 BIT(5) /*!< pin 5 output bit */ +#define GPIO_OCTL_OCTL6 BIT(6) /*!< pin 6 output bit */ +#define GPIO_OCTL_OCTL7 BIT(7) /*!< pin 7 output bit */ +#define GPIO_OCTL_OCTL8 BIT(8) /*!< pin 8 output bit */ +#define GPIO_OCTL_OCTL9 BIT(9) /*!< pin 9 output bit */ +#define GPIO_OCTL_OCTL10 BIT(10) /*!< pin 10 output bit */ +#define GPIO_OCTL_OCTL11 BIT(11) /*!< pin 11 output bit */ +#define GPIO_OCTL_OCTL12 BIT(12) /*!< pin 12 output bit */ +#define GPIO_OCTL_OCTL13 BIT(13) /*!< pin 13 output bit */ +#define GPIO_OCTL_OCTL14 BIT(14) /*!< pin 14 output bit */ +#define GPIO_OCTL_OCTL15 BIT(15) /*!< pin 15 output bit */ + +/* GPIO_BOP */ +#define GPIO_BOP_BOP0 BIT(0) /*!< pin 0 set bit */ +#define GPIO_BOP_BOP1 BIT(1) /*!< pin 1 set bit */ +#define GPIO_BOP_BOP2 BIT(2) /*!< pin 2 set bit */ +#define GPIO_BOP_BOP3 BIT(3) /*!< pin 3 set bit */ +#define GPIO_BOP_BOP4 BIT(4) /*!< pin 4 set bit */ +#define GPIO_BOP_BOP5 BIT(5) /*!< pin 5 set bit */ +#define GPIO_BOP_BOP6 BIT(6) /*!< pin 6 set bit */ +#define GPIO_BOP_BOP7 BIT(7) /*!< pin 7 set bit */ +#define GPIO_BOP_BOP8 BIT(8) /*!< pin 8 set bit */ +#define GPIO_BOP_BOP9 BIT(9) /*!< pin 9 set bit */ +#define GPIO_BOP_BOP10 BIT(10) /*!< pin 10 set bit */ +#define GPIO_BOP_BOP11 BIT(11) /*!< pin 11 set bit */ +#define GPIO_BOP_BOP12 BIT(12) /*!< pin 12 set bit */ +#define GPIO_BOP_BOP13 BIT(13) /*!< pin 13 set bit */ +#define GPIO_BOP_BOP14 BIT(14) /*!< pin 14 set bit */ +#define GPIO_BOP_BOP15 BIT(15) /*!< pin 15 set bit */ +#define GPIO_BOP_CR0 BIT(16) /*!< pin 0 clear bit */ +#define GPIO_BOP_CR1 BIT(17) /*!< pin 1 clear bit */ +#define GPIO_BOP_CR2 BIT(18) /*!< pin 2 clear bit */ +#define GPIO_BOP_CR3 BIT(19) /*!< pin 3 clear bit */ +#define GPIO_BOP_CR4 BIT(20) /*!< pin 4 clear bit */ +#define GPIO_BOP_CR5 BIT(21) /*!< pin 5 clear bit */ +#define GPIO_BOP_CR6 BIT(22) /*!< pin 6 clear bit */ +#define GPIO_BOP_CR7 BIT(23) /*!< pin 7 clear bit */ +#define GPIO_BOP_CR8 BIT(24) /*!< pin 8 clear bit */ +#define GPIO_BOP_CR9 BIT(25) /*!< pin 9 clear bit */ +#define GPIO_BOP_CR10 BIT(26) /*!< pin 10 clear bit */ +#define GPIO_BOP_CR11 BIT(27) /*!< pin 11 clear bit */ +#define GPIO_BOP_CR12 BIT(28) /*!< pin 12 clear bit */ +#define GPIO_BOP_CR13 BIT(29) /*!< pin 13 clear bit */ +#define GPIO_BOP_CR14 BIT(30) /*!< pin 14 clear bit */ +#define GPIO_BOP_CR15 BIT(31) /*!< pin 15 clear bit */ + +/* GPIO_BC */ +#define GPIO_BC_CR0 BIT(0) /*!< pin 0 clear bit */ +#define GPIO_BC_CR1 BIT(1) /*!< pin 1 clear bit */ +#define GPIO_BC_CR2 BIT(2) /*!< pin 2 clear bit */ +#define GPIO_BC_CR3 BIT(3) /*!< pin 3 clear bit */ +#define GPIO_BC_CR4 BIT(4) /*!< pin 4 clear bit */ +#define GPIO_BC_CR5 BIT(5) /*!< pin 5 clear bit */ +#define GPIO_BC_CR6 BIT(6) /*!< pin 6 clear bit */ +#define GPIO_BC_CR7 BIT(7) /*!< pin 7 clear bit */ +#define GPIO_BC_CR8 BIT(8) /*!< pin 8 clear bit */ +#define GPIO_BC_CR9 BIT(9) /*!< pin 9 clear bit */ +#define GPIO_BC_CR10 BIT(10) /*!< pin 10 clear bit */ +#define GPIO_BC_CR11 BIT(11) /*!< pin 11 clear bit */ +#define GPIO_BC_CR12 BIT(12) /*!< pin 12 clear bit */ +#define GPIO_BC_CR13 BIT(13) /*!< pin 13 clear bit */ +#define GPIO_BC_CR14 BIT(14) /*!< pin 14 clear bit */ +#define GPIO_BC_CR15 BIT(15) /*!< pin 15 clear bit */ + +/* GPIO_LOCK */ +#define GPIO_LOCK_LK0 BIT(0) /*!< pin 0 lock bit */ +#define GPIO_LOCK_LK1 BIT(1) /*!< pin 1 lock bit */ +#define GPIO_LOCK_LK2 BIT(2) /*!< pin 2 lock bit */ +#define GPIO_LOCK_LK3 BIT(3) /*!< pin 3 lock bit */ +#define GPIO_LOCK_LK4 BIT(4) /*!< pin 4 lock bit */ +#define GPIO_LOCK_LK5 BIT(5) /*!< pin 5 lock bit */ +#define GPIO_LOCK_LK6 BIT(6) /*!< pin 6 lock bit */ +#define GPIO_LOCK_LK7 BIT(7) /*!< pin 7 lock bit */ +#define GPIO_LOCK_LK8 BIT(8) /*!< pin 8 lock bit */ +#define GPIO_LOCK_LK9 BIT(9) /*!< pin 9 lock bit */ +#define GPIO_LOCK_LK10 BIT(10) /*!< pin 10 lock bit */ +#define GPIO_LOCK_LK11 BIT(11) /*!< pin 11 lock bit */ +#define GPIO_LOCK_LK12 BIT(12) /*!< pin 12 lock bit */ +#define GPIO_LOCK_LK13 BIT(13) /*!< pin 13 lock bit */ +#define GPIO_LOCK_LK14 BIT(14) /*!< pin 14 lock bit */ +#define GPIO_LOCK_LK15 BIT(15) /*!< pin 15 lock bit */ +#define GPIO_LOCK_LKK BIT(16) /*!< pin sequence lock key */ + +/* AFIO_EC */ +#define AFIO_EC_PIN BITS(0, 3) /*!< event output pin selection */ +#define AFIO_EC_PORT BITS(4, 6) /*!< event output port selection */ +#define AFIO_EC_EOE BIT(7) /*!< event output enable */ + +/* AFIO_PCF0 */ +#define AFIO_PCF0_SPI0_REMAP BIT(0) /*!< SPI0 remapping */ +#define AFIO_PCF0_I2C0_REMAP BIT(1) /*!< I2C0 remapping */ +#define AFIO_PCF0_USART0_REMAP BIT(2) /*!< USART0 remapping */ +#define AFIO_PCF0_USART1_REMAP BIT(3) /*!< USART1 remapping */ +#define AFIO_PCF0_USART2_REMAP BITS(4, 5) /*!< USART2 remapping */ +#define AFIO_PCF0_TIMER0_REMAP BITS(6, 7) /*!< TIMER0 remapping */ +#define AFIO_PCF0_TIMER1_REMAP BITS(8, 9) /*!< TIMER1 remapping */ +#define AFIO_PCF0_TIMER2_REMAP BITS(10, 11) /*!< TIMER2 remapping */ +#define AFIO_PCF0_TIMER3_REMAP BIT(12) /*!< TIMER3 remapping */ +#define AFIO_PCF0_CAN_REMAP BITS(13, 14) /*!< CAN remapping */ +#define AFIO_PCF0_PD01_REMAP BIT(15) /*!< port D0/port D1 mapping on OSC_IN/OSC_OUT */ +#define AFIO_PCF0_TIMER4CH3_IREMAP BIT(16) /*!< TIMER3 channel3 internal remapping */ +#define AFIO_PCF0_SWJ_CFG BITS(24, 26) /*!< serial wire JTAG configuration */ +#define AFIO_PCF0_SPI2_REMAP BIT(28) /*!< SPI2/I2S2 remapping */ +#define AFIO_PCF0_TIMER1_ITI1_REMAP BIT(29) /*!< TIMER1 internal trigger 1 remapping */ + +/* AFIO_EXTISS0 */ +#define AFIO_EXTI0_SS BITS(0, 3) /*!< EXTI 0 sources selection */ +#define AFIO_EXTI1_SS BITS(4, 7) /*!< EXTI 1 sources selection */ +#define AFIO_EXTI2_SS BITS(8, 11) /*!< EXTI 2 sources selection */ +#define AFIO_EXTI3_SS BITS(12, 15) /*!< EXTI 3 sources selection */ + +/* AFIO_EXTISS1 */ +#define AFIO_EXTI4_SS BITS(0, 3) /*!< EXTI 4 sources selection */ +#define AFIO_EXTI5_SS BITS(4, 7) /*!< EXTI 5 sources selection */ +#define AFIO_EXTI6_SS BITS(8, 11) /*!< EXTI 6 sources selection */ +#define AFIO_EXTI7_SS BITS(12, 15) /*!< EXTI 7 sources selection */ + +/* AFIO_EXTISS2 */ +#define AFIO_EXTI8_SS BITS(0, 3) /*!< EXTI 8 sources selection */ +#define AFIO_EXTI9_SS BITS(4, 7) /*!< EXTI 9 sources selection */ +#define AFIO_EXTI10_SS BITS(8, 11) /*!< EXTI 10 sources selection */ +#define AFIO_EXTI11_SS BITS(12, 15) /*!< EXTI 11 sources selection */ + +/* AFIO_EXTISS3 */ +#define AFIO_EXTI12_SS BITS(0, 3) /*!< EXTI 12 sources selection */ +#define AFIO_EXTI13_SS BITS(4, 7) /*!< EXTI 13 sources selection */ +#define AFIO_EXTI14_SS BITS(8, 11) /*!< EXTI 14 sources selection */ +#define AFIO_EXTI15_SS BITS(12, 15) /*!< EXTI 15 sources selection */ + +/* AFIO_PCF1 */ +#define AFIO_PCF1_EXMC_NADV BIT(10) /*!< EXMC_NADV connect/disconnect */ + +/* constants definitions */ +typedef FlagStatus bit_status; + +/* GPIO mode values set */ +#define GPIO_MODE_SET(n, mode) ((uint32_t)((uint32_t)(mode) << (4U * (n)))) +#define GPIO_MODE_MASK(n) (0xFU << (4U * (n))) + +/* GPIO mode definitions */ +#define GPIO_MODE_AIN ((uint8_t)0x00U) /*!< analog input mode */ +#define GPIO_MODE_IN_FLOATING ((uint8_t)0x04U) /*!< floating input mode */ +#define GPIO_MODE_IPD ((uint8_t)0x28U) /*!< pull-down input mode */ +#define GPIO_MODE_IPU ((uint8_t)0x48U) /*!< pull-up input mode */ +#define GPIO_MODE_OUT_OD ((uint8_t)0x14U) /*!< GPIO output with open-drain */ +#define GPIO_MODE_OUT_PP ((uint8_t)0x10U) /*!< GPIO output with push-pull */ +#define GPIO_MODE_AF_OD ((uint8_t)0x1CU) /*!< AFIO output with open-drain */ +#define GPIO_MODE_AF_PP ((uint8_t)0x18U) /*!< AFIO output with push-pull */ + +/* GPIO output max speed value */ +#define GPIO_OSPEED_10MHZ ((uint8_t)0x01U) /*!< output max speed 10MHz */ +#define GPIO_OSPEED_2MHZ ((uint8_t)0x02U) /*!< output max speed 2MHz */ +#define GPIO_OSPEED_50MHZ ((uint8_t)0x03U) /*!< output max speed 50MHz */ + +/* GPIO event output port definitions */ +#define GPIO_EVENT_PORT_GPIOA ((uint8_t)0x00U) /*!< event output port A */ +#define GPIO_EVENT_PORT_GPIOB ((uint8_t)0x01U) /*!< event output port B */ +#define GPIO_EVENT_PORT_GPIOC ((uint8_t)0x02U) /*!< event output port C */ +#define GPIO_EVENT_PORT_GPIOD ((uint8_t)0x03U) /*!< event output port D */ +#define GPIO_EVENT_PORT_GPIOE ((uint8_t)0x04U) /*!< event output port E */ + +/* GPIO output port source definitions */ +#define GPIO_PORT_SOURCE_GPIOA ((uint8_t)0x00U) /*!< output port source A */ +#define GPIO_PORT_SOURCE_GPIOB ((uint8_t)0x01U) /*!< output port source B */ +#define GPIO_PORT_SOURCE_GPIOC ((uint8_t)0x02U) /*!< output port source C */ +#define GPIO_PORT_SOURCE_GPIOD ((uint8_t)0x03U) /*!< output port source D */ +#define GPIO_PORT_SOURCE_GPIOE ((uint8_t)0x04U) /*!< output port source E */ + +/* GPIO event output pin definitions */ +#define GPIO_EVENT_PIN_0 ((uint8_t)0x00U) /*!< GPIO event pin 0 */ +#define GPIO_EVENT_PIN_1 ((uint8_t)0x01U) /*!< GPIO event pin 1 */ +#define GPIO_EVENT_PIN_2 ((uint8_t)0x02U) /*!< GPIO event pin 2 */ +#define GPIO_EVENT_PIN_3 ((uint8_t)0x03U) /*!< GPIO event pin 3 */ +#define GPIO_EVENT_PIN_4 ((uint8_t)0x04U) /*!< GPIO event pin 4 */ +#define GPIO_EVENT_PIN_5 ((uint8_t)0x05U) /*!< GPIO event pin 5 */ +#define GPIO_EVENT_PIN_6 ((uint8_t)0x06U) /*!< GPIO event pin 6 */ +#define GPIO_EVENT_PIN_7 ((uint8_t)0x07U) /*!< GPIO event pin 7 */ +#define GPIO_EVENT_PIN_8 ((uint8_t)0x08U) /*!< GPIO event pin 8 */ +#define GPIO_EVENT_PIN_9 ((uint8_t)0x09U) /*!< GPIO event pin 9 */ +#define GPIO_EVENT_PIN_10 ((uint8_t)0x0AU) /*!< GPIO event pin 10 */ +#define GPIO_EVENT_PIN_11 ((uint8_t)0x0BU) /*!< GPIO event pin 11 */ +#define GPIO_EVENT_PIN_12 ((uint8_t)0x0CU) /*!< GPIO event pin 12 */ +#define GPIO_EVENT_PIN_13 ((uint8_t)0x0DU) /*!< GPIO event pin 13 */ +#define GPIO_EVENT_PIN_14 ((uint8_t)0x0EU) /*!< GPIO event pin 14 */ +#define GPIO_EVENT_PIN_15 ((uint8_t)0x0FU) /*!< GPIO event pin 15 */ + +/* GPIO output pin source definitions */ +#define GPIO_PIN_SOURCE_0 ((uint8_t)0x00U) /*!< GPIO pin source 0 */ +#define GPIO_PIN_SOURCE_1 ((uint8_t)0x01U) /*!< GPIO pin source 1 */ +#define GPIO_PIN_SOURCE_2 ((uint8_t)0x02U) /*!< GPIO pin source 2 */ +#define GPIO_PIN_SOURCE_3 ((uint8_t)0x03U) /*!< GPIO pin source 3 */ +#define GPIO_PIN_SOURCE_4 ((uint8_t)0x04U) /*!< GPIO pin source 4 */ +#define GPIO_PIN_SOURCE_5 ((uint8_t)0x05U) /*!< GPIO pin source 5 */ +#define GPIO_PIN_SOURCE_6 ((uint8_t)0x06U) /*!< GPIO pin source 6 */ +#define GPIO_PIN_SOURCE_7 ((uint8_t)0x07U) /*!< GPIO pin source 7 */ +#define GPIO_PIN_SOURCE_8 ((uint8_t)0x08U) /*!< GPIO pin source 8 */ +#define GPIO_PIN_SOURCE_9 ((uint8_t)0x09U) /*!< GPIO pin source 9 */ +#define GPIO_PIN_SOURCE_10 ((uint8_t)0x0AU) /*!< GPIO pin source 10 */ +#define GPIO_PIN_SOURCE_11 ((uint8_t)0x0BU) /*!< GPIO pin source 11 */ +#define GPIO_PIN_SOURCE_12 ((uint8_t)0x0CU) /*!< GPIO pin source 12 */ +#define GPIO_PIN_SOURCE_13 ((uint8_t)0x0DU) /*!< GPIO pin source 13 */ +#define GPIO_PIN_SOURCE_14 ((uint8_t)0x0EU) /*!< GPIO pin source 14 */ +#define GPIO_PIN_SOURCE_15 ((uint8_t)0x0FU) /*!< GPIO pin source 15 */ + +/* GPIO pin definitions */ +#define GPIO_PIN_0 BIT(0) /*!< GPIO pin 0 */ +#define GPIO_PIN_1 BIT(1) /*!< GPIO pin 1 */ +#define GPIO_PIN_2 BIT(2) /*!< GPIO pin 2 */ +#define GPIO_PIN_3 BIT(3) /*!< GPIO pin 3 */ +#define GPIO_PIN_4 BIT(4) /*!< GPIO pin 4 */ +#define GPIO_PIN_5 BIT(5) /*!< GPIO pin 5 */ +#define GPIO_PIN_6 BIT(6) /*!< GPIO pin 6 */ +#define GPIO_PIN_7 BIT(7) /*!< GPIO pin 7 */ +#define GPIO_PIN_8 BIT(8) /*!< GPIO pin 8 */ +#define GPIO_PIN_9 BIT(9) /*!< GPIO pin 9 */ +#define GPIO_PIN_10 BIT(10) /*!< GPIO pin 10 */ +#define GPIO_PIN_11 BIT(11) /*!< GPIO pin 11 */ +#define GPIO_PIN_12 BIT(12) /*!< GPIO pin 12 */ +#define GPIO_PIN_13 BIT(13) /*!< GPIO pin 13 */ +#define GPIO_PIN_14 BIT(14) /*!< GPIO pin 14 */ +#define GPIO_PIN_15 BIT(15) /*!< GPIO pin 15 */ +#define GPIO_PIN_ALL BITS(0, 15) /*!< GPIO pin all */ + +/* GPIO remap definitions */ +#define GPIO_SPI0_REMAP ((uint32_t)0x00000001U) /*!< SPI0 remapping */ +#define GPIO_I2C0_REMAP ((uint32_t)0x00000002U) /*!< I2C0 remapping */ +#define GPIO_USART0_REMAP ((uint32_t)0x00000004U) /*!< USART0 remapping */ +#define GPIO_USART1_REMAP ((uint32_t)0x00000008U) /*!< USART1 remapping */ +#define GPIO_USART2_PARTIAL_REMAP ((uint32_t)0x00140010U) /*!< USART2 partial remapping */ +#define GPIO_USART2_FULL_REMAP ((uint32_t)0x00140030U) /*!< USART2 full remapping */ +#define GPIO_TIMER0_PARTIAL_REMAP ((uint32_t)0x00160040U) /*!< TIMER0 partial remapping */ +#define GPIO_TIMER0_FULL_REMAP ((uint32_t)0x001600C0U) /*!< TIMER0 full remapping */ +#define GPIO_TIMER1_PARTIAL_REMAP0 ((uint32_t)0x00180100U) /*!< TIMER1 partial remapping */ +#define GPIO_TIMER1_PARTIAL_REMAP1 ((uint32_t)0x00180200U) /*!< TIMER1 partial remapping */ +#define GPIO_TIMER1_FULL_REMAP ((uint32_t)0x00180300U) /*!< TIMER1 full remapping */ +#define GPIO_TIMER2_PARTIAL_REMAP ((uint32_t)0x001A0800U) /*!< TIMER2 partial remapping */ +#define GPIO_TIMER2_FULL_REMAP ((uint32_t)0x001A0C00U) /*!< TIMER2 full remapping */ +#define GPIO_TIMER3_REMAP ((uint32_t)0x00001000U) /*!< TIMER3 remapping */ +#define GPIO_CAN0_PARTIAL_REMAP ((uint32_t)0x001D4000U) /*!< CAN0 partial remapping */ +#define GPIO_CAN0_FULL_REMAP ((uint32_t)0x001D6000U) /*!< CAN0 full remapping */ +#define GPIO_PD01_REMAP ((uint32_t)0x00008000U) /*!< PD01 remapping */ +#define GPIO_TIMER4CH3_IREMAP ((uint32_t)0x00200001U) /*!< TIMER4 channel3 internal remapping */ +#define GPIO_CAN1_REMAP ((uint32_t)0x00200040U) /*!< CAN1 remapping */ +#define GPIO_SWJ_NONJTRST_REMAP ((uint32_t)0x00300100U) /*!< JTAG-DP,but without NJTRST */ +#define GPIO_SWJ_DISABLE_REMAP ((uint32_t)0x00300200U) /*!< JTAG-DP disabled */ +#define GPIO_SPI2_REMAP ((uint32_t)0x00201100U) /*!< SPI2 remapping */ +#define GPIO_TIMER1ITI1_REMAP ((uint32_t)0x00202000U) /*!< TIMER1 internal trigger 1 remapping */ +#define GPIO_EXMC_NADV_REMAP ((uint32_t)0x80000400U) /*!< EXMC_NADV connect/disconnect */ + +/* function declarations */ +/* reset GPIO port */ +void gpio_deinit(uint32_t gpio_periph); +/* reset alternate function I/O(AFIO) */ +void gpio_afio_deinit(void); +/* GPIO parameter initialization */ +void gpio_init(uint32_t gpio_periph,uint32_t mode,uint32_t speed,uint32_t pin); + +/* set GPIO pin bit */ +void gpio_bit_set(uint32_t gpio_periph, uint32_t pin); +/* reset GPIO pin bit */ +void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin); +/* write data to the specified GPIO pin */ +void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value); +/* write data to the specified GPIO port */ +void gpio_port_write(uint32_t gpio_periph, uint16_t data); + +/* get GPIO pin input status */ +FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin); +/* get GPIO port input status */ +uint16_t gpio_input_port_get(uint32_t gpio_periph); +/* get GPIO pin output status */ +FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin); +/* get GPIO port output status */ +uint16_t gpio_output_port_get(uint32_t gpio_periph); + +/* configure GPIO pin remap */ +void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue); + +/* select GPIO pin exti sources */ +void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin); +/* configure GPIO pin event output */ +void gpio_event_output_config(uint8_t output_port, uint8_t output_pin); +/* enable GPIO pin event output */ +void gpio_event_output_enable(void); +/* disable GPIO pin event output */ +void gpio_event_output_disable(void); + +/* lock GPIO pin bit */ +void gpio_pin_lock(uint32_t gpio_periph, uint32_t pin); + +#endif /* GD32VF103_GPIO_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h new file mode 100644 index 0000000..c06a3e5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_i2c.h @@ -0,0 +1,343 @@ +/*! + \file gd32vf103_i2c.h + \brief definitions for the I2C + + \version 2019-06-05, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_I2C_H +#define GD32VF103_I2C_H + +#include "gd32vf103.h" + +/* I2Cx(x=0,1) definitions */ +#define I2C0 I2C_BASE /*!< I2C0 base address */ +#define I2C1 (I2C_BASE + 0x00000400U) /*!< I2C1 base address */ + +/* registers definitions */ +#define I2C_CTL0(i2cx) REG32((i2cx) + 0x00U) /*!< I2C control register 0 */ +#define I2C_CTL1(i2cx) REG32((i2cx) + 0x04U) /*!< I2C control register 1 */ +#define I2C_SADDR0(i2cx) REG32((i2cx) + 0x08U) /*!< I2C slave address register 0*/ +#define I2C_SADDR1(i2cx) REG32((i2cx) + 0x0CU) /*!< I2C slave address register */ +#define I2C_DATA(i2cx) REG32((i2cx) + 0x10U) /*!< I2C transfer buffer register */ +#define I2C_STAT0(i2cx) REG32((i2cx) + 0x14U) /*!< I2C transfer status register 0 */ +#define I2C_STAT1(i2cx) REG32((i2cx) + 0x18U) /*!< I2C transfer status register */ +#define I2C_CKCFG(i2cx) REG32((i2cx) + 0x1CU) /*!< I2C clock configure register */ +#define I2C_RT(i2cx) REG32((i2cx) + 0x20U) /*!< I2C rise time register */ +#define I2C_FMPCFG(i2cx) REG32((i2cx) + 0x90U) /*!< I2C fast-mode-plus configure register */ +/* bits definitions */ +/* I2Cx_CTL0 */ +#define I2C_CTL0_I2CEN BIT(0) /*!< peripheral enable */ +#define I2C_CTL0_SMBEN BIT(1) /*!< SMBus mode */ +#define I2C_CTL0_SMBSEL BIT(3) /*!< SMBus type */ +#define I2C_CTL0_ARPEN BIT(4) /*!< ARP enable */ +#define I2C_CTL0_PECEN BIT(5) /*!< PEC enable */ +#define I2C_CTL0_GCEN BIT(6) /*!< general call enable */ +#define I2C_CTL0_SS BIT(7) /*!< clock stretching disable (slave mode) */ +#define I2C_CTL0_START BIT(8) /*!< start generation */ +#define I2C_CTL0_STOP BIT(9) /*!< stop generation */ +#define I2C_CTL0_ACKEN BIT(10) /*!< acknowledge enable */ +#define I2C_CTL0_POAP BIT(11) /*!< acknowledge/PEC position (for data reception) */ +#define I2C_CTL0_PECTRANS BIT(12) /*!< packet error checking */ +#define I2C_CTL0_SALT BIT(13) /*!< SMBus alert */ +#define I2C_CTL0_SRESET BIT(15) /*!< software reset */ + +/* I2Cx_CTL1 */ +#define I2C_CTL1_I2CCLK BITS(0,5) /*!< I2CCLK[5:0] bits (peripheral clock frequency) */ +#define I2C_CTL1_ERRIE BIT(8) /*!< error interrupt enable */ +#define I2C_CTL1_EVIE BIT(9) /*!< event interrupt enable */ +#define I2C_CTL1_BUFIE BIT(10) /*!< buffer interrupt enable */ +#define I2C_CTL1_DMAON BIT(11) /*!< DMA requests enable */ +#define I2C_CTL1_DMALST BIT(12) /*!< DMA last transfer */ + +/* I2Cx_SADDR0 */ +#define I2C_SADDR0_ADDRESS0 BIT(0) /*!< bit 0 of a 10-bit address */ +#define I2C_SADDR0_ADDRESS BITS(1,7) /*!< 7-bit address or bits 7:1 of a 10-bit address */ +#define I2C_SADDR0_ADDRESS_H BITS(8,9) /*!< highest two bits of a 10-bit address */ +#define I2C_SADDR0_ADDFORMAT BIT(15) /*!< address mode for the I2C slave */ + +/* I2Cx_SADDR1 */ +#define I2C_SADDR1_DUADEN BIT(0) /*!< aual-address mode switch */ +#define I2C_SADDR1_ADDRESS2 BITS(1,7) /*!< second I2C address for the slave in dual-address mode */ + +/* I2Cx_DATA */ +#define I2C_DATA_TRB BITS(0,7) /*!< 8-bit data register */ + +/* I2Cx_STAT0 */ +#define I2C_STAT0_SBSEND BIT(0) /*!< start bit (master mode) */ +#define I2C_STAT0_ADDSEND BIT(1) /*!< address sent (master mode)/matched (slave mode) */ +#define I2C_STAT0_BTC BIT(2) /*!< byte transfer finished */ +#define I2C_STAT0_ADD10SEND BIT(3) /*!< 10-bit header sent (master mode) */ +#define I2C_STAT0_STPDET BIT(4) /*!< stop detection (slave mode) */ +#define I2C_STAT0_RBNE BIT(6) /*!< data register not empty (receivers) */ +#define I2C_STAT0_TBE BIT(7) /*!< data register empty (transmitters) */ +#define I2C_STAT0_BERR BIT(8) /*!< bus error */ +#define I2C_STAT0_LOSTARB BIT(9) /*!< arbitration lost (master mode) */ +#define I2C_STAT0_AERR BIT(10) /*!< acknowledge failure */ +#define I2C_STAT0_OUERR BIT(11) /*!< overrun/underrun */ +#define I2C_STAT0_PECERR BIT(12) /*!< PEC error in reception */ +#define I2C_STAT0_SMBTO BIT(14) /*!< timeout signal in SMBus mode */ +#define I2C_STAT0_SMBALT BIT(15) /*!< SMBus alert status */ + +/* I2Cx_STAT1 */ +#define I2C_STAT1_MASTER BIT(0) /*!< master/slave */ +#define I2C_STAT1_I2CBSY BIT(1) /*!< bus busy */ +#define I2C_STAT1_TR BIT(2) /*!< transmitter/receiver */ +#define I2C_STAT1_RXGC BIT(4) /*!< general call address (slave mode) */ +#define I2C_STAT1_DEFSMB BIT(5) /*!< SMBus device default address (slave mode) */ +#define I2C_STAT1_HSTSMB BIT(6) /*!< SMBus host header (slave mode) */ +#define I2C_STAT1_DUMODF BIT(7) /*!< dual flag (slave mode) */ +#define I2C_STAT1_PECV BITS(8,15) /*!< packet error checking value */ + +/* I2Cx_CKCFG */ +#define I2C_CKCFG_CLKC BITS(0,11) /*!< clock control register in fast/standard mode (master mode) */ +#define I2C_CKCFG_DTCY BIT(14) /*!< fast mode duty cycle */ +#define I2C_CKCFG_FAST BIT(15) /*!< I2C speed selection in master mode */ + +/* I2Cx_RT */ +#define I2C_RT_RISETIME BITS(0,5) /*!< maximum rise time in fast/standard mode (Master mode) */ + +/* I2Cx_FMPCFG */ +#define I2C_FMPCFG_FMPEN BIT(0) /*!< fast mode plus enable bit */ + +/* constants definitions */ +/* define the I2C bit position and its register index offset */ +#define I2C_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define I2C_REG_VAL(i2cx, offset) (REG32((i2cx) + (((uint32_t)(offset) & 0xFFFFU) >> 6))) +#define I2C_BIT_POS(val) ((uint32_t)(val) & 0x1FU) +#define I2C_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2) (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\ + | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))) +#define I2C_REG_VAL2(i2cx, offset) (REG32((i2cx) + ((uint32_t)(offset) >> 22))) +#define I2C_BIT_POS2(val) (((uint32_t)(val) & 0x1F0000U) >> 16) + +/* register offset */ +#define I2C_CTL1_REG_OFFSET 0x04U /*!< CTL1 register offset */ +#define I2C_STAT0_REG_OFFSET 0x14U /*!< STAT0 register offset */ +#define I2C_STAT1_REG_OFFSET 0x18U /*!< STAT1 register offset */ + +/* I2C flags */ +typedef enum { + /* flags in STAT0 register */ + I2C_FLAG_SBSEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 0U), /*!< start condition sent out in master mode */ + I2C_FLAG_ADDSEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 1U), /*!< address is sent in master mode or received and matches in slave mode */ + I2C_FLAG_BTC = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 2U), /*!< byte transmission finishes */ + I2C_FLAG_ADD10SEND = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 3U), /*!< header of 10-bit address is sent in master mode */ + I2C_FLAG_STPDET = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 4U), /*!< stop condition detected in slave mode */ + I2C_FLAG_RBNE = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 6U), /*!< I2C_DATA is not Empty during receiving */ + I2C_FLAG_TBE = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 7U), /*!< I2C_DATA is empty during transmitting */ + I2C_FLAG_BERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 8U), /*!< a bus error occurs indication a unexpected start or stop condition on I2C bus */ + I2C_FLAG_LOSTARB = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 9U), /*!< arbitration lost in master mode */ + I2C_FLAG_AERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 10U), /*!< acknowledge error */ + I2C_FLAG_OUERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 11U), /*!< over-run or under-run situation occurs in slave mode */ + I2C_FLAG_PECERR = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 12U), /*!< PEC error when receiving data */ + I2C_FLAG_SMBTO = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 14U), /*!< timeout signal in SMBus mode */ + I2C_FLAG_SMBALT = I2C_REGIDX_BIT(I2C_STAT0_REG_OFFSET, 15U), /*!< SMBus alert status */ + /* flags in STAT1 register */ + I2C_FLAG_MASTER = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 0U), /*!< a flag indicating whether I2C block is in master or slave mode */ + I2C_FLAG_I2CBSY = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 1U), /*!< busy flag */ + I2C_FLAG_TR = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 2U), /*!< whether the I2C is a transmitter or a receiver */ + I2C_FLAG_RXGC = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 4U), /*!< general call address (00h) received */ + I2C_FLAG_DEFSMB = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 5U), /*!< default address of SMBus device */ + I2C_FLAG_HSTSMB = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 6U), /*!< SMBus host header detected in slave mode */ + I2C_FLAG_DUMODF = I2C_REGIDX_BIT(I2C_STAT1_REG_OFFSET, 7U), /*!< dual flag in slave mode indicating which address is matched in dual-address mode */ +} i2c_flag_enum; + +/* I2C interrupt flags */ +typedef enum { + /* interrupt flags in CTL1 register */ + I2C_INT_FLAG_SBSEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U,I2C_STAT0_REG_OFFSET, 0U), /*!< start condition sent out in master mode interrupt flag */ + I2C_INT_FLAG_ADDSEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U,I2C_STAT0_REG_OFFSET, 1U), /*!< address is sent in master mode or received and matches in slave mode interrupt flag */ + I2C_INT_FLAG_BTC = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U,I2C_STAT0_REG_OFFSET, 2U), /*!< byte transmission finishes */ + I2C_INT_FLAG_ADD10SEND = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U,I2C_STAT0_REG_OFFSET, 3U), /*!< header of 10-bit address is sent in master mode interrupt flag */ + I2C_INT_FLAG_STPDET = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U,I2C_STAT0_REG_OFFSET, 4U), /*!< stop condition detected in slave mode interrupt flag */ + I2C_INT_FLAG_RBNE = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U,I2C_STAT0_REG_OFFSET, 6U), /*!< I2C_DATA is not Empty during receiving interrupt flag */ + I2C_INT_FLAG_TBE = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 9U,I2C_STAT0_REG_OFFSET, 7U), /*!< I2C_DATA is empty during transmitting interrupt flag */ + I2C_INT_FLAG_BERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U,I2C_STAT0_REG_OFFSET, 8U), /*!< a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag */ + I2C_INT_FLAG_LOSTARB = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U,I2C_STAT0_REG_OFFSET, 9U), /*!< arbitration lost in master mode interrupt flag */ + I2C_INT_FLAG_AERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U,I2C_STAT0_REG_OFFSET, 10U), /*!< acknowledge error interrupt flag */ + I2C_INT_FLAG_OUERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U,I2C_STAT0_REG_OFFSET, 11U), /*!< over-run or under-run situation occurs in slave mode interrupt flag */ + I2C_INT_FLAG_PECERR = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U,I2C_STAT0_REG_OFFSET, 12U), /*!< PEC error when receiving data interrupt flag */ + I2C_INT_FLAG_SMBTO = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U,I2C_STAT0_REG_OFFSET, 14U), /*!< timeout signal in SMBus mode interrupt flag */ + I2C_INT_FLAG_SMBALT = I2C_REGIDX_BIT2(I2C_CTL1_REG_OFFSET, 8U,I2C_STAT0_REG_OFFSET, 15U), /*!< SMBus Alert status interrupt flag */ +} i2c_interrupt_flag_enum; + +/* I2C interrupt enable or disable */ +typedef enum { + /* interrupt in CTL1 register */ + I2C_INT_ERR = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 8U), /*!< error interrupt enable */ + I2C_INT_EV = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 9U), /*!< event interrupt enable */ + I2C_INT_BUF = I2C_REGIDX_BIT(I2C_CTL1_REG_OFFSET, 10U), /*!< buffer interrupt enable */ +} i2c_interrupt_enum; + +/* SMBus/I2C mode switch and SMBus type selection */ +#define I2C_I2CMODE_ENABLE ((uint32_t)0x00000000U) /*!< I2C mode */ +#define I2C_SMBUSMODE_ENABLE I2C_CTL0_SMBEN /*!< SMBus mode */ + +/* SMBus/I2C mode switch and SMBus type selection */ +#define I2C_SMBUS_DEVICE ((uint32_t)0x00000000U) /*!< SMBus mode device type */ +#define I2C_SMBUS_HOST I2C_CTL0_SMBSEL /*!< SMBus mode host type */ + +/* I2C transfer direction */ +#define I2C_RECEIVER ((uint32_t)0x00000001U) /*!< receiver */ +#define I2C_TRANSMITTER ((uint32_t)0xFFFFFFFEU) /*!< transmitter */ + +/* whether or not to send an ACK */ +#define I2C_ACK_DISABLE ((uint32_t)0x00000000U) /*!< ACK will be not sent */ +#define I2C_ACK_ENABLE ((uint32_t)0x00000001U) /*!< ACK will be sent */ + +/* I2C POAP position*/ +#define I2C_ACKPOS_NEXT ((uint32_t)0x00000000U) /*!< ACKEN bit decides whether or not to send ACK for the next byte */ +#define I2C_ACKPOS_CURRENT ((uint32_t)0x00000001U) /*!< ACKEN bit decides whether or not to send ACK or not for the current byte */ + +/* I2C dual-address mode switch */ +#define I2C_DUADEN_DISABLE ((uint32_t)0x00000000U) /*!< dual-address mode disabled */ +#define I2C_DUADEN_ENABLE ((uint32_t)0x00000001U) /*!< dual-address mode enabled */ + +/* whether or not to stretch SCL low */ +#define I2C_SCLSTRETCH_ENABLE ((uint32_t)0x00000000U) /*!< SCL stretching is enabled */ +#define I2C_SCLSTRETCH_DISABLE I2C_CTL0_SS /*!< SCL stretching is disabled */ + +/* whether or not to response to a general call */ +#define I2C_GCEN_ENABLE I2C_CTL0_GCEN /*!< slave will response to a general call */ +#define I2C_GCEN_DISABLE ((uint32_t)0x00000000U) /*!< slave will not response to a general call */ + +/* software reset I2C */ +#define I2C_SRESET_SET I2C_CTL0_SRESET /*!< I2C is under reset */ +#define I2C_SRESET_RESET ((uint32_t)0x00000000U) /*!< I2C is not under reset */ + +/* I2C DMA mode configure */ +/* DMA mode switch */ +#define I2C_DMA_ON I2C_CTL1_DMAON /*!< DMA mode enabled */ +#define I2C_DMA_OFF ((uint32_t)0x00000000U) /*!< DMA mode disabled */ + +/* flag indicating DMA last transfer */ +#define I2C_DMALST_ON I2C_CTL1_DMALST /*!< next DMA EOT is the last transfer */ +#define I2C_DMALST_OFF ((uint32_t)0x00000000U) /*!< next DMA EOT is not the last transfer */ + +/* I2C PEC configure */ +/* PEC enable */ +#define I2C_PEC_ENABLE I2C_CTL0_PECEN /*!< PEC calculation on */ +#define I2C_PEC_DISABLE ((uint32_t)0x00000000U) /*!< PEC calculation off */ + +/* PEC transfer */ +#define I2C_PECTRANS_ENABLE I2C_CTL0_PECTRANS /*!< transfer PEC */ +#define I2C_PECTRANS_DISABLE ((uint32_t)0x00000000U) /*!< not transfer PEC value */ + +/* I2C SMBus configure */ +/* issue or not alert through SMBA pin */ +#define I2C_SALTSEND_ENABLE I2C_CTL0_SALT /*!< issue alert through SMBA pin */ +#define I2C_SALTSEND_DISABLE ((uint32_t)0x00000000U) /*!< not issue alert through SMBA */ + +/* ARP protocol in SMBus switch */ +#define I2C_ARP_ENABLE I2C_CTL0_ARPEN /*!< ARP enable */ +#define I2C_ARP_DISABLE ((uint32_t)0x00000000U) /*!< ARP disable */ + +/* transmit I2C data */ +#define DATA_TRANS(regval) (BITS(0,7) & ((uint32_t)(regval) << 0)) + +/* receive I2C data */ +#define DATA_RECV(regval) GET_BITS((uint32_t)(regval), 0, 7) + +/* I2C duty cycle in fast mode */ +#define I2C_DTCY_2 ((uint32_t)0x00000000U) /*!< I2C fast mode Tlow/Thigh = 2 */ +#define I2C_DTCY_16_9 I2C_CKCFG_DTCY /*!< I2C fast mode Tlow/Thigh = 16/9 */ + +/* address mode for the I2C slave */ +#define I2C_ADDFORMAT_7BITS ((uint32_t)0x00000000U) /*!< address:7 bits */ +#define I2C_ADDFORMAT_10BITS I2C_SADDR0_ADDFORMAT /*!< address:10 bits */ + +/* function declarations */ +/* reset I2C */ +void i2c_deinit(uint32_t i2c_periph); +/* configure I2C clock */ +void i2c_clock_config(uint32_t i2c_periph, uint32_t clkspeed, uint32_t dutycyc); +/* configure I2C address */ +void i2c_mode_addr_config(uint32_t i2c_periph, uint32_t mode,uint32_t addformat, uint32_t addr); +/* SMBus type selection */ +void i2c_smbus_type_config(uint32_t i2c_periph, uint32_t type); +/* whether or not to send an ACK */ +void i2c_ack_config(uint32_t i2c_periph, uint32_t ack); +/* configure I2C POAP position */ +void i2c_ackpos_config(uint32_t i2c_periph, uint32_t pos); +/* master sends slave address */ +void i2c_master_addressing(uint32_t i2c_periph, uint32_t addr,uint32_t trandirection); +/* enable dual-address mode */ +void i2c_dualaddr_enable(uint32_t i2c_periph, uint32_t dualaddr); +/* disable dual-address mode */ +void i2c_dualaddr_disable(uint32_t i2c_periph); +/* enable I2C */ +void i2c_enable(uint32_t i2c_periph); +/* disable I2C */ +void i2c_disable(uint32_t i2c_periph); + +/* generate a START condition on I2C bus */ +void i2c_start_on_bus(uint32_t i2c_periph); +/* generate a STOP condition on I2C bus */ +void i2c_stop_on_bus(uint32_t i2c_periph); +/* I2C transmit data function */ +void i2c_data_transmit(uint32_t i2c_periph, uint8_t data); +/* I2C receive data function */ +uint8_t i2c_data_receive(uint32_t i2c_periph); +/* enable I2C DMA mode */ +void i2c_dma_enable(uint32_t i2c_periph, uint32_t dmastate); +/* configure whether next DMA EOT is DMA last transfer or not */ +void i2c_dma_last_transfer_config(uint32_t i2c_periph, uint32_t dmalast); +/* whether to stretch SCL low when data is not ready in slave mode */ +void i2c_stretch_scl_low_config(uint32_t i2c_periph, uint32_t stretchpara); +/* whether or not to response to a general call */ +void i2c_slave_response_to_gcall_config(uint32_t i2c_periph, uint32_t gcallpara); +/* software reset I2C */ +void i2c_software_reset_config(uint32_t i2c_periph, uint32_t sreset); + +/* I2C PEC calculation on or off */ +void i2c_pec_enable(uint32_t i2c_periph, uint32_t pecstate); +/* I2C whether to transfer PEC value */ +void i2c_pec_transfer_enable(uint32_t i2c_periph, uint32_t pecpara); +/* packet error checking value */ +uint8_t i2c_pec_value_get(uint32_t i2c_periph); +/* I2C issue alert through SMBA pin */ +void i2c_smbus_issue_alert(uint32_t i2c_periph, uint32_t smbuspara); +/* I2C ARP protocol in SMBus switch */ +void i2c_smbus_arp_enable(uint32_t i2c_periph, uint32_t arpstate); + +/* check I2C flag is set or not */ +FlagStatus i2c_flag_get(uint32_t i2c_periph, i2c_flag_enum flag); +/* clear I2C flag */ +void i2c_flag_clear(uint32_t i2c_periph, i2c_flag_enum flag); +/* enable I2C interrupt */ +void i2c_interrupt_enable(uint32_t i2c_periph, i2c_interrupt_enum interrupt); +/* disable I2C interrupt */ +void i2c_interrupt_disable(uint32_t i2c_periph, i2c_interrupt_enum interrupt); +/* check I2C interrupt flag */ +FlagStatus i2c_interrupt_flag_get(uint32_t i2c_periph,i2c_interrupt_flag_enum int_flag); +/* clear I2C interrupt flag */ +void i2c_interrupt_flag_clear(uint32_t i2c_periph,i2c_interrupt_flag_enum int_flag); + +#endif /* GD32VF103_I2C_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h new file mode 100644 index 0000000..bb36512 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_pmu.h @@ -0,0 +1,125 @@ +/*! + \file gd32vf103_pmu.h + \brief definitions for the PMU + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_PMU_H +#define GD32VF103_PMU_H + +#include "gd32vf103.h" + +/* PMU definitions */ +#define PMU PMU_BASE /*!< PMU base address */ + +/* registers definitions */ +#define PMU_CTL REG32((PMU) + 0x00U) /*!< PMU control register */ +#define PMU_CS REG32((PMU) + 0x04U) /*!< PMU control and status register */ + +/* bits definitions */ +/* PMU_CTL */ +#define PMU_CTL_LDOLP BIT(0) /*!< LDO low power mode */ +#define PMU_CTL_STBMOD BIT(1) /*!< standby mode */ +#define PMU_CTL_WURST BIT(2) /*!< wakeup flag reset */ +#define PMU_CTL_STBRST BIT(3) /*!< standby flag reset */ +#define PMU_CTL_LVDEN BIT(4) /*!< low voltage detector enable */ +#define PMU_CTL_LVDT BITS(5,7) /*!< low voltage detector threshold */ +#define PMU_CTL_BKPWEN BIT(8) /*!< backup domain write enable */ + +/* PMU_CS */ +#define PMU_CS_WUF BIT(0) /*!< wakeup flag */ +#define PMU_CS_STBF BIT(1) /*!< standby flag */ +#define PMU_CS_LVDF BIT(2) /*!< low voltage detector status flag */ +#define PMU_CS_WUPEN BIT(8) /*!< wakeup pin enable */ + +/* constants definitions */ +/* PMU low voltage detector threshold definitions */ +#define CTL_LVDT(regval) (BITS(5,7)&((uint32_t)(regval) << 5)) +#define PMU_LVDT_0 CTL_LVDT(0) /*!< voltage threshold is 2.2V */ +#define PMU_LVDT_1 CTL_LVDT(1) /*!< voltage threshold is 2.3V */ +#define PMU_LVDT_2 CTL_LVDT(2) /*!< voltage threshold is 2.4V */ +#define PMU_LVDT_3 CTL_LVDT(3) /*!< voltage threshold is 2.5V */ +#define PMU_LVDT_4 CTL_LVDT(4) /*!< voltage threshold is 2.6V */ +#define PMU_LVDT_5 CTL_LVDT(5) /*!< voltage threshold is 2.7V */ +#define PMU_LVDT_6 CTL_LVDT(6) /*!< voltage threshold is 2.8V */ +#define PMU_LVDT_7 CTL_LVDT(7) /*!< voltage threshold is 2.9V */ + +/* PMU flag definitions */ +#define PMU_FLAG_WAKEUP PMU_CS_WUF /*!< wakeup flag status */ +#define PMU_FLAG_STANDBY PMU_CS_STBF /*!< standby flag status */ +#define PMU_FLAG_LVD PMU_CS_LVDF /*!< lvd flag status */ + +/* PMU ldo definitions */ +#define PMU_LDO_NORMAL ((uint32_t)0x00000000U) /*!< LDO normal work when PMU enter deepsleep mode */ +#define PMU_LDO_LOWPOWER PMU_CTL_LDOLP /*!< LDO work at low power status when PMU enter deepsleep mode */ + +/* PMU flag reset definitions */ +#define PMU_FLAG_RESET_WAKEUP ((uint8_t)0x00U) /*!< wakeup flag reset */ +#define PMU_FLAG_RESET_STANDBY ((uint8_t)0x01U) /*!< standby flag reset */ + +/* PMU command constants definitions */ +#define WFI_CMD ((uint8_t)0x00U) /*!< use WFI command */ +#define WFE_CMD ((uint8_t)0x01U) /*!< use WFE command */ + +/* function declarations */ +/* reset PMU registers */ +void pmu_deinit(void); + +/* select low voltage detector threshold */ +void pmu_lvd_select(uint32_t lvdt_n); +/* disable PMU lvd */ +void pmu_lvd_disable(void); + +/* set PMU mode */ +/* PMU work at sleep mode */ +void pmu_to_sleepmode(uint8_t sleepmodecmd); +/* PMU work at deepsleep mode */ +void pmu_to_deepsleepmode(uint32_t ldo, uint8_t deepsleepmodecmd); +/* PMU work at standby mode */ +void pmu_to_standbymode(uint8_t standbymodecmd); +/* enable PMU wakeup pin */ +void pmu_wakeup_pin_enable(void); +/* disable PMU wakeup pin */ +void pmu_wakeup_pin_disable(void); + +/* backup related functions */ +/* enable write access to the registers in backup domain */ +void pmu_backup_write_enable(void); +/* disable write access to the registers in backup domain */ +void pmu_backup_write_disable(void); + +/* flag functions */ +/* get flag state */ +FlagStatus pmu_flag_get(uint32_t flag); +/* clear flag bit */ +void pmu_flag_clear(uint32_t flag_reset); + +#endif /* GD32VF103_PMU_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h new file mode 100644 index 0000000..c20e1a0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rcu.h @@ -0,0 +1,720 @@ +/*! + \file gd32vf103_rcu.h + \brief definitions for the RCU + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_RCU_H +#define GD32VF103_RCU_H + +#include "gd32vf103.h" + +/* RCU definitions */ +#define RCU RCU_BASE + +/* registers definitions */ + +#define RCU_CTL REG32(RCU + 0x00U) /*!< control register */ +#define RCU_CFG0 REG32(RCU + 0x04U) /*!< clock configuration register 0 */ +#define RCU_INT REG32(RCU + 0x08U) /*!< clock interrupt register */ +#define RCU_APB2RST REG32(RCU + 0x0CU) /*!< APB2 reset register */ +#define RCU_APB1RST REG32(RCU + 0x10U) /*!< APB1 reset register */ +#define RCU_AHBEN REG32(RCU + 0x14U) /*!< AHB1 enable register */ +#define RCU_APB2EN REG32(RCU + 0x18U) /*!< APB2 enable register */ +#define RCU_APB1EN REG32(RCU + 0x1CU) /*!< APB1 enable register */ +#define RCU_BDCTL REG32(RCU + 0x20U) /*!< backup domain control register */ +#define RCU_RSTSCK REG32(RCU + 0x24U) /*!< reset source / clock register */ +#define RCU_AHBRST REG32(RCU + 0x28U) /*!< AHB reset register */ +#define RCU_CFG1 REG32(RCU + 0x2CU) /*!< clock configuration register 1 */ +#define RCU_DSV REG32(RCU + 0x34U) /*!< deep-sleep mode voltage register */ + + +/* bits definitions */ +/* RCU_CTL */ +#define RCU_CTL_IRC8MEN BIT(0) /*!< internal high speed oscillator enable */ +#define RCU_CTL_IRC8MSTB BIT(1) /*!< IRC8M high speed internal oscillator stabilization flag */ +#define RCU_CTL_IRC8MADJ BITS(3,7) /*!< high speed internal oscillator clock trim adjust value */ +#define RCU_CTL_IRC8MCALIB BITS(8,15) /*!< high speed internal oscillator calibration value register */ +#define RCU_CTL_HXTALEN BIT(16) /*!< external high speed oscillator enable */ +#define RCU_CTL_HXTALSTB BIT(17) /*!< external crystal oscillator clock stabilization flag */ +#define RCU_CTL_HXTALBPS BIT(18) /*!< external crystal oscillator clock bypass mode enable */ +#define RCU_CTL_CKMEN BIT(19) /*!< HXTAL clock monitor enable */ +#define RCU_CTL_PLLEN BIT(24) /*!< PLL enable */ +#define RCU_CTL_PLLSTB BIT(25) /*!< PLL clock stabilization flag */ +#define RCU_CTL_PLL1EN BIT(26) /*!< PLL1 enable */ +#define RCU_CTL_PLL1STB BIT(27) /*!< PLL1 clock stabilization flag */ +#define RCU_CTL_PLL2EN BIT(28) /*!< PLL2 enable */ +#define RCU_CTL_PLL2STB BIT(29) /*!< PLL2 clock stabilization flag */ + + +#define RCU_CFG0_SCS BITS(0,1) /*!< system clock switch */ +#define RCU_CFG0_SCSS BITS(2,3) /*!< system clock switch status */ +#define RCU_CFG0_AHBPSC BITS(4,7) /*!< AHB prescaler selection */ +#define RCU_CFG0_APB1PSC BITS(8,10) /*!< APB1 prescaler selection */ +#define RCU_CFG0_APB2PSC BITS(11,13) /*!< APB2 prescaler selection */ +#define RCU_CFG0_ADCPSC BITS(14,15) /*!< ADC prescaler selection */ +#define RCU_CFG0_PLLSEL BIT(16) /*!< PLL clock source selection */ +#define RCU_CFG0_PREDV0_LSB BIT(17) /*!< the LSB of PREDV0 division factor */ +#define RCU_CFG0_PLLMF BITS(18,21) /*!< PLL clock multiplication factor */ +#define RCU_CFG0_USBFSPSC BITS(22,23) /*!< USBFS clock prescaler selection */ +#define RCU_CFG0_CKOUT0SEL BITS(24,27) /*!< CKOUT0 clock source selection */ +#define RCU_CFG0_ADCPSC_2 BIT(28) /*!< bit 2 of ADCPSC */ +#define RCU_CFG0_PLLMF_4 BIT(29) /*!< bit 4 of PLLMF */ + +/* RCU_INT */ +#define RCU_INT_IRC40KSTBIF BIT(0) /*!< IRC40K stabilization interrupt flag */ +#define RCU_INT_LXTALSTBIF BIT(1) /*!< LXTAL stabilization interrupt flag */ +#define RCU_INT_IRC8MSTBIF BIT(2) /*!< IRC8M stabilization interrupt flag */ +#define RCU_INT_HXTALSTBIF BIT(3) /*!< HXTAL stabilization interrupt flag */ +#define RCU_INT_PLLSTBIF BIT(4) /*!< PLL stabilization interrupt flag */ +#define RCU_INT_PLL1STBIF BIT(5) /*!< PLL1 stabilization interrupt flag */ +#define RCU_INT_PLL2STBIF BIT(6) /*!< PLL2 stabilization interrupt flag */ +#define RCU_INT_CKMIF BIT(7) /*!< HXTAL clock stuck interrupt flag */ +#define RCU_INT_IRC40KSTBIE BIT(8) /*!< IRC40K stabilization interrupt enable */ +#define RCU_INT_LXTALSTBIE BIT(9) /*!< LXTAL stabilization interrupt enable */ +#define RCU_INT_IRC8MSTBIE BIT(10) /*!< IRC8M stabilization interrupt enable */ +#define RCU_INT_HXTALSTBIE BIT(11) /*!< HXTAL stabilization interrupt enable */ +#define RCU_INT_PLLSTBIE BIT(12) /*!< PLL stabilization interrupt enable */ +#define RCU_INT_PLL1STBIE BIT(13) /*!< PLL1 stabilization interrupt enable */ +#define RCU_INT_PLL2STBIE BIT(14) /*!< PLL2 stabilization interrupt enable */ +#define RCU_INT_IRC40KSTBIC BIT(16) /*!< IRC40K stabilization interrupt clear */ +#define RCU_INT_LXTALSTBIC BIT(17) /*!< LXTAL stabilization interrupt clear */ +#define RCU_INT_IRC8MSTBIC BIT(18) /*!< IRC8M stabilization interrupt clear */ +#define RCU_INT_HXTALSTBIC BIT(19) /*!< HXTAL stabilization interrupt clear */ +#define RCU_INT_PLLSTBIC BIT(20) /*!< PLL stabilization interrupt clear */ +#define RCU_INT_PLL1STBIC BIT(21) /*!< PLL1 stabilization interrupt clear */ +#define RCU_INT_PLL2STBIC BIT(22) /*!< PLL2 stabilization interrupt clear */ +#define RCU_INT_CKMIC BIT(23) /*!< HXTAL clock stuck interrupt clear */ + +/* RCU_APB2RST */ +#define RCU_APB2RST_AFRST BIT(0) /*!< alternate function I/O reset */ +#define RCU_APB2RST_PARST BIT(2) /*!< GPIO port A reset */ +#define RCU_APB2RST_PBRST BIT(3) /*!< GPIO port B reset */ +#define RCU_APB2RST_PCRST BIT(4) /*!< GPIO port C reset */ +#define RCU_APB2RST_PDRST BIT(5) /*!< GPIO port D reset */ +#define RCU_APB2RST_PERST BIT(6) /*!< GPIO port E reset */ +#define RCU_APB2RST_ADC0RST BIT(9) /*!< ADC0 reset */ +#define RCU_APB2RST_ADC1RST BIT(10) /*!< ADC1 reset */ +#define RCU_APB2RST_TIMER0RST BIT(11) /*!< TIMER0 reset */ +#define RCU_APB2RST_SPI0RST BIT(12) /*!< SPI0 reset */ +#define RCU_APB2RST_USART0RST BIT(14) /*!< USART0 reset */ + +/* RCU_APB1RST */ +#define RCU_APB1RST_TIMER1RST BIT(0) /*!< TIMER1 reset */ +#define RCU_APB1RST_TIMER2RST BIT(1) /*!< TIMER2 reset */ +#define RCU_APB1RST_TIMER3RST BIT(2) /*!< TIMER3 reset */ +#define RCU_APB1RST_TIMER4RST BIT(3) /*!< TIMER4 reset */ +#define RCU_APB1RST_TIMER5RST BIT(4) /*!< TIMER5 reset */ +#define RCU_APB1RST_TIMER6RST BIT(5) /*!< TIMER6 reset */ + +#define RCU_APB1RST_WWDGTRST BIT(11) /*!< WWDGT reset */ +#define RCU_APB1RST_SPI1RST BIT(14) /*!< SPI1 reset */ +#define RCU_APB1RST_SPI2RST BIT(15) /*!< SPI2 reset */ +#define RCU_APB1RST_USART1RST BIT(17) /*!< USART1 reset */ +#define RCU_APB1RST_USART2RST BIT(18) /*!< USART2 reset */ +#define RCU_APB1RST_UART3RST BIT(19) /*!< UART3 reset */ +#define RCU_APB1RST_UART4RST BIT(20) /*!< UART4 reset */ +#define RCU_APB1RST_I2C0RST BIT(21) /*!< I2C0 reset */ +#define RCU_APB1RST_I2C1RST BIT(22) /*!< I2C1 reset */ +#define RCU_APB1RST_CAN0RST BIT(25) /*!< CAN0 reset */ +#define RCU_APB1RST_CAN1RST BIT(26) /*!< CAN1 reset */ +#define RCU_APB1RST_BKPIRST BIT(27) /*!< backup interface reset */ +#define RCU_APB1RST_PMURST BIT(28) /*!< PMU reset */ +#define RCU_APB1RST_DACRST BIT(29) /*!< DAC reset */ + +/* RCU_AHBEN */ +#define RCU_AHBEN_DMA0EN BIT(0) /*!< DMA0 clock enable */ +#define RCU_AHBEN_DMA1EN BIT(1) /*!< DMA1 clock enable */ +#define RCU_AHBEN_SRAMSPEN BIT(2) /*!< SRAM clock enable when sleep mode */ +#define RCU_AHBEN_FMCSPEN BIT(4) /*!< FMC clock enable when sleep mode */ +#define RCU_AHBEN_CRCEN BIT(6) /*!< CRC clock enable */ +#define RCU_AHBEN_EXMCEN BIT(8) /*!< EXMC clock enable */ +#define RCU_AHBEN_USBFSEN BIT(12) /*!< USBFS clock enable */ + +/* RCU_APB2EN */ +#define RCU_APB2EN_AFEN BIT(0) /*!< alternate function IO clock enable */ +#define RCU_APB2EN_PAEN BIT(2) /*!< GPIO port A clock enable */ +#define RCU_APB2EN_PBEN BIT(3) /*!< GPIO port B clock enable */ +#define RCU_APB2EN_PCEN BIT(4) /*!< GPIO port C clock enable */ +#define RCU_APB2EN_PDEN BIT(5) /*!< GPIO port D clock enable */ +#define RCU_APB2EN_PEEN BIT(6) /*!< GPIO port E clock enable */ +#define RCU_APB2EN_ADC0EN BIT(9) /*!< ADC0 clock enable */ +#define RCU_APB2EN_ADC1EN BIT(10) /*!< ADC1 clock enable */ +#define RCU_APB2EN_TIMER0EN BIT(11) /*!< TIMER0 clock enable */ +#define RCU_APB2EN_SPI0EN BIT(12) /*!< SPI0 clock enable */ +#define RCU_APB2EN_USART0EN BIT(14) /*!< USART0 clock enable */ + +/* RCU_APB1EN */ +#define RCU_APB1EN_TIMER1EN BIT(0) /*!< TIMER1 clock enable */ +#define RCU_APB1EN_TIMER2EN BIT(1) /*!< TIMER2 clock enable */ +#define RCU_APB1EN_TIMER3EN BIT(2) /*!< TIMER3 clock enable */ +#define RCU_APB1EN_TIMER4EN BIT(3) /*!< TIMER4 clock enable */ +#define RCU_APB1EN_TIMER5EN BIT(4) /*!< TIMER5 clock enable */ +#define RCU_APB1EN_TIMER6EN BIT(5) /*!< TIMER6 clock enable */ +#define RCU_APB1EN_WWDGTEN BIT(11) /*!< WWDGT clock enable */ +#define RCU_APB1EN_SPI1EN BIT(14) /*!< SPI1 clock enable */ +#define RCU_APB1EN_SPI2EN BIT(15) /*!< SPI2 clock enable */ +#define RCU_APB1EN_USART1EN BIT(17) /*!< USART1 clock enable */ +#define RCU_APB1EN_USART2EN BIT(18) /*!< USART2 clock enable */ +#define RCU_APB1EN_UART3EN BIT(19) /*!< UART3 clock enable */ +#define RCU_APB1EN_UART4EN BIT(20) /*!< UART4 clock enable */ +#define RCU_APB1EN_I2C0EN BIT(21) /*!< I2C0 clock enable */ +#define RCU_APB1EN_I2C1EN BIT(22) /*!< I2C1 clock enable */ +#define RCU_APB1EN_CAN0EN BIT(25) /*!< CAN0 clock enable */ +#define RCU_APB1EN_CAN1EN BIT(26) /*!< CAN1 clock enable */ +#define RCU_APB1EN_BKPIEN BIT(27) /*!< backup interface clock enable */ +#define RCU_APB1EN_PMUEN BIT(28) /*!< PMU clock enable */ +#define RCU_APB1EN_DACEN BIT(29) /*!< DAC clock enable */ + +/* RCU_BDCTL */ +#define RCU_BDCTL_LXTALEN BIT(0) /*!< LXTAL enable */ +#define RCU_BDCTL_LXTALSTB BIT(1) /*!< low speed crystal oscillator stabilization flag */ +#define RCU_BDCTL_LXTALBPS BIT(2) /*!< LXTAL bypass mode enable */ +#define RCU_BDCTL_RTCSRC BITS(8,9) /*!< RTC clock entry selection */ +#define RCU_BDCTL_RTCEN BIT(15) /*!< RTC clock enable */ +#define RCU_BDCTL_BKPRST BIT(16) /*!< backup domain reset */ + +/* RCU_RSTSCK */ +#define RCU_RSTSCK_IRC40KEN BIT(0) /*!< IRC40K enable */ +#define RCU_RSTSCK_IRC40KSTB BIT(1) /*!< IRC40K stabilization flag */ +#define RCU_RSTSCK_RSTFC BIT(24) /*!< reset flag clear */ +#define RCU_RSTSCK_EPRSTF BIT(26) /*!< external pin reset flag */ +#define RCU_RSTSCK_PORRSTF BIT(27) /*!< power reset flag */ +#define RCU_RSTSCK_SWRSTF BIT(28) /*!< software reset flag */ +#define RCU_RSTSCK_FWDGTRSTF BIT(29) /*!< free watchdog timer reset flag */ +#define RCU_RSTSCK_WWDGTRSTF BIT(30) /*!< window watchdog timer reset flag */ +#define RCU_RSTSCK_LPRSTF BIT(31) /*!< low-power reset flag */ + +/* RCU_AHBRST */ +#define RCU_AHBRST_USBFSRST BIT(12) /*!< USBFS reset */ + +/* RCU_CFG1 */ +#define RCU_CFG1_PREDV0 BITS(0,3) /*!< PREDV0 division factor */ +#define RCU_CFG1_PREDV1 BITS(4,7) /*!< PREDV1 division factor */ +#define RCU_CFG1_PLL1MF BITS(8,11) /*!< PLL1 clock multiplication factor */ +#define RCU_CFG1_PLL2MF BITS(12,15) /*!< PLL2 clock multiplication factor */ +#define RCU_CFG1_PREDV0SEL BIT(16) /*!< PREDV0 input clock source selection */ +#define RCU_CFG1_I2S1SEL BIT(17) /*!< I2S1 clock source selection */ +#define RCU_CFG1_I2S2SEL BIT(18) /*!< I2S2 clock source selection */ + +/* RCU_DSV */ +#define RCU_DSV_DSLPVS BITS(0,1) /*!< deep-sleep mode voltage select */ + +/* constants definitions */ +/* define the peripheral clock enable bit position and its register index offset */ +#define RCU_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define RCU_REG_VAL(periph) (REG32(RCU + ((uint32_t)(periph) >> 6))) +#define RCU_BIT_POS(val) ((uint32_t)(val) & 0x1FU) + +/* register offset */ +/* peripherals enable */ +#define AHBEN_REG_OFFSET 0x14U /*!< AHB enable register offset */ +#define APB1EN_REG_OFFSET 0x1CU /*!< APB1 enable register offset */ +#define APB2EN_REG_OFFSET 0x18U /*!< APB2 enable register offset */ + +/* peripherals reset */ +#define AHBRST_REG_OFFSET 0x28U /*!< AHB reset register offset */ +#define APB1RST_REG_OFFSET 0x10U /*!< APB1 reset register offset */ +#define APB2RST_REG_OFFSET 0x0CU /*!< APB2 reset register offset */ +#define RSTSCK_REG_OFFSET 0x24U /*!< reset source/clock register offset */ + +/* clock control */ +#define CTL_REG_OFFSET 0x00U /*!< control register offset */ +#define BDCTL_REG_OFFSET 0x20U /*!< backup domain control register offset */ + +/* clock stabilization and stuck interrupt */ +#define INT_REG_OFFSET 0x08U /*!< clock interrupt register offset */ + +/* configuration register */ +#define CFG0_REG_OFFSET 0x04U /*!< clock configuration register 0 offset */ +#define CFG1_REG_OFFSET 0x2CU /*!< clock configuration register 1 offset */ + +/* peripheral clock enable */ +typedef enum { + /* AHB peripherals */ + RCU_DMA0 = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 0U), /*!< DMA0 clock */ + RCU_DMA1 = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 1U), /*!< DMA1 clock */ + RCU_CRC = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 6U), /*!< CRC clock */ + RCU_EXMC = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 8U), /*!< EXMC clock */ + RCU_USBFS = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 12U), /*!< USBFS clock */ + /* APB1 peripherals */ + RCU_TIMER1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 0U), /*!< TIMER1 clock */ + RCU_TIMER2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 1U), /*!< TIMER2 clock */ + RCU_TIMER3 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 2U), /*!< TIMER3 clock */ + RCU_TIMER4 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 3U), /*!< TIMER4 clock */ + RCU_TIMER5 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 4U), /*!< TIMER5 clock */ + RCU_TIMER6 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 5U), /*!< TIMER6 clock */ + RCU_WWDGT = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 11U), /*!< WWDGT clock */ + RCU_SPI1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 14U), /*!< SPI1 clock */ + RCU_SPI2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 15U), /*!< SPI2 clock */ + RCU_USART1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 17U), /*!< USART1 clock */ + RCU_USART2 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 18U), /*!< USART2 clock */ + RCU_UART3 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 19U), /*!< UART3 clock */ + RCU_UART4 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 20U), /*!< UART4 clock */ + RCU_I2C0 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 21U), /*!< I2C0 clock */ + RCU_I2C1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 22U), /*!< I2C1 clock */ + RCU_CAN0 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 25U), /*!< CAN0 clock */ + RCU_CAN1 = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 26U), /*!< CAN1 clock */ + RCU_BKPI = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 27U), /*!< BKPI clock */ + RCU_PMU = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 28U), /*!< PMU clock */ + RCU_DAC = RCU_REGIDX_BIT(APB1EN_REG_OFFSET, 29U), /*!< DAC clock */ + RCU_RTC = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 15U), /*!< RTC clock */ + /* APB2 peripherals */ + RCU_AF = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 0U), /*!< alternate function clock */ + RCU_GPIOA = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 2U), /*!< GPIOA clock */ + RCU_GPIOB = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 3U), /*!< GPIOB clock */ + RCU_GPIOC = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 4U), /*!< GPIOC clock */ + RCU_GPIOD = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 5U), /*!< GPIOD clock */ + RCU_GPIOE = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 6U), /*!< GPIOE clock */ + RCU_ADC0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 9U), /*!< ADC0 clock */ + RCU_ADC1 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 10U), /*!< ADC1 clock */ + RCU_TIMER0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 11U), /*!< TIMER0 clock */ + RCU_SPI0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 12U), /*!< SPI0 clock */ + RCU_USART0 = RCU_REGIDX_BIT(APB2EN_REG_OFFSET, 14U), /*!< USART0 clock */ +} rcu_periph_enum; + +/* peripheral clock enable when sleep mode*/ +typedef enum { +/* AHB peripherals */ + RCU_SRAM_SLP = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 2U), /*!< SRAM clock */ + RCU_FMC_SLP = RCU_REGIDX_BIT(AHBEN_REG_OFFSET, 4U), /*!< FMC clock */ +} rcu_periph_sleep_enum; + +/* peripherals reset */ +typedef enum { + /* AHB peripherals */ + RCU_USBFSRST = RCU_REGIDX_BIT(AHBRST_REG_OFFSET, 12U), /*!< USBFS clock reset */ + /* APB1 peripherals */ + RCU_TIMER1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 0U), /*!< TIMER1 clock reset */ + RCU_TIMER2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 1U), /*!< TIMER2 clock reset */ + RCU_TIMER3RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 2U), /*!< TIMER3 clock reset */ + RCU_TIMER4RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 3U), /*!< TIMER4 clock reset */ + RCU_TIMER5RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 4U), /*!< TIMER5 clock reset */ + RCU_TIMER6RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 5U), /*!< TIMER6 clock reset */ + RCU_WWDGTRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 11U), /*!< WWDGT clock reset */ + RCU_SPI1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 14U), /*!< SPI1 clock reset */ + RCU_SPI2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 15U), /*!< SPI2 clock reset */ + RCU_USART1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 17U), /*!< USART1 clock reset */ + RCU_USART2RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 18U), /*!< USART2 clock reset */ + RCU_UART3RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 19U), /*!< UART3 clock reset */ + RCU_UART4RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 20U), /*!< UART4 clock reset */ + RCU_I2C0RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 21U), /*!< I2C0 clock reset */ + RCU_I2C1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 22U), /*!< I2C1 clock reset */ + RCU_CAN0RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 25U), /*!< CAN0 clock reset */ + RCU_CAN1RST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 26U), /*!< CAN1 clock reset */ + RCU_BKPIRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 27U), /*!< BKPI clock reset */ + RCU_PMURST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 28U), /*!< PMU clock reset */ + RCU_DACRST = RCU_REGIDX_BIT(APB1RST_REG_OFFSET, 29U), /*!< DAC clock reset */ + /* APB2 peripherals */ + RCU_AFRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 0U), /*!< alternate function clock reset */ + RCU_GPIOARST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 2U), /*!< GPIOA clock reset */ + RCU_GPIOBRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 3U), /*!< GPIOB clock reset */ + RCU_GPIOCRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 4U), /*!< GPIOC clock reset */ + RCU_GPIODRST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 5U), /*!< GPIOD clock reset */ + RCU_GPIOERST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 6U), /*!< GPIOE clock reset */ + RCU_ADC0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 9U), /*!< ADC0 clock reset */ + RCU_ADC1RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 10U), /*!< ADC1 clock reset */ + RCU_TIMER0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 11U), /*!< TIMER0 clock reset */ + RCU_SPI0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 12U), /*!< SPI0 clock reset */ + RCU_USART0RST = RCU_REGIDX_BIT(APB2RST_REG_OFFSET, 14U), /*!< USART0 clock reset */ +} rcu_periph_reset_enum; + +/* clock stabilization and peripheral reset flags */ +typedef enum { + /* clock stabilization flags */ + RCU_FLAG_IRC8MSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 1U), /*!< IRC8M stabilization flags */ + RCU_FLAG_HXTALSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 17U), /*!< HXTAL stabilization flags */ + RCU_FLAG_PLLSTB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 25U), /*!< PLL stabilization flags */ + RCU_FLAG_PLL1STB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 27U), /*!< PLL1 stabilization flags */ + RCU_FLAG_PLL2STB = RCU_REGIDX_BIT(CTL_REG_OFFSET, 29U), /*!< PLL2 stabilization flags */ + RCU_FLAG_LXTALSTB = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 1U), /*!< LXTAL stabilization flags */ + RCU_FLAG_IRC40KSTB = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 1U), /*!< IRC40K stabilization flags */ + /* reset source flags */ + RCU_FLAG_EPRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 26U), /*!< external PIN reset flags */ + RCU_FLAG_PORRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 27U), /*!< power reset flags */ + RCU_FLAG_SWRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 28U), /*!< software reset flags */ + RCU_FLAG_FWDGTRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 29U), /*!< FWDGT reset flags */ + RCU_FLAG_WWDGTRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 30U), /*!< WWDGT reset flags */ + RCU_FLAG_LPRST = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 31U), /*!< low-power reset flags */ +} rcu_flag_enum; + +/* clock stabilization and ckm interrupt flags */ +typedef enum { + RCU_INT_FLAG_IRC40KSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 0U), /*!< IRC40K stabilization interrupt flag */ + RCU_INT_FLAG_LXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 1U), /*!< LXTAL stabilization interrupt flag */ + RCU_INT_FLAG_IRC8MSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 2U), /*!< IRC8M stabilization interrupt flag */ + RCU_INT_FLAG_HXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 3U), /*!< HXTAL stabilization interrupt flag */ + RCU_INT_FLAG_PLLSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 4U), /*!< PLL stabilization interrupt flag */ + RCU_INT_FLAG_PLL1STB = RCU_REGIDX_BIT(INT_REG_OFFSET, 5U), /*!< PLL1 stabilization interrupt flag */ + RCU_INT_FLAG_PLL2STB = RCU_REGIDX_BIT(INT_REG_OFFSET, 6U), /*!< PLL2 stabilization interrupt flag */ + RCU_INT_FLAG_CKM = RCU_REGIDX_BIT(INT_REG_OFFSET, 7U), /*!< HXTAL clock stuck interrupt flag */ +} rcu_int_flag_enum; + +/* clock stabilization and stuck interrupt flags clear */ +typedef enum { + RCU_INT_FLAG_IRC40KSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 16U), /*!< IRC40K stabilization interrupt flags clear */ + RCU_INT_FLAG_LXTALSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 17U), /*!< LXTAL stabilization interrupt flags clear */ + RCU_INT_FLAG_IRC8MSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 18U), /*!< IRC8M stabilization interrupt flags clear */ + RCU_INT_FLAG_HXTALSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 19U), /*!< HXTAL stabilization interrupt flags clear */ + RCU_INT_FLAG_PLLSTB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 20U), /*!< PLL stabilization interrupt flags clear */ + RCU_INT_FLAG_PLL1STB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 21U), /*!< PLL1 stabilization interrupt flags clear */ + RCU_INT_FLAG_PLL2STB_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 22U), /*!< PLL2 stabilization interrupt flags clear */ + RCU_INT_FLAG_CKM_CLR = RCU_REGIDX_BIT(INT_REG_OFFSET, 23U), /*!< CKM interrupt flags clear */ +} rcu_int_flag_clear_enum; + +/* clock stabilization interrupt enable or disable */ +typedef enum { + RCU_INT_IRC40KSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 8U), /*!< IRC40K stabilization interrupt */ + RCU_INT_LXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 9U), /*!< LXTAL stabilization interrupt */ + RCU_INT_IRC8MSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 10U), /*!< IRC8M stabilization interrupt */ + RCU_INT_HXTALSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 11U), /*!< HXTAL stabilization interrupt */ + RCU_INT_PLLSTB = RCU_REGIDX_BIT(INT_REG_OFFSET, 12U), /*!< PLL stabilization interrupt */ + RCU_INT_PLL1STB = RCU_REGIDX_BIT(INT_REG_OFFSET, 13U), /*!< PLL1 stabilization interrupt */ + RCU_INT_PLL2STB = RCU_REGIDX_BIT(INT_REG_OFFSET, 14U), /*!< PLL2 stabilization interrupt */ +} rcu_int_enum; + +/* oscillator types */ +typedef enum { + RCU_HXTAL = RCU_REGIDX_BIT(CTL_REG_OFFSET, 16U), /*!< HXTAL */ + RCU_LXTAL = RCU_REGIDX_BIT(BDCTL_REG_OFFSET, 0U), /*!< LXTAL */ + RCU_IRC8M = RCU_REGIDX_BIT(CTL_REG_OFFSET, 0U), /*!< IRC8M */ + RCU_IRC40K = RCU_REGIDX_BIT(RSTSCK_REG_OFFSET, 0U), /*!< IRC40K */ + RCU_PLL_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 24U), /*!< PLL */ + RCU_PLL1_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 26U), /*!< PLL1 */ + RCU_PLL2_CK = RCU_REGIDX_BIT(CTL_REG_OFFSET, 28U), /*!< PLL2 */ +} rcu_osci_type_enum; + +/* rcu clock frequency */ +typedef enum { + CK_SYS = 0, /*!< system clock */ + CK_AHB, /*!< AHB clock */ + CK_APB1, /*!< APB1 clock */ + CK_APB2, /*!< APB2 clock */ +} rcu_clock_freq_enum; + +/* RCU_CFG0 register bit define */ +/* system clock source select */ +#define CFG0_SCS(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define RCU_CKSYSSRC_IRC8M CFG0_SCS(0) /*!< system clock source select IRC8M */ +#define RCU_CKSYSSRC_HXTAL CFG0_SCS(1) /*!< system clock source select HXTAL */ +#define RCU_CKSYSSRC_PLL CFG0_SCS(2) /*!< system clock source select PLL */ + +/* system clock source select status */ +#define CFG0_SCSS(regval) (BITS(2,3) & ((uint32_t)(regval) << 2)) +#define RCU_SCSS_IRC8M CFG0_SCSS(0) /*!< system clock source select IRC8M */ +#define RCU_SCSS_HXTAL CFG0_SCSS(1) /*!< system clock source select HXTAL */ +#define RCU_SCSS_PLL CFG0_SCSS(2) /*!< system clock source select PLLP */ + +/* AHB prescaler selection */ +#define CFG0_AHBPSC(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) +#define RCU_AHB_CKSYS_DIV1 CFG0_AHBPSC(0) /*!< AHB prescaler select CK_SYS */ +#define RCU_AHB_CKSYS_DIV2 CFG0_AHBPSC(8) /*!< AHB prescaler select CK_SYS/2 */ +#define RCU_AHB_CKSYS_DIV4 CFG0_AHBPSC(9) /*!< AHB prescaler select CK_SYS/4 */ +#define RCU_AHB_CKSYS_DIV8 CFG0_AHBPSC(10) /*!< AHB prescaler select CK_SYS/8 */ +#define RCU_AHB_CKSYS_DIV16 CFG0_AHBPSC(11) /*!< AHB prescaler select CK_SYS/16 */ +#define RCU_AHB_CKSYS_DIV64 CFG0_AHBPSC(12) /*!< AHB prescaler select CK_SYS/64 */ +#define RCU_AHB_CKSYS_DIV128 CFG0_AHBPSC(13) /*!< AHB prescaler select CK_SYS/128 */ +#define RCU_AHB_CKSYS_DIV256 CFG0_AHBPSC(14) /*!< AHB prescaler select CK_SYS/256 */ +#define RCU_AHB_CKSYS_DIV512 CFG0_AHBPSC(15) /*!< AHB prescaler select CK_SYS/512 */ + +/* APB1 prescaler selection */ +#define CFG0_APB1PSC(regval) (BITS(8,10) & ((uint32_t)(regval) << 8)) +#define RCU_APB1_CKAHB_DIV1 CFG0_APB1PSC(0) /*!< APB1 prescaler select CK_AHB */ +#define RCU_APB1_CKAHB_DIV2 CFG0_APB1PSC(4) /*!< APB1 prescaler select CK_AHB/2 */ +#define RCU_APB1_CKAHB_DIV4 CFG0_APB1PSC(5) /*!< APB1 prescaler select CK_AHB/4 */ +#define RCU_APB1_CKAHB_DIV8 CFG0_APB1PSC(6) /*!< APB1 prescaler select CK_AHB/8 */ +#define RCU_APB1_CKAHB_DIV16 CFG0_APB1PSC(7) /*!< APB1 prescaler select CK_AHB/16 */ + +/* APB2 prescaler selection */ +#define CFG0_APB2PSC(regval) (BITS(11,13) & ((uint32_t)(regval) << 11)) +#define RCU_APB2_CKAHB_DIV1 CFG0_APB2PSC(0) /*!< APB2 prescaler select CK_AHB */ +#define RCU_APB2_CKAHB_DIV2 CFG0_APB2PSC(4) /*!< APB2 prescaler select CK_AHB/2 */ +#define RCU_APB2_CKAHB_DIV4 CFG0_APB2PSC(5) /*!< APB2 prescaler select CK_AHB/4 */ +#define RCU_APB2_CKAHB_DIV8 CFG0_APB2PSC(6) /*!< APB2 prescaler select CK_AHB/8 */ +#define RCU_APB2_CKAHB_DIV16 CFG0_APB2PSC(7) /*!< APB2 prescaler select CK_AHB/16 */ + +/* ADC prescaler select */ +#define RCU_CKADC_CKAPB2_DIV2 ((uint32_t)0x00000000U) /*!< ADC prescaler select CK_APB2/2 */ +#define RCU_CKADC_CKAPB2_DIV4 ((uint32_t)0x00000001U) /*!< ADC prescaler select CK_APB2/4 */ +#define RCU_CKADC_CKAPB2_DIV6 ((uint32_t)0x00000002U) /*!< ADC prescaler select CK_APB2/6 */ +#define RCU_CKADC_CKAPB2_DIV8 ((uint32_t)0x00000003U) /*!< ADC prescaler select CK_APB2/8 */ +#define RCU_CKADC_CKAPB2_DIV12 ((uint32_t)0x00000005U) /*!< ADC prescaler select CK_APB2/12 */ +#define RCU_CKADC_CKAPB2_DIV16 ((uint32_t)0x00000007U) /*!< ADC prescaler select CK_APB2/16 */ + +/* PLL clock source selection */ +#define RCU_PLLSRC_IRC8M_DIV2 ((uint32_t)0x00000000U) /*!< IRC8M/2 clock selected as source clock of PLL */ +#define RCU_PLLSRC_HXTAL RCU_CFG0_PLLSEL /*!< HXTAL clock selected as source clock of PLL */ + +/* PLL clock multiplication factor */ +#define PLLMF_4 RCU_CFG0_PLLMF_4 /* bit 4 of PLLMF */ + +#define CFG0_PLLMF(regval) (BITS(18,21) & ((uint32_t)(regval) << 18)) +#define RCU_PLL_MUL2 CFG0_PLLMF(0) /*!< PLL source clock multiply by 2 */ +#define RCU_PLL_MUL3 CFG0_PLLMF(1) /*!< PLL source clock multiply by 3 */ +#define RCU_PLL_MUL4 CFG0_PLLMF(2) /*!< PLL source clock multiply by 4 */ +#define RCU_PLL_MUL5 CFG0_PLLMF(3) /*!< PLL source clock multiply by 5 */ +#define RCU_PLL_MUL6 CFG0_PLLMF(4) /*!< PLL source clock multiply by 6 */ +#define RCU_PLL_MUL7 CFG0_PLLMF(5) /*!< PLL source clock multiply by 7 */ +#define RCU_PLL_MUL8 CFG0_PLLMF(6) /*!< PLL source clock multiply by 8 */ +#define RCU_PLL_MUL9 CFG0_PLLMF(7) /*!< PLL source clock multiply by 9 */ +#define RCU_PLL_MUL10 CFG0_PLLMF(8) /*!< PLL source clock multiply by 10 */ +#define RCU_PLL_MUL11 CFG0_PLLMF(9) /*!< PLL source clock multiply by 11 */ +#define RCU_PLL_MUL12 CFG0_PLLMF(10) /*!< PLL source clock multiply by 12 */ +#define RCU_PLL_MUL13 CFG0_PLLMF(11) /*!< PLL source clock multiply by 13 */ +#define RCU_PLL_MUL14 CFG0_PLLMF(12) /*!< PLL source clock multiply by 14 */ +#define RCU_PLL_MUL6_5 CFG0_PLLMF(13) /*!< PLL source clock multiply by 6.5 */ +#define RCU_PLL_MUL16 CFG0_PLLMF(14) /*!< PLL source clock multiply by 16 */ +#define RCU_PLL_MUL17 (PLLMF_4 | CFG0_PLLMF(0)) /*!< PLL source clock multiply by 17 */ +#define RCU_PLL_MUL18 (PLLMF_4 | CFG0_PLLMF(1)) /*!< PLL source clock multiply by 18 */ +#define RCU_PLL_MUL19 (PLLMF_4 | CFG0_PLLMF(2)) /*!< PLL source clock multiply by 19 */ +#define RCU_PLL_MUL20 (PLLMF_4 | CFG0_PLLMF(3)) /*!< PLL source clock multiply by 20 */ +#define RCU_PLL_MUL21 (PLLMF_4 | CFG0_PLLMF(4)) /*!< PLL source clock multiply by 21 */ +#define RCU_PLL_MUL22 (PLLMF_4 | CFG0_PLLMF(5)) /*!< PLL source clock multiply by 22 */ +#define RCU_PLL_MUL23 (PLLMF_4 | CFG0_PLLMF(6)) /*!< PLL source clock multiply by 23 */ +#define RCU_PLL_MUL24 (PLLMF_4 | CFG0_PLLMF(7)) /*!< PLL source clock multiply by 24 */ +#define RCU_PLL_MUL25 (PLLMF_4 | CFG0_PLLMF(8)) /*!< PLL source clock multiply by 25 */ +#define RCU_PLL_MUL26 (PLLMF_4 | CFG0_PLLMF(9)) /*!< PLL source clock multiply by 26 */ +#define RCU_PLL_MUL27 (PLLMF_4 | CFG0_PLLMF(10)) /*!< PLL source clock multiply by 27 */ +#define RCU_PLL_MUL28 (PLLMF_4 | CFG0_PLLMF(11)) /*!< PLL source clock multiply by 28 */ +#define RCU_PLL_MUL29 (PLLMF_4 | CFG0_PLLMF(12)) /*!< PLL source clock multiply by 29 */ +#define RCU_PLL_MUL30 (PLLMF_4 | CFG0_PLLMF(13)) /*!< PLL source clock multiply by 30 */ +#define RCU_PLL_MUL31 (PLLMF_4 | CFG0_PLLMF(14)) /*!< PLL source clock multiply by 31 */ +#define RCU_PLL_MUL32 (PLLMF_4 | CFG0_PLLMF(15)) /*!< PLL source clock multiply by 32 */ + +/* USBFS prescaler select */ +#define CFG0_USBPSC(regval) (BITS(22,23) & ((uint32_t)(regval) << 22)) +#define RCU_CKUSB_CKPLL_DIV1_5 CFG0_USBPSC(0) /*!< USBFS prescaler select CK_PLL/1.5 */ +#define RCU_CKUSB_CKPLL_DIV1 CFG0_USBPSC(1) /*!< USBFS prescaler select CK_PLL/1 */ +#define RCU_CKUSB_CKPLL_DIV2_5 CFG0_USBPSC(2) /*!< USBFS prescaler select CK_PLL/2.5 */ +#define RCU_CKUSB_CKPLL_DIV2 CFG0_USBPSC(3) /*!< USBFS prescaler select CK_PLL/2 */ + +/* CKOUT0 clock source selection */ +#define CFG0_CKOUT0SEL(regval) (BITS(24,27) & ((uint32_t)(regval) << 24)) +#define RCU_CKOUT0SRC_NONE CFG0_CKOUT0SEL(0) /*!< no clock selected */ +#define RCU_CKOUT0SRC_CKSYS CFG0_CKOUT0SEL(4) /*!< system clock selected */ +#define RCU_CKOUT0SRC_IRC8M CFG0_CKOUT0SEL(5) /*!< internal 8M RC oscillator clock selected */ +#define RCU_CKOUT0SRC_HXTAL CFG0_CKOUT0SEL(6) /*!< high speed crystal oscillator clock (HXTAL) selected */ +#define RCU_CKOUT0SRC_CKPLL_DIV2 CFG0_CKOUT0SEL(7) /*!< CK_PLL/2 clock selected */ +#define RCU_CKOUT0SRC_CKPLL1 CFG0_CKOUT0SEL(8) /*!< CK_PLL1 clock selected */ +#define RCU_CKOUT0SRC_CKPLL2_DIV2 CFG0_CKOUT0SEL(9) /*!< CK_PLL2/2 clock selected */ +#define RCU_CKOUT0SRC_EXT1 CFG0_CKOUT0SEL(10) /*!< EXT1 selected */ +#define RCU_CKOUT0SRC_CKPLL2 CFG0_CKOUT0SEL(11) /*!< CK_PLL2 clock selected */ + +/* RTC clock entry selection */ +#define BDCTL_RTCSRC(regval) (BITS(8,9) & ((uint32_t)(regval) << 8)) +#define RCU_RTCSRC_NONE BDCTL_RTCSRC(0) /*!< no clock selected */ +#define RCU_RTCSRC_LXTAL BDCTL_RTCSRC(1) /*!< RTC source clock select LXTAL */ +#define RCU_RTCSRC_IRC40K BDCTL_RTCSRC(2) /*!< RTC source clock select IRC40K */ +#define RCU_RTCSRC_HXTAL_DIV_128 BDCTL_RTCSRC(3) /*!< RTC source clock select HXTAL/128 */ + +/* PREDV0 division factor */ +#define CFG1_PREDV0(regval) (BITS(0,3) & ((uint32_t)(regval) << 0)) +#define RCU_PREDV0_DIV1 CFG1_PREDV0(0) /*!< PREDV0 input source clock not divided */ +#define RCU_PREDV0_DIV2 CFG1_PREDV0(1) /*!< PREDV0 input source clock divided by 2 */ +#define RCU_PREDV0_DIV3 CFG1_PREDV0(2) /*!< PREDV0 input source clock divided by 3 */ +#define RCU_PREDV0_DIV4 CFG1_PREDV0(3) /*!< PREDV0 input source clock divided by 4 */ +#define RCU_PREDV0_DIV5 CFG1_PREDV0(4) /*!< PREDV0 input source clock divided by 5 */ +#define RCU_PREDV0_DIV6 CFG1_PREDV0(5) /*!< PREDV0 input source clock divided by 6 */ +#define RCU_PREDV0_DIV7 CFG1_PREDV0(6) /*!< PREDV0 input source clock divided by 7 */ +#define RCU_PREDV0_DIV8 CFG1_PREDV0(7) /*!< PREDV0 input source clock divided by 8 */ +#define RCU_PREDV0_DIV9 CFG1_PREDV0(8) /*!< PREDV0 input source clock divided by 9 */ +#define RCU_PREDV0_DIV10 CFG1_PREDV0(9) /*!< PREDV0 input source clock divided by 10 */ +#define RCU_PREDV0_DIV11 CFG1_PREDV0(10) /*!< PREDV0 input source clock divided by 11 */ +#define RCU_PREDV0_DIV12 CFG1_PREDV0(11) /*!< PREDV0 input source clock divided by 12 */ +#define RCU_PREDV0_DIV13 CFG1_PREDV0(12) /*!< PREDV0 input source clock divided by 13 */ +#define RCU_PREDV0_DIV14 CFG1_PREDV0(13) /*!< PREDV0 input source clock divided by 14 */ +#define RCU_PREDV0_DIV15 CFG1_PREDV0(14) /*!< PREDV0 input source clock divided by 15 */ +#define RCU_PREDV0_DIV16 CFG1_PREDV0(15) /*!< PREDV0 input source clock divided by 16 */ + +/* PREDV1 division factor */ +#define CFG1_PREDV1(regval) (BITS(4,7) & ((uint32_t)(regval) << 4)) +#define RCU_PREDV1_DIV1 CFG1_PREDV1(0) /*!< PREDV1 input source clock not divided */ +#define RCU_PREDV1_DIV2 CFG1_PREDV1(1) /*!< PREDV1 input source clock divided by 2 */ +#define RCU_PREDV1_DIV3 CFG1_PREDV1(2) /*!< PREDV1 input source clock divided by 3 */ +#define RCU_PREDV1_DIV4 CFG1_PREDV1(3) /*!< PREDV1 input source clock divided by 4 */ +#define RCU_PREDV1_DIV5 CFG1_PREDV1(4) /*!< PREDV1 input source clock divided by 5 */ +#define RCU_PREDV1_DIV6 CFG1_PREDV1(5) /*!< PREDV1 input source clock divided by 6 */ +#define RCU_PREDV1_DIV7 CFG1_PREDV1(6) /*!< PREDV1 input source clock divided by 7 */ +#define RCU_PREDV1_DIV8 CFG1_PREDV1(7) /*!< PREDV1 input source clock divided by 8 */ +#define RCU_PREDV1_DIV9 CFG1_PREDV1(8) /*!< PREDV1 input source clock divided by 9 */ +#define RCU_PREDV1_DIV10 CFG1_PREDV1(9) /*!< PREDV1 input source clock divided by 10 */ +#define RCU_PREDV1_DIV11 CFG1_PREDV1(10) /*!< PREDV1 input source clock divided by 11 */ +#define RCU_PREDV1_DIV12 CFG1_PREDV1(11) /*!< PREDV1 input source clock divided by 12 */ +#define RCU_PREDV1_DIV13 CFG1_PREDV1(12) /*!< PREDV1 input source clock divided by 13 */ +#define RCU_PREDV1_DIV14 CFG1_PREDV1(13) /*!< PREDV1 input source clock divided by 14 */ +#define RCU_PREDV1_DIV15 CFG1_PREDV1(14) /*!< PREDV1 input source clock divided by 15 */ +#define RCU_PREDV1_DIV16 CFG1_PREDV1(15) /*!< PREDV1 input source clock divided by 16 */ + +/* PLL1 clock multiplication factor */ +#define CFG1_PLL1MF(regval) (BITS(8,11) & ((uint32_t)(regval) << 8)) +#define RCU_PLL1_MUL8 CFG1_PLL1MF(6) /*!< PLL1 source clock multiply by 8 */ +#define RCU_PLL1_MUL9 CFG1_PLL1MF(7) /*!< PLL1 source clock multiply by 9 */ +#define RCU_PLL1_MUL10 CFG1_PLL1MF(8) /*!< PLL1 source clock multiply by 10 */ +#define RCU_PLL1_MUL11 CFG1_PLL1MF(9) /*!< PLL1 source clock multiply by 11 */ +#define RCU_PLL1_MUL12 CFG1_PLL1MF(10) /*!< PLL1 source clock multiply by 12 */ +#define RCU_PLL1_MUL13 CFG1_PLL1MF(11) /*!< PLL1 source clock multiply by 13 */ +#define RCU_PLL1_MUL14 CFG1_PLL1MF(12) /*!< PLL1 source clock multiply by 14 */ +#define RCU_PLL1_MUL15 CFG1_PLL1MF(13) /*!< PLL1 source clock multiply by 15 */ +#define RCU_PLL1_MUL16 CFG1_PLL1MF(14) /*!< PLL1 source clock multiply by 16 */ +#define RCU_PLL1_MUL20 CFG1_PLL1MF(15) /*!< PLL1 source clock multiply by 20 */ + +/* PLL2 clock multiplication factor */ +#define CFG1_PLL2MF(regval) (BITS(12,15) & ((uint32_t)(regval) << 12)) +#define RCU_PLL2_MUL8 CFG1_PLL2MF(6) /*!< PLL2 source clock multiply by 8 */ +#define RCU_PLL2_MUL9 CFG1_PLL2MF(7) /*!< PLL2 source clock multiply by 9 */ +#define RCU_PLL2_MUL10 CFG1_PLL2MF(8) /*!< PLL2 source clock multiply by 10 */ +#define RCU_PLL2_MUL11 CFG1_PLL2MF(9) /*!< PLL2 source clock multiply by 11 */ +#define RCU_PLL2_MUL12 CFG1_PLL2MF(10) /*!< PLL2 source clock multiply by 12 */ +#define RCU_PLL2_MUL13 CFG1_PLL2MF(11) /*!< PLL2 source clock multiply by 13 */ +#define RCU_PLL2_MUL14 CFG1_PLL2MF(12) /*!< PLL2 source clock multiply by 14 */ +#define RCU_PLL2_MUL15 CFG1_PLL2MF(13) /*!< PLL2 source clock multiply by 15 */ +#define RCU_PLL2_MUL16 CFG1_PLL2MF(14) /*!< PLL2 source clock multiply by 16 */ +#define RCU_PLL2_MUL20 CFG1_PLL2MF(15) /*!< PLL2 source clock multiply by 20 */ + + +/* PREDV0 input clock source selection */ +#define RCU_PREDV0SRC_HXTAL ((uint32_t)0x00000000U) /*!< HXTAL selected as PREDV0 input source clock */ +#define RCU_PREDV0SRC_CKPLL1 RCU_CFG1_PREDV0SEL /*!< CK_PLL1 selected as PREDV0 input source clock */ + +/* I2S1 clock source selection */ +#define RCU_I2S1SRC_CKSYS ((uint32_t)0x00000000U) /*!< system clock selected as I2S1 source clock */ +#define RCU_I2S1SRC_CKPLL2_MUL2 RCU_CFG1_I2S1SEL /*!< (CK_PLL2 x 2) selected as I2S1 source clock */ + +/* I2S2 clock source selection */ +#define RCU_I2S2SRC_CKSYS ((uint32_t)0x00000000U) /*!< system clock selected as I2S2 source clock */ +#define RCU_I2S2SRC_CKPLL2_MUL2 RCU_CFG1_I2S2SEL /*!< (CK_PLL2 x 2) selected as I2S2 source clock */ + + +/* deep-sleep mode voltage */ +#define DSV_DSLPVS(regval) (BITS(0,1) & ((uint32_t)(regval) << 0)) +#define RCU_DEEPSLEEP_V_1_2 DSV_DSLPVS(0) /*!< core voltage is 1.2V in deep-sleep mode */ +#define RCU_DEEPSLEEP_V_1_1 DSV_DSLPVS(1) /*!< core voltage is 1.1V in deep-sleep mode */ +#define RCU_DEEPSLEEP_V_1_0 DSV_DSLPVS(2) /*!< core voltage is 1.0V in deep-sleep mode */ +#define RCU_DEEPSLEEP_V_0_9 DSV_DSLPVS(3) /*!< core voltage is 0.9V in deep-sleep mode */ + +/* function declarations */ +/* initialization, peripheral clock enable/disable functions */ +/* deinitialize the RCU */ +void rcu_deinit(void); +/* enable the peripherals clock */ +void rcu_periph_clock_enable(rcu_periph_enum periph); +/* disable the peripherals clock */ +void rcu_periph_clock_disable(rcu_periph_enum periph); +/* enable the peripherals clock when sleep mode */ +void rcu_periph_clock_sleep_enable(rcu_periph_sleep_enum periph); +/* disable the peripherals clock when sleep mode */ +void rcu_periph_clock_sleep_disable(rcu_periph_sleep_enum periph); +/* reset the peripherals */ +void rcu_periph_reset_enable(rcu_periph_reset_enum periph_reset); +/* disable reset the peripheral */ +void rcu_periph_reset_disable(rcu_periph_reset_enum periph_reset); +/* reset the BKP domain */ +void rcu_bkp_reset_enable(void); +/* disable the BKP domain reset */ +void rcu_bkp_reset_disable(void); + +/* clock configuration functions */ +/* configure the system clock source */ +void rcu_system_clock_source_config(uint32_t ck_sys); +/* get the system clock source */ +uint32_t rcu_system_clock_source_get(void); +/* configure the AHB prescaler selection */ +void rcu_ahb_clock_config(uint32_t ck_ahb); +/* configure the APB1 prescaler selection */ +void rcu_apb1_clock_config(uint32_t ck_apb1); +/* configure the APB2 prescaler selection */ +void rcu_apb2_clock_config(uint32_t ck_apb2); +/* configure the CK_OUT0 clock source and divider */ +void rcu_ckout0_config(uint32_t ckout0_src); +/* configure the PLL clock source selection and PLL multiply factor */ +void rcu_pll_config(uint32_t pll_src, uint32_t pll_mul); + +/* configure the PREDV0 division factor and clock source */ +void rcu_predv0_config(uint32_t predv0_source, uint32_t predv0_div); +/* configure the PREDV1 division factor */ +void rcu_predv1_config(uint32_t predv1_div); +/* configure the PLL1 clock */ +void rcu_pll1_config(uint32_t pll_mul); +/* configure the PLL2 clock */ +void rcu_pll2_config(uint32_t pll_mul); + +/* peripheral clock configuration functions */ +/* configure the ADC division factor */ +void rcu_adc_clock_config(uint32_t adc_psc); +/* configure the USBD/USBFS prescaler factor */ +void rcu_usb_clock_config(uint32_t usb_psc); +/* configure the RTC clock source selection */ +void rcu_rtc_clock_config(uint32_t rtc_clock_source); + +/* configure the I2S1 clock source selection */ +void rcu_i2s1_clock_config(uint32_t i2s_clock_source); +/* configure the I2S2 clock source selection */ +void rcu_i2s2_clock_config(uint32_t i2s_clock_source); + +/* interrupt & flag functions */ +/* get the clock stabilization and periphral reset flags */ +FlagStatus rcu_flag_get(rcu_flag_enum flag); +/* clear the reset flag */ +void rcu_all_reset_flag_clear(void); +/* get the clock stabilization interrupt and ckm flags */ +FlagStatus rcu_interrupt_flag_get(rcu_int_flag_enum int_flag); +/* clear the interrupt flags */ +void rcu_interrupt_flag_clear(rcu_int_flag_clear_enum int_flag_clear); +/* enable the stabilization interrupt */ +void rcu_interrupt_enable(rcu_int_enum stab_int); +/* disable the stabilization interrupt */ +void rcu_interrupt_disable(rcu_int_enum stab_int); + +/* oscillator configuration functions */ +/* wait for oscillator stabilization flags is SET or oscillator startup is timeout */ +ErrStatus rcu_osci_stab_wait(rcu_osci_type_enum osci); +/* turn on the oscillator */ +void rcu_osci_on(rcu_osci_type_enum osci); +/* turn off the oscillator */ +void rcu_osci_off(rcu_osci_type_enum osci); +/* enable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it */ +void rcu_osci_bypass_mode_enable(rcu_osci_type_enum osci); +/* disable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it */ +void rcu_osci_bypass_mode_disable(rcu_osci_type_enum osci); +/* enable the HXTAL clock monitor */ +void rcu_hxtal_clock_monitor_enable(void); +/* disable the HXTAL clock monitor */ +void rcu_hxtal_clock_monitor_disable(void); + +/* set the IRC8M adjust value */ +void rcu_irc8m_adjust_value_set(uint32_t irc8m_adjval); +/* set the deep sleep mode voltage */ +void rcu_deepsleep_voltage_set(uint32_t dsvol); + +/* get the system clock, bus and peripheral clock frequency */ +uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock); + +#endif /* GD32VF103_RCU_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h new file mode 100644 index 0000000..874c6bb --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_rtc.h @@ -0,0 +1,148 @@ +/*! + \file gd32vf103_rtc.h + \brief definitions for the RTC + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_RTC_H +#define GD32VF103_RTC_H + +#include "gd32vf103.h" + +/* RTC definitions */ +#define RTC RTC_BASE + +/* registers definitions */ +#define RTC_INTEN REG32(RTC + 0x00U) /*!< interrupt enable register */ +#define RTC_CTL REG32(RTC + 0x04U) /*!< control register */ +#define RTC_PSCH REG32(RTC + 0x08U) /*!< prescaler high register */ +#define RTC_PSCL REG32(RTC + 0x0CU) /*!< prescaler low register */ +#define RTC_DIVH REG32(RTC + 0x10U) /*!< divider high register */ +#define RTC_DIVL REG32(RTC + 0x14U) /*!< divider low register */ +#define RTC_CNTH REG32(RTC + 0x18U) /*!< counter high register */ +#define RTC_CNTL REG32(RTC + 0x1CU) /*!< counter low register */ +#define RTC_ALRMH REG32(RTC + 0x20U) /*!< alarm high register */ +#define RTC_ALRML REG32(RTC + 0x24U) /*!< alarm low register */ + +/* bits definitions */ +/* RTC_INTEN */ +#define RTC_INTEN_SCIE BIT(0) /*!< second interrupt enable */ +#define RTC_INTEN_ALRMIE BIT(1) /*!< alarm interrupt enable */ +#define RTC_INTEN_OVIE BIT(2) /*!< overflow interrupt enable */ + +/* RTC_CTL */ +#define RTC_CTL_SCIF BIT(0) /*!< second interrupt flag */ +#define RTC_CTL_ALRMIF BIT(1) /*!< alarm interrupt flag */ +#define RTC_CTL_OVIF BIT(2) /*!< overflow interrupt flag */ +#define RTC_CTL_RSYNF BIT(3) /*!< registers synchronized flag */ +#define RTC_CTL_CMF BIT(4) /*!< configuration mode flag */ +#define RTC_CTL_LWOFF BIT(5) /*!< last write operation finished flag */ + +/* RTC_PSCH */ +#define RTC_PSCH_PSC BITS(0,3) /*!< prescaler high value */ + +/* RTC_PSCL */ +#define RTC_PSCL_PSC BITS(0,15) /*!< prescaler low value */ + +/* RTC_DIVH */ +#define RTC_DIVH_DIV BITS(0,3) /*!< divider high value */ + +/* RTC_DIVL */ +#define RTC_DIVL_DIV BITS(0,15) /*!< divider low value */ + +/* RTC_CNTH */ +#define RTC_CNTH_CNT BITS(0,15) /*!< counter high value */ + +/* RTC_CNTL */ +#define RTC_CNTL_CNT BITS(0,15) /*!< counter low value */ + +/* RTC_ALRMH */ +#define RTC_ALRMH_ALRM BITS(0,15) /*!< alarm high value */ + +/* RTC_ALRML */ +#define RTC_ALRML_ALRM BITS(0,15) /*!< alarm low value */ + +/* constants definitions */ +/* RTC interrupt enable or disable definitions */ +#define RTC_INT_SECOND RTC_INTEN_SCIE /*!< second interrupt enable */ +#define RTC_INT_ALARM RTC_INTEN_ALRMIE /*!< alarm interrupt enable */ +#define RTC_INT_OVERFLOW RTC_INTEN_OVIE /*!< overflow interrupt enable */ + +/* RTC interrupt flag definitions */ +#define RTC_INT_FLAG_SECOND RTC_CTL_SCIF /*!< second interrupt flag */ +#define RTC_INT_FLAG_ALARM RTC_CTL_ALRMIF /*!< alarm interrupt flag */ +#define RTC_INT_FLAG_OVERFLOW RTC_CTL_OVIF /*!< overflow interrupt flag */ + +/* RTC flag definitions */ +#define RTC_FLAG_SECOND RTC_CTL_SCIF /*!< second interrupt flag */ +#define RTC_FLAG_ALARM RTC_CTL_ALRMIF /*!< alarm interrupt flag */ +#define RTC_FLAG_OVERFLOW RTC_CTL_OVIF /*!< overflow interrupt flag */ +#define RTC_FLAG_RSYN RTC_CTL_RSYNF /*!< registers synchronized flag */ +#define RTC_FLAG_LWOF RTC_CTL_LWOFF /*!< last write operation finished flag */ + +/* function declarations */ +/* initialization functions */ +/* enter RTC configuration mode */ +void rtc_configuration_mode_enter(void); +/* exit RTC configuration mode */ +void rtc_configuration_mode_exit(void); +/* set RTC counter value */ +void rtc_counter_set(uint32_t cnt); +/* set RTC prescaler value */ +void rtc_prescaler_set(uint32_t psc); + +/* operation functions */ +/* wait RTC last write operation finished flag set */ +void rtc_lwoff_wait(void); +/* wait RTC registers synchronized flag set */ +void rtc_register_sync_wait(void); +/* set RTC alarm value */ +void rtc_alarm_config(uint32_t alarm); +/* get RTC counter value */ +uint32_t rtc_counter_get(void); +/* get RTC divider value */ +uint32_t rtc_divider_get(void); + +/* flag & interrupt functions */ +/* get RTC flag status */ +FlagStatus rtc_flag_get(uint32_t flag); +/* clear RTC flag status */ +void rtc_flag_clear(uint32_t flag); +/* get RTC interrupt flag status */ +FlagStatus rtc_interrupt_flag_get(uint32_t flag); +/* clear RTC interrupt flag status */ +void rtc_interrupt_flag_clear(uint32_t flag); +/* enable RTC interrupt */ +void rtc_interrupt_enable(uint32_t interrupt); +/* disable RTC interrupt */ +void rtc_interrupt_disable(uint32_t interrupt); + +#endif /* GD32VF103_RTC_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h new file mode 100644 index 0000000..3ca09e2 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_spi.h @@ -0,0 +1,341 @@ +/*! + \file gd32vf103_spi.h + \brief definitions for the SPI + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_SPI_H +#define GD32VF103_SPI_H + +#include "gd32vf103.h" + +/* SPIx(x=0,1,2) definitions */ +#define SPI0 (SPI_BASE + 0x0000F800U) +#define SPI1 SPI_BASE +#define SPI2 (SPI_BASE + 0x00000400U) + +/* SPI registers definitions */ +#define SPI_CTL0(spix) REG32((spix) + 0x00U) /*!< SPI control register 0 */ +#define SPI_CTL1(spix) REG32((spix) + 0x04U) /*!< SPI control register 1*/ +#define SPI_STAT(spix) REG32((spix) + 0x08U) /*!< SPI status register */ +#define SPI_DATA(spix) REG32((spix) + 0x0CU) /*!< SPI data register */ +#define SPI_CRCPOLY(spix) REG32((spix) + 0x10U) /*!< SPI CRC polynomial register */ +#define SPI_RCRC(spix) REG32((spix) + 0x14U) /*!< SPI receive CRC register */ +#define SPI_TCRC(spix) REG32((spix) + 0x18U) /*!< SPI transmit CRC register */ +#define SPI_I2SCTL(spix) REG32((spix) + 0x1CU) /*!< SPI I2S control register */ +#define SPI_I2SPSC(spix) REG32((spix) + 0x20U) /*!< SPI I2S clock prescaler register */ + +/* bits definitions */ +/* SPI_CTL0 */ +#define SPI_CTL0_CKPH BIT(0) /*!< clock phase selection*/ +#define SPI_CTL0_CKPL BIT(1) /*!< clock polarity selection */ +#define SPI_CTL0_MSTMOD BIT(2) /*!< master mode enable */ +#define SPI_CTL0_PSC BITS(3,5) /*!< master clock prescaler selection */ +#define SPI_CTL0_SPIEN BIT(6) /*!< SPI enable*/ +#define SPI_CTL0_LF BIT(7) /*!< LSB first mode */ +#define SPI_CTL0_SWNSS BIT(8) /*!< NSS pin selection in NSS software mode */ +#define SPI_CTL0_SWNSSEN BIT(9) /*!< NSS software mode selection */ +#define SPI_CTL0_RO BIT(10) /*!< receive only */ +#define SPI_CTL0_FF16 BIT(11) /*!< data frame size */ +#define SPI_CTL0_CRCNT BIT(12) /*!< CRC next transfer */ +#define SPI_CTL0_CRCEN BIT(13) /*!< CRC calculation enable */ +#define SPI_CTL0_BDOEN BIT(14) /*!< bidirectional transmit output enable*/ +#define SPI_CTL0_BDEN BIT(15) /*!< bidirectional enable */ + +/* SPI_CTL1 */ +#define SPI_CTL1_DMAREN BIT(0) /*!< receive buffer dma enable */ +#define SPI_CTL1_DMATEN BIT(1) /*!< transmit buffer dma enable */ +#define SPI_CTL1_NSSDRV BIT(2) /*!< drive NSS output */ +#define SPI_CTL1_NSSP BIT(3) /*!< SPI NSS pulse mode enable */ +#define SPI_CTL1_TMOD BIT(4) /*!< SPI TI mode enable */ +#define SPI_CTL1_ERRIE BIT(5) /*!< errors interrupt enable */ +#define SPI_CTL1_RBNEIE BIT(6) /*!< receive buffer not empty interrupt enable */ +#define SPI_CTL1_TBEIE BIT(7) /*!< transmit buffer empty interrupt enable */ + +/* SPI_STAT */ +#define SPI_STAT_RBNE BIT(0) /*!< receive buffer not empty */ +#define SPI_STAT_TBE BIT(1) /*!< transmit buffer empty */ +#define SPI_STAT_I2SCH BIT(2) /*!< I2S channel side */ +#define SPI_STAT_TXURERR BIT(3) /*!< I2S transmission underrun error bit */ +#define SPI_STAT_CRCERR BIT(4) /*!< SPI CRC error bit */ +#define SPI_STAT_CONFERR BIT(5) /*!< SPI configuration error bit */ +#define SPI_STAT_RXORERR BIT(6) /*!< SPI reception overrun error bit */ +#define SPI_STAT_TRANS BIT(7) /*!< transmitting on-going bit */ +#define SPI_STAT_FERR BIT(8) /*!< format error bit */ + +/* SPI_DATA */ +#define SPI_DATA_DATA BITS(0,15) /*!< data transfer register */ + +/* SPI_CRCPOLY */ +#define SPI_CRCPOLY_CRCPOLY BITS(0,15) /*!< CRC polynomial value */ + +/* SPI_RCRC */ +#define SPI_RCRC_RCRC BITS(0,15) /*!< RX CRC value */ + +/* SPI_TCRC */ +#define SPI_TCRC_TCRC BITS(0,15) /*!< TX CRC value */ + +/* SPI_I2SCTL */ +#define SPI_I2SCTL_CHLEN BIT(0) /*!< channel length */ +#define SPI_I2SCTL_DTLEN BITS(1,2) /*!< data length */ +#define SPI_I2SCTL_CKPL BIT(3) /*!< idle state clock polarity */ +#define SPI_I2SCTL_I2SSTD BITS(4,5) /*!< I2S standard selection */ +#define SPI_I2SCTL_PCMSMOD BIT(7) /*!< PCM frame synchronization mode */ +#define SPI_I2SCTL_I2SOPMOD BITS(8,9) /*!< I2S operation mode */ +#define SPI_I2SCTL_I2SEN BIT(10) /*!< I2S enable */ +#define SPI_I2SCTL_I2SSEL BIT(11) /*!< I2S mode selection */ + +/* SPI_I2SPSC */ +#define SPI_I2SPSC_DIV BITS(0,7) /*!< dividing factor for the prescaler */ +#define SPI_I2SPSC_OF BIT(8) /*!< odd factor for the prescaler */ +#define SPI_I2SPSC_MCKOEN BIT(9) /*!< I2S MCK output enable */ + +/* constants definitions */ +/* SPI and I2S parameter struct definitions */ +typedef struct +{ + uint32_t device_mode; /*!< SPI master or slave */ + uint32_t trans_mode; /*!< SPI transtype */ + uint32_t frame_size; /*!< SPI frame size */ + uint32_t nss; /*!< SPI NSS control by handware or software */ + uint32_t endian; /*!< SPI big endian or little endian */ + uint32_t clock_polarity_phase; /*!< SPI clock phase and polarity */ + uint32_t prescale; /*!< SPI prescale factor */ +}spi_parameter_struct; + +/* SPI mode definitions */ +#define SPI_MASTER (SPI_CTL0_MSTMOD | SPI_CTL0_SWNSS) /*!< SPI as master */ +#define SPI_SLAVE ((uint32_t)0x00000000U) /*!< SPI as slave */ + +/* SPI bidirectional transfer direction */ +#define SPI_BIDIRECTIONAL_TRANSMIT SPI_CTL0_BDOEN /*!< SPI work in transmit-only mode */ +#define SPI_BIDIRECTIONAL_RECEIVE (~SPI_CTL0_BDOEN) /*!< SPI work in receive-only mode */ + +/* SPI transmit type */ +#define SPI_TRANSMODE_FULLDUPLEX ((uint32_t)0x00000000U) /*!< SPI receive and send data at fullduplex communication */ +#define SPI_TRANSMODE_RECEIVEONLY SPI_CTL0_RO /*!< SPI only receive data */ +#define SPI_TRANSMODE_BDRECEIVE SPI_CTL0_BDEN /*!< bidirectional receive data */ +#define SPI_TRANSMODE_BDTRANSMIT (SPI_CTL0_BDEN | SPI_CTL0_BDOEN) /*!< bidirectional transmit data*/ + +/* SPI frame size */ +#define SPI_FRAMESIZE_16BIT SPI_CTL0_FF16 /*!< SPI frame size is 16 bits */ +#define SPI_FRAMESIZE_8BIT ((uint32_t)0x00000000U) /*!< SPI frame size is 8 bits */ + +/* SPI NSS control mode */ +#define SPI_NSS_SOFT SPI_CTL0_SWNSSEN /*!< SPI NSS control by software */ +#define SPI_NSS_HARD ((uint32_t)0x00000000U) /*!< SPI NSS control by hardware */ + +/* SPI transmit way */ +#define SPI_ENDIAN_MSB ((uint32_t)0x00000000U) /*!< SPI transmit way is big endian: transmit MSB first */ +#define SPI_ENDIAN_LSB SPI_CTL0_LF /*!< SPI transmit way is little endian: transmit LSB first */ + +/* SPI clock phase and polarity */ +#define SPI_CK_PL_LOW_PH_1EDGE ((uint32_t)0x00000000U) /*!< SPI clock polarity is low level and phase is first edge */ +#define SPI_CK_PL_HIGH_PH_1EDGE SPI_CTL0_CKPL /*!< SPI clock polarity is high level and phase is first edge */ +#define SPI_CK_PL_LOW_PH_2EDGE SPI_CTL0_CKPH /*!< SPI clock polarity is low level and phase is second edge */ +#define SPI_CK_PL_HIGH_PH_2EDGE (SPI_CTL0_CKPL | SPI_CTL0_CKPH) /*!< SPI clock polarity is high level and phase is second edge */ + +/* SPI clock prescale factor */ +#define CTL0_PSC(regval) (BITS(3,5) & ((uint32_t)(regval) << 3)) +#define SPI_PSC_2 CTL0_PSC(0) /*!< SPI clock prescale factor is 2 */ +#define SPI_PSC_4 CTL0_PSC(1) /*!< SPI clock prescale factor is 4 */ +#define SPI_PSC_8 CTL0_PSC(2) /*!< SPI clock prescale factor is 8 */ +#define SPI_PSC_16 CTL0_PSC(3) /*!< SPI clock prescale factor is 16 */ +#define SPI_PSC_32 CTL0_PSC(4) /*!< SPI clock prescale factor is 32 */ +#define SPI_PSC_64 CTL0_PSC(5) /*!< SPI clock prescale factor is 64 */ +#define SPI_PSC_128 CTL0_PSC(6) /*!< SPI clock prescale factor is 128 */ +#define SPI_PSC_256 CTL0_PSC(7) /*!< SPI clock prescale factor is 256 */ + +/* I2S audio sample rate */ +#define I2S_AUDIOSAMPLE_8K ((uint32_t)8000U) /*!< I2S audio sample rate is 8KHz */ +#define I2S_AUDIOSAMPLE_11K ((uint32_t)11025U) /*!< I2S audio sample rate is 11KHz */ +#define I2S_AUDIOSAMPLE_16K ((uint32_t)16000U) /*!< I2S audio sample rate is 16KHz */ +#define I2S_AUDIOSAMPLE_22K ((uint32_t)22050U) /*!< I2S audio sample rate is 22KHz */ +#define I2S_AUDIOSAMPLE_32K ((uint32_t)32000U) /*!< I2S audio sample rate is 32KHz */ +#define I2S_AUDIOSAMPLE_44K ((uint32_t)44100U) /*!< I2S audio sample rate is 44KHz */ +#define I2S_AUDIOSAMPLE_48K ((uint32_t)48000U) /*!< I2S audio sample rate is 48KHz */ +#define I2S_AUDIOSAMPLE_96K ((uint32_t)96000U) /*!< I2S audio sample rate is 96KHz */ +#define I2S_AUDIOSAMPLE_192K ((uint32_t)192000U) /*!< I2S audio sample rate is 192KHz */ + +/* I2S frame format */ +#define I2SCTL_DTLEN(regval) (BITS(1,2) & ((uint32_t)(regval) << 1)) +#define I2S_FRAMEFORMAT_DT16B_CH16B I2SCTL_DTLEN(0) /*!< I2S data length is 16 bit and channel length is 16 bit */ +#define I2S_FRAMEFORMAT_DT16B_CH32B (I2SCTL_DTLEN(0) | SPI_I2SCTL_CHLEN) /*!< I2S data length is 16 bit and channel length is 32 bit */ +#define I2S_FRAMEFORMAT_DT24B_CH32B (I2SCTL_DTLEN(1) | SPI_I2SCTL_CHLEN) /*!< I2S data length is 24 bit and channel length is 32 bit */ +#define I2S_FRAMEFORMAT_DT32B_CH32B (I2SCTL_DTLEN(2) | SPI_I2SCTL_CHLEN) /*!< I2S data length is 32 bit and channel length is 32 bit */ + +/* I2S master clock output */ +#define I2S_MCKOUT_DISABLE ((uint32_t)0x00000000U) /*!< I2S master clock output disable */ +#define I2S_MCKOUT_ENABLE SPI_I2SPSC_MCKOEN /*!< I2S master clock output enable */ + +/* I2S operation mode */ +#define I2SCTL_I2SOPMOD(regval) (BITS(8,9) & ((uint32_t)(regval) << 8)) +#define I2S_MODE_SLAVETX I2SCTL_I2SOPMOD(0) /*!< I2S slave transmit mode */ +#define I2S_MODE_SLAVERX I2SCTL_I2SOPMOD(1) /*!< I2S slave receive mode */ +#define I2S_MODE_MASTERTX I2SCTL_I2SOPMOD(2) /*!< I2S master transmit mode */ +#define I2S_MODE_MASTERRX I2SCTL_I2SOPMOD(3) /*!< I2S master receive mode */ + +/* I2S standard */ +#define I2SCTL_I2SSTD(regval) (BITS(4,5) & ((uint32_t)(regval) << 4)) +#define I2S_STD_PHILLIPS I2SCTL_I2SSTD(0) /*!< I2S phillips standard */ +#define I2S_STD_MSB I2SCTL_I2SSTD(1) /*!< I2S MSB standard */ +#define I2S_STD_LSB I2SCTL_I2SSTD(2) /*!< I2S LSB standard */ +#define I2S_STD_PCMSHORT I2SCTL_I2SSTD(3) /*!< I2S PCM short standard */ +#define I2S_STD_PCMLONG (I2SCTL_I2SSTD(3) | SPI_I2SCTL_PCMSMOD) /*!< I2S PCM long standard */ + +/* I2S clock polarity */ +#define I2S_CKPL_LOW ((uint32_t)0x00000000U) /*!< I2S clock polarity low level */ +#define I2S_CKPL_HIGH SPI_I2SCTL_CKPL /*!< I2S clock polarity high level */ + +/* SPI DMA constants definitions */ +#define SPI_DMA_TRANSMIT ((uint8_t)0x00U) /*!< SPI transmit data use DMA */ +#define SPI_DMA_RECEIVE ((uint8_t)0x01U) /*!< SPI receive data use DMA */ + +/* SPI CRC constants definitions */ +#define SPI_CRC_TX ((uint8_t)0x00U) /*!< SPI transmit CRC value */ +#define SPI_CRC_RX ((uint8_t)0x01U) /*!< SPI receive CRC value */ + +/* SPI/I2S interrupt enable/disable constants definitions */ +#define SPI_I2S_INT_TBE ((uint8_t)0x00U) /*!< transmit buffer empty interrupt */ +#define SPI_I2S_INT_RBNE ((uint8_t)0x01U) /*!< receive buffer not empty interrupt */ +#define SPI_I2S_INT_ERR ((uint8_t)0x02U) /*!< error interrupt */ + +/* SPI/I2S interrupt flag constants definitions */ +#define SPI_I2S_INT_FLAG_TBE ((uint8_t)0x00U) /*!< transmit buffer empty interrupt flag */ +#define SPI_I2S_INT_FLAG_RBNE ((uint8_t)0x01U) /*!< receive buffer not empty interrupt flag */ +#define SPI_I2S_INT_FLAG_RXORERR ((uint8_t)0x02U) /*!< overrun interrupt flag */ +#define SPI_INT_FLAG_CONFERR ((uint8_t)0x03U) /*!< config error interrupt flag */ +#define SPI_INT_FLAG_CRCERR ((uint8_t)0x04U) /*!< CRC error interrupt flag */ +#define I2S_INT_FLAG_TXURERR ((uint8_t)0x05U) /*!< underrun error interrupt flag */ +#define SPI_I2S_INT_FLAG_FERR ((uint8_t)0x06U) /*!< format error interrupt flag */ + +/* SPI/I2S flag definitions */ +#define SPI_FLAG_RBNE SPI_STAT_RBNE /*!< receive buffer not empty flag */ +#define SPI_FLAG_TBE SPI_STAT_TBE /*!< transmit buffer empty flag */ +#define SPI_FLAG_CRCERR SPI_STAT_CRCERR /*!< CRC error flag */ +#define SPI_FLAG_CONFERR SPI_STAT_CONFERR /*!< mode config error flag */ +#define SPI_FLAG_RXORERR SPI_STAT_RXORERR /*!< receive overrun error flag */ +#define SPI_FLAG_TRANS SPI_STAT_TRANS /*!< transmit on-going flag */ +#define SPI_FLAG_FERR SPI_STAT_FERR /*!< format error interrupt flag */ +#define I2S_FLAG_RBNE SPI_STAT_RBNE /*!< receive buffer not empty flag */ +#define I2S_FLAG_TBE SPI_STAT_TBE /*!< transmit buffer empty flag */ +#define I2S_FLAG_CH SPI_STAT_I2SCH /*!< channel side flag */ +#define I2S_FLAG_TXURERR SPI_STAT_TXURERR /*!< underrun error flag */ +#define I2S_FLAG_RXORERR SPI_STAT_RXORERR /*!< overrun error flag */ +#define I2S_FLAG_TRANS SPI_STAT_TRANS /*!< transmit on-going flag */ +#define I2S_FLAG_FERR SPI_STAT_FERR /*!< format error interrupt flag */ + +/* function declarations */ +/* SPI/I2S deinitialization and initialization functions */ +/* reset SPI and I2S */ +void spi_i2s_deinit(uint32_t spi_periph); +/* initialize the parameters of SPI struct with the default values */ +void spi_struct_para_init(spi_parameter_struct* spi_struct); +/* initialize SPI parameter */ +void spi_init(uint32_t spi_periph, spi_parameter_struct* spi_struct); +/* enable SPI */ +void spi_enable(uint32_t spi_periph); +/* disable SPI */ +void spi_disable(uint32_t spi_periph); + +/* initialize I2S parameter */ +void i2s_init(uint32_t spi_periph, uint32_t mode, uint32_t standard, uint32_t ckpl); +/* configure I2S prescaler */ +void i2s_psc_config(uint32_t spi_periph, uint32_t audiosample, uint32_t frameformat, uint32_t mckout); +/* enable I2S */ +void i2s_enable(uint32_t spi_periph); +/* disable I2S */ +void i2s_disable(uint32_t spi_periph); + +/* NSS functions */ +/* enable SPI NSS output */ +void spi_nss_output_enable(uint32_t spi_periph); +/* disable SPI NSS output */ +void spi_nss_output_disable(uint32_t spi_periph); +/* SPI NSS pin high level in software mode */ +void spi_nss_internal_high(uint32_t spi_periph); +/* SPI NSS pin low level in software mode */ +void spi_nss_internal_low(uint32_t spi_periph); + +/* DMA communication */ +/* enable SPI DMA */ +void spi_dma_enable(uint32_t spi_periph, uint8_t dma); +/* disable SPI DMA */ +void spi_dma_disable(uint32_t spi_periph, uint8_t dma); + +/* normal mode communication */ +/* configure SPI/I2S data frame format */ +void spi_i2s_data_frame_format_config(uint32_t spi_periph, uint16_t frame_format); +/* SPI transmit data */ +void spi_i2s_data_transmit(uint32_t spi_periph, uint16_t data); +/* SPI receive data */ +uint16_t spi_i2s_data_receive(uint32_t spi_periph); +/* configure SPI bidirectional transfer direction */ +void spi_bidirectional_transfer_config(uint32_t spi_periph, uint32_t transfer_direction); + +/* SPI CRC functions */ +/* set SPI CRC polynomial */ +void spi_crc_polynomial_set(uint32_t spi_periph, uint16_t crc_poly); +/* get SPI CRC polynomial */ +uint16_t spi_crc_polynomial_get(uint32_t spi_periph); +/* turn on SPI CRC function */ +void spi_crc_on(uint32_t spi_periph); +/* turn off SPI CRC function */ +void spi_crc_off(uint32_t spi_periph); +/* SPI next data is CRC value */ +void spi_crc_next(uint32_t spi_periph); +/* get SPI CRC send value or receive value */ +uint16_t spi_crc_get(uint32_t spi_periph, uint8_t crc); + +/* SPI TI mode functions */ +/* enable SPI TI mode */ +void spi_ti_mode_enable(uint32_t spi_periph); +/* disable SPI TI mode */ +void spi_ti_mode_disable(uint32_t spi_periph); + +/* SPI NSS pulse mode functions */ +/* enable SPI NSS pulse mode */ +void spi_nssp_mode_enable(uint32_t spi_periph); +/* disable SPI NSS pulse mode */ +void spi_nssp_mode_disable(uint32_t spi_periph); +/* flag and interrupt functions */ +/* enable SPI and I2S interrupt */ +void spi_i2s_interrupt_enable(uint32_t spi_periph, uint8_t interrupt); +/* disable SPI and I2S interrupt */ +void spi_i2s_interrupt_disable(uint32_t spi_periph, uint8_t interrupt); +/* get SPI and I2S interrupt status */ +FlagStatus spi_i2s_interrupt_flag_get(uint32_t spi_periph, uint8_t interrupt); +/* get SPI and I2S flag status */ +FlagStatus spi_i2s_flag_get(uint32_t spi_periph, uint32_t flag); +/* clear SPI CRC error flag status */ +void spi_crc_error_clear(uint32_t spi_periph); + +#endif /* GD32VF103_SPI_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h new file mode 100644 index 0000000..ea2026e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_timer.h @@ -0,0 +1,722 @@ +/*! + \file gd32vf103_timer.h + \brief definitions for the TIMER + + \version 2019-06-05, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_TIMER_H +#define GD32VF103_TIMER_H + +#include "gd32vf103.h" + +/* TIMERx(x=0..13) definitions */ +#define TIMER0 (TIMER_BASE + 0x00012C00U) +#define TIMER1 (TIMER_BASE + 0x00000000U) +#define TIMER2 (TIMER_BASE + 0x00000400U) +#define TIMER3 (TIMER_BASE + 0x00000800U) +#define TIMER4 (TIMER_BASE + 0x00000C00U) +#define TIMER5 (TIMER_BASE + 0x00001000U) +#define TIMER6 (TIMER_BASE + 0x00001400U) + +/* registers definitions */ +#define TIMER_CTL0(timerx) REG32((timerx) + 0x00U) /*!< TIMER control register 0 */ +#define TIMER_CTL1(timerx) REG32((timerx) + 0x04U) /*!< TIMER control register 1 */ +#define TIMER_SMCFG(timerx) REG32((timerx) + 0x08U) /*!< TIMER slave mode configuration register */ +#define TIMER_DMAINTEN(timerx) REG32((timerx) + 0x0CU) /*!< TIMER DMA and interrupt enable register */ +#define TIMER_INTF(timerx) REG32((timerx) + 0x10U) /*!< TIMER interrupt flag register */ +#define TIMER_SWEVG(timerx) REG32((timerx) + 0x14U) /*!< TIMER software event generation register */ +#define TIMER_CHCTL0(timerx) REG32((timerx) + 0x18U) /*!< TIMER channel control register 0 */ +#define TIMER_CHCTL1(timerx) REG32((timerx) + 0x1CU) /*!< TIMER channel control register 1 */ +#define TIMER_CHCTL2(timerx) REG32((timerx) + 0x20U) /*!< TIMER channel control register 2 */ +#define TIMER_CNT(timerx) REG32((timerx) + 0x24U) /*!< TIMER counter register */ +#define TIMER_PSC(timerx) REG32((timerx) + 0x28U) /*!< TIMER prescaler register */ +#define TIMER_CAR(timerx) REG32((timerx) + 0x2CU) /*!< TIMER counter auto reload register */ +#define TIMER_CREP(timerx) REG32((timerx) + 0x30U) /*!< TIMER counter repetition register */ +#define TIMER_CH0CV(timerx) REG32((timerx) + 0x34U) /*!< TIMER channel 0 capture/compare value register */ +#define TIMER_CH1CV(timerx) REG32((timerx) + 0x38U) /*!< TIMER channel 1 capture/compare value register */ +#define TIMER_CH2CV(timerx) REG32((timerx) + 0x3CU) /*!< TIMER channel 2 capture/compare value register */ +#define TIMER_CH3CV(timerx) REG32((timerx) + 0x40U) /*!< TIMER channel 3 capture/compare value register */ +#define TIMER_CCHP(timerx) REG32((timerx) + 0x44U) /*!< TIMER channel complementary protection register */ +#define TIMER_DMACFG(timerx) REG32((timerx) + 0x48U) /*!< TIMER DMA configuration register */ +#define TIMER_DMATB(timerx) REG32((timerx) + 0x4CU) /*!< TIMER DMA transfer buffer register */ + +/* bits definitions */ +/* TIMER_CTL0 */ +#define TIMER_CTL0_CEN BIT(0) /*!< TIMER counter enable */ +#define TIMER_CTL0_UPDIS BIT(1) /*!< update disable */ +#define TIMER_CTL0_UPS BIT(2) /*!< update source */ +#define TIMER_CTL0_SPM BIT(3) /*!< single pulse mode */ +#define TIMER_CTL0_DIR BIT(4) /*!< timer counter direction */ +#define TIMER_CTL0_CAM BITS(5,6) /*!< center-aligned mode selection */ +#define TIMER_CTL0_ARSE BIT(7) /*!< auto-reload shadow enable */ +#define TIMER_CTL0_CKDIV BITS(8,9) /*!< clock division */ + +/* TIMER_CTL1 */ +#define TIMER_CTL1_CCSE BIT(0) /*!< commutation control shadow enable */ +#define TIMER_CTL1_CCUC BIT(2) /*!< commutation control shadow register update control */ +#define TIMER_CTL1_DMAS BIT(3) /*!< DMA request source selection */ +#define TIMER_CTL1_MMC BITS(4,6) /*!< master mode control */ +#define TIMER_CTL1_TI0S BIT(7) /*!< channel 0 trigger input selection(hall mode selection) */ +#define TIMER_CTL1_ISO0 BIT(8) /*!< idle state of channel 0 output */ +#define TIMER_CTL1_ISO0N BIT(9) /*!< idle state of channel 0 complementary output */ +#define TIMER_CTL1_ISO1 BIT(10) /*!< idle state of channel 1 output */ +#define TIMER_CTL1_ISO1N BIT(11) /*!< idle state of channel 1 complementary output */ +#define TIMER_CTL1_ISO2 BIT(12) /*!< idle state of channel 2 output */ +#define TIMER_CTL1_ISO2N BIT(13) /*!< idle state of channel 2 complementary output */ +#define TIMER_CTL1_ISO3 BIT(14) /*!< idle state of channel 3 output */ + +/* TIMER_SMCFG */ +#define TIMER_SMCFG_SMC BITS(0,2) /*!< slave mode control */ +#define TIMER_SMCFG_TRGS BITS(4,6) /*!< trigger selection */ +#define TIMER_SMCFG_MSM BIT(7) /*!< master-slave mode */ +#define TIMER_SMCFG_ETFC BITS(8,11) /*!< external trigger filter control */ +#define TIMER_SMCFG_ETPSC BITS(12,13) /*!< external trigger prescaler */ +#define TIMER_SMCFG_SMC1 BIT(14) /*!< part of SMC for enable external clock mode 1 */ +#define TIMER_SMCFG_ETP BIT(15) /*!< external trigger polarity */ + +/* TIMER_DMAINTEN */ +#define TIMER_DMAINTEN_UPIE BIT(0) /*!< update interrupt enable */ +#define TIMER_DMAINTEN_CH0IE BIT(1) /*!< channel 0 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CH1IE BIT(2) /*!< channel 1 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CH2IE BIT(3) /*!< channel 2 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CH3IE BIT(4) /*!< channel 3 capture/compare interrupt enable */ +#define TIMER_DMAINTEN_CMTIE BIT(5) /*!< commutation interrupt request enable */ +#define TIMER_DMAINTEN_TRGIE BIT(6) /*!< trigger interrupt enable */ +#define TIMER_DMAINTEN_BRKIE BIT(7) /*!< break interrupt enable */ +#define TIMER_DMAINTEN_UPDEN BIT(8) /*!< update DMA request enable */ +#define TIMER_DMAINTEN_CH0DEN BIT(9) /*!< channel 0 capture/compare DMA request enable */ +#define TIMER_DMAINTEN_CH1DEN BIT(10) /*!< channel 1 capture/compare DMA request enable */ +#define TIMER_DMAINTEN_CH2DEN BIT(11) /*!< channel 2 capture/compare DMA request enable */ +#define TIMER_DMAINTEN_CH3DEN BIT(12) /*!< channel 3 capture/compare DMA request enable */ +#define TIMER_DMAINTEN_CMTDEN BIT(13) /*!< commutation DMA request enable */ +#define TIMER_DMAINTEN_TRGDEN BIT(14) /*!< trigger DMA request enable */ + +/* TIMER_INTF */ +#define TIMER_INTF_UPIF BIT(0) /*!< update interrupt flag */ +#define TIMER_INTF_CH0IF BIT(1) /*!< channel 0 capture/compare interrupt flag */ +#define TIMER_INTF_CH1IF BIT(2) /*!< channel 1 capture/compare interrupt flag */ +#define TIMER_INTF_CH2IF BIT(3) /*!< channel 2 capture/compare interrupt flag */ +#define TIMER_INTF_CH3IF BIT(4) /*!< channel 3 capture/compare interrupt flag */ +#define TIMER_INTF_CMTIF BIT(5) /*!< channel commutation interrupt flag */ +#define TIMER_INTF_TRGIF BIT(6) /*!< trigger interrupt flag */ +#define TIMER_INTF_BRKIF BIT(7) /*!< break interrupt flag */ +#define TIMER_INTF_CH0OF BIT(9) /*!< channel 0 over capture flag */ +#define TIMER_INTF_CH1OF BIT(10) /*!< channel 1 over capture flag */ +#define TIMER_INTF_CH2OF BIT(11) /*!< channel 2 over capture flag */ +#define TIMER_INTF_CH3OF BIT(12) /*!< channel 3 over capture flag */ + +/* TIMER_SWEVG */ +#define TIMER_SWEVG_UPG BIT(0) /*!< update event generate */ +#define TIMER_SWEVG_CH0G BIT(1) /*!< channel 0 capture or compare event generation */ +#define TIMER_SWEVG_CH1G BIT(2) /*!< channel 1 capture or compare event generation */ +#define TIMER_SWEVG_CH2G BIT(3) /*!< channel 2 capture or compare event generation */ +#define TIMER_SWEVG_CH3G BIT(4) /*!< channel 3 capture or compare event generation */ +#define TIMER_SWEVG_CMTG BIT(5) /*!< channel commutation event generation */ +#define TIMER_SWEVG_TRGG BIT(6) /*!< trigger event generation */ +#define TIMER_SWEVG_BRKG BIT(7) /*!< break event generation */ + +/* TIMER_CHCTL0 */ +/* output compare mode */ +#define TIMER_CHCTL0_CH0MS BITS(0,1) /*!< channel 0 mode selection */ +#define TIMER_CHCTL0_CH0COMFEN BIT(2) /*!< channel 0 output compare fast enable */ +#define TIMER_CHCTL0_CH0COMSEN BIT(3) /*!< channel 0 output compare shadow enable */ +#define TIMER_CHCTL0_CH0COMCTL BITS(4,6) /*!< channel 0 output compare control */ +#define TIMER_CHCTL0_CH0COMCEN BIT(7) /*!< channel 0 output compare clear enable */ +#define TIMER_CHCTL0_CH1MS BITS(8,9) /*!< channel 1 mode selection */ +#define TIMER_CHCTL0_CH1COMFEN BIT(10) /*!< channel 1 output compare fast enable */ +#define TIMER_CHCTL0_CH1COMSEN BIT(11) /*!< channel 1 output compare shadow enable */ +#define TIMER_CHCTL0_CH1COMCTL BITS(12,14) /*!< channel 1 output compare control */ +#define TIMER_CHCTL0_CH1COMCEN BIT(15) /*!< channel 1 output compare clear enable */ +/* input capture mode */ +#define TIMER_CHCTL0_CH0CAPPSC BITS(2,3) /*!< channel 0 input capture prescaler */ +#define TIMER_CHCTL0_CH0CAPFLT BITS(4,7) /*!< channel 0 input capture filter control */ +#define TIMER_CHCTL0_CH1CAPPSC BITS(10,11) /*!< channel 1 input capture prescaler */ +#define TIMER_CHCTL0_CH1CAPFLT BITS(12,15) /*!< channel 1 input capture filter control */ + +/* TIMER_CHCTL1 */ +/* output compare mode */ +#define TIMER_CHCTL1_CH2MS BITS(0,1) /*!< channel 2 mode selection */ +#define TIMER_CHCTL1_CH2COMFEN BIT(2) /*!< channel 2 output compare fast enable */ +#define TIMER_CHCTL1_CH2COMSEN BIT(3) /*!< channel 2 output compare shadow enable */ +#define TIMER_CHCTL1_CH2COMCTL BITS(4,6) /*!< channel 2 output compare control */ +#define TIMER_CHCTL1_CH2COMCEN BIT(7) /*!< channel 2 output compare clear enable */ +#define TIMER_CHCTL1_CH3MS BITS(8,9) /*!< channel 3 mode selection */ +#define TIMER_CHCTL1_CH3COMFEN BIT(10) /*!< channel 3 output compare fast enable */ +#define TIMER_CHCTL1_CH3COMSEN BIT(11) /*!< channel 3 output compare shadow enable */ +#define TIMER_CHCTL1_CH3COMCTL BITS(12,14) /*!< channel 3 output compare control */ +#define TIMER_CHCTL1_CH3COMCEN BIT(15) /*!< channel 3 output compare clear enable */ +/* input capture mode */ +#define TIMER_CHCTL1_CH2CAPPSC BITS(2,3) /*!< channel 2 input capture prescaler */ +#define TIMER_CHCTL1_CH2CAPFLT BITS(4,7) /*!< channel 2 input capture filter control */ +#define TIMER_CHCTL1_CH3CAPPSC BITS(10,11) /*!< channel 3 input capture prescaler */ +#define TIMER_CHCTL1_CH3CAPFLT BITS(12,15) /*!< channel 3 input capture filter control */ + +/* TIMER_CHCTL2 */ +#define TIMER_CHCTL2_CH0EN BIT(0) /*!< channel 0 capture/compare function enable */ +#define TIMER_CHCTL2_CH0P BIT(1) /*!< channel 0 capture/compare function polarity */ +#define TIMER_CHCTL2_CH0NEN BIT(2) /*!< channel 0 complementary output enable */ +#define TIMER_CHCTL2_CH0NP BIT(3) /*!< channel 0 complementary output polarity */ +#define TIMER_CHCTL2_CH1EN BIT(4) /*!< channel 1 capture/compare function enable */ +#define TIMER_CHCTL2_CH1P BIT(5) /*!< channel 1 capture/compare function polarity */ +#define TIMER_CHCTL2_CH1NEN BIT(6) /*!< channel 1 complementary output enable */ +#define TIMER_CHCTL2_CH1NP BIT(7) /*!< channel 1 complementary output polarity */ +#define TIMER_CHCTL2_CH2EN BIT(8) /*!< channel 2 capture/compare function enable */ +#define TIMER_CHCTL2_CH2P BIT(9) /*!< channel 2 capture/compare function polarity */ +#define TIMER_CHCTL2_CH2NEN BIT(10) /*!< channel 2 complementary output enable */ +#define TIMER_CHCTL2_CH2NP BIT(11) /*!< channel 2 complementary output polarity */ +#define TIMER_CHCTL2_CH3EN BIT(12) /*!< channel 3 capture/compare function enable */ +#define TIMER_CHCTL2_CH3P BIT(13) /*!< channel 3 capture/compare function polarity */ + +/* TIMER_CNT */ +#define TIMER_CNT_CNT BITS(0,15) /*!< 16 bit timer counter */ + +/* TIMER_PSC */ +#define TIMER_PSC_PSC BITS(0,15) /*!< prescaler value of the counter clock */ + +/* TIMER_CAR */ +#define TIMER_CAR_CARL BITS(0,15) /*!< 16 bit counter auto reload value */ + +/* TIMER_CREP */ +#define TIMER_CREP_CREP BITS(0,7) /*!< counter repetition value */ + +/* TIMER_CH0CV */ +#define TIMER_CH0CV_CH0VAL BITS(0,15) /*!< 16 bit capture/compare value of channel 0 */ + +/* TIMER_CH1CV */ +#define TIMER_CH1CV_CH1VAL BITS(0,15) /*!< 16 bit capture/compare value of channel 1 */ + +/* TIMER_CH2CV */ +#define TIMER_CH2CV_CH2VAL BITS(0,15) /*!< 16 bit capture/compare value of channel 2 */ + +/* TIMER_CH3CV */ +#define TIMER_CH3CV_CH3VAL BITS(0,15) /*!< 16 bit capture/compare value of channel 3 */ + +/* TIMER_CCHP */ +#define TIMER_CCHP_DTCFG BITS(0,7) /*!< dead time configure */ +#define TIMER_CCHP_PROT BITS(8,9) /*!< complementary register protect control */ +#define TIMER_CCHP_IOS BIT(10) /*!< idle mode off-state configure */ +#define TIMER_CCHP_ROS BIT(11) /*!< run mode off-state configure */ +#define TIMER_CCHP_BRKEN BIT(12) /*!< break enable */ +#define TIMER_CCHP_BRKP BIT(13) /*!< break polarity */ +#define TIMER_CCHP_OAEN BIT(14) /*!< output automatic enable */ +#define TIMER_CCHP_POEN BIT(15) /*!< primary output enable */ + +/* TIMER_DMACFG */ +#define TIMER_DMACFG_DMATA BITS(0,4) /*!< DMA transfer access start address */ +#define TIMER_DMACFG_DMATC BITS(8,12) /*!< DMA transfer count */ + +/* TIMER_DMATB */ +#define TIMER_DMATB_DMATB BITS(0,15) /*!< DMA transfer buffer address */ + +/* constants definitions */ +/* TIMER init parameter struct definitions */ +typedef struct +{ + uint16_t prescaler; /*!< prescaler value */ + uint16_t alignedmode; /*!< aligned mode */ + uint16_t counterdirection; /*!< counter direction */ + uint32_t period; /*!< period value */ + uint16_t clockdivision; /*!< clock division value */ + uint8_t repetitioncounter; /*!< the counter repetition value */ +}timer_parameter_struct; + +/* break parameter struct definitions */ +typedef struct +{ + uint16_t runoffstate; /*!< run mode off-state */ + uint16_t ideloffstate; /*!< idle mode off-state */ + uint16_t deadtime; /*!< dead time */ + uint16_t breakpolarity; /*!< break polarity */ + uint16_t outputautostate; /*!< output automatic enable */ + uint16_t protectmode; /*!< complementary register protect control */ + uint16_t breakstate; /*!< break enable */ +}timer_break_parameter_struct; + +/* channel output parameter struct definitions */ +typedef struct +{ + uint16_t outputstate; /*!< channel output state */ + uint16_t outputnstate; /*!< channel complementary output state */ + uint16_t ocpolarity; /*!< channel output polarity */ + uint16_t ocnpolarity; /*!< channel complementary output polarity */ + uint16_t ocidlestate; /*!< idle state of channel output */ + uint16_t ocnidlestate; /*!< idle state of channel complementary output */ +}timer_oc_parameter_struct; + +/* channel input parameter struct definitions */ +typedef struct +{ + uint16_t icpolarity; /*!< channel input polarity */ + uint16_t icselection; /*!< channel input mode selection */ + uint16_t icprescaler; /*!< channel input capture prescaler */ + uint16_t icfilter; /*!< channel input capture filter control */ +}timer_ic_parameter_struct; + +/* TIMER interrupt enable or disable */ +#define TIMER_INT_UP TIMER_DMAINTEN_UPIE /*!< update interrupt */ +#define TIMER_INT_CH0 TIMER_DMAINTEN_CH0IE /*!< channel 0 interrupt */ +#define TIMER_INT_CH1 TIMER_DMAINTEN_CH1IE /*!< channel 1 interrupt */ +#define TIMER_INT_CH2 TIMER_DMAINTEN_CH2IE /*!< channel 2 interrupt */ +#define TIMER_INT_CH3 TIMER_DMAINTEN_CH3IE /*!< channel 3 interrupt */ +#define TIMER_INT_CMT TIMER_DMAINTEN_CMTIE /*!< channel commutation interrupt flag */ +#define TIMER_INT_TRG TIMER_DMAINTEN_TRGIE /*!< trigger interrupt */ +#define TIMER_INT_BRK TIMER_DMAINTEN_BRKIE /*!< break interrupt */ + +/* TIMER interrupt flag */ +#define TIMER_INT_FLAG_UP TIMER_INT_UP /*!< update interrupt */ +#define TIMER_INT_FLAG_CH0 TIMER_INT_CH0 /*!< channel 0 interrupt */ +#define TIMER_INT_FLAG_CH1 TIMER_INT_CH1 /*!< channel 1 interrupt */ +#define TIMER_INT_FLAG_CH2 TIMER_INT_CH2 /*!< channel 2 interrupt */ +#define TIMER_INT_FLAG_CH3 TIMER_INT_CH3 /*!< channel 3 interrupt */ +#define TIMER_INT_FLAG_CMT TIMER_INT_CMT /*!< channel commutation interrupt flag */ +#define TIMER_INT_FLAG_TRG TIMER_INT_TRG /*!< trigger interrupt */ +#define TIMER_INT_FLAG_BRK TIMER_INT_BRK + +/* TIMER flag */ +#define TIMER_FLAG_UP TIMER_INTF_UPIF /*!< update flag */ +#define TIMER_FLAG_CH0 TIMER_INTF_CH0IF /*!< channel 0 flag */ +#define TIMER_FLAG_CH1 TIMER_INTF_CH1IF /*!< channel 1 flag */ +#define TIMER_FLAG_CH2 TIMER_INTF_CH2IF /*!< channel 2 flag */ +#define TIMER_FLAG_CH3 TIMER_INTF_CH3IF /*!< channel 3 flag */ +#define TIMER_FLAG_CMT TIMER_INTF_CMTIF /*!< channel control update flag */ +#define TIMER_FLAG_TRG TIMER_INTF_TRGIF /*!< trigger flag */ +#define TIMER_FLAG_BRK TIMER_INTF_BRKIF /*!< break flag */ +#define TIMER_FLAG_CH0O TIMER_INTF_CH0OF /*!< channel 0 overcapture flag */ +#define TIMER_FLAG_CH1O TIMER_INTF_CH1OF /*!< channel 1 overcapture flag */ +#define TIMER_FLAG_CH2O TIMER_INTF_CH2OF /*!< channel 2 overcapture flag */ +#define TIMER_FLAG_CH3O TIMER_INTF_CH3OF /*!< channel 3 overcapture flag */ + +/* TIMER DMA source enable */ +#define TIMER_DMA_UPD ((uint16_t)TIMER_DMAINTEN_UPDEN) /*!< update DMA enable */ +#define TIMER_DMA_CH0D ((uint16_t)TIMER_DMAINTEN_CH0DEN) /*!< channel 0 DMA enable */ +#define TIMER_DMA_CH1D ((uint16_t)TIMER_DMAINTEN_CH1DEN) /*!< channel 1 DMA enable */ +#define TIMER_DMA_CH2D ((uint16_t)TIMER_DMAINTEN_CH2DEN) /*!< channel 2 DMA enable */ +#define TIMER_DMA_CH3D ((uint16_t)TIMER_DMAINTEN_CH3DEN) /*!< channel 3 DMA enable */ +#define TIMER_DMA_CMTD ((uint16_t)TIMER_DMAINTEN_CMTDEN) /*!< commutation DMA request enable */ +#define TIMER_DMA_TRGD ((uint16_t)TIMER_DMAINTEN_TRGDEN) /*!< trigger DMA enable */ + +/* channel DMA request source selection */ +#define TIMER_DMAREQUEST_UPDATEEVENT TIMER_CTL1_DMAS /*!< DMA request of channel n is sent when update event occurs */ +#define TIMER_DMAREQUEST_CHANNELEVENT ((uint32_t)0x00000000U) /*!< DMA request of channel n is sent when channel n event occurs */ + +/* DMA access base address */ +#define DMACFG_DMATA(regval) (BITS(0, 4) & ((uint32_t)(regval) << 0U)) +#define TIMER_DMACFG_DMATA_CTL0 DMACFG_DMATA(0) /*!< DMA transfer address is TIMER_CTL0 */ +#define TIMER_DMACFG_DMATA_CTL1 DMACFG_DMATA(1) /*!< DMA transfer address is TIMER_CTL1 */ +#define TIMER_DMACFG_DMATA_SMCFG DMACFG_DMATA(2) /*!< DMA transfer address is TIMER_SMCFG */ +#define TIMER_DMACFG_DMATA_DMAINTEN DMACFG_DMATA(3) /*!< DMA transfer address is TIMER_DMAINTEN */ +#define TIMER_DMACFG_DMATA_INTF DMACFG_DMATA(4) /*!< DMA transfer address is TIMER_INTF */ +#define TIMER_DMACFG_DMATA_SWEVG DMACFG_DMATA(5) /*!< DMA transfer address is TIMER_SWEVG */ +#define TIMER_DMACFG_DMATA_CHCTL0 DMACFG_DMATA(6) /*!< DMA transfer address is TIMER_CHCTL0 */ +#define TIMER_DMACFG_DMATA_CHCTL1 DMACFG_DMATA(7) /*!< DMA transfer address is TIMER_CHCTL1 */ +#define TIMER_DMACFG_DMATA_CHCTL2 DMACFG_DMATA(8) /*!< DMA transfer address is TIMER_CHCTL2 */ +#define TIMER_DMACFG_DMATA_CNT DMACFG_DMATA(9) /*!< DMA transfer address is TIMER_CNT */ +#define TIMER_DMACFG_DMATA_PSC DMACFG_DMATA(10) /*!< DMA transfer address is TIMER_PSC */ +#define TIMER_DMACFG_DMATA_CAR DMACFG_DMATA(11) /*!< DMA transfer address is TIMER_CAR */ +#define TIMER_DMACFG_DMATA_CREP DMACFG_DMATA(12) /*!< DMA transfer address is TIMER_CREP */ +#define TIMER_DMACFG_DMATA_CH0CV DMACFG_DMATA(13) /*!< DMA transfer address is TIMER_CH0CV */ +#define TIMER_DMACFG_DMATA_CH1CV DMACFG_DMATA(14) /*!< DMA transfer address is TIMER_CH1CV */ +#define TIMER_DMACFG_DMATA_CH2CV DMACFG_DMATA(15) /*!< DMA transfer address is TIMER_CH2CV */ +#define TIMER_DMACFG_DMATA_CH3CV DMACFG_DMATA(16) /*!< DMA transfer address is TIMER_CH3CV */ +#define TIMER_DMACFG_DMATA_CCHP DMACFG_DMATA(17) /*!< DMA transfer address is TIMER_CCHP */ +#define TIMER_DMACFG_DMATA_DMACFG DMACFG_DMATA(18) /*!< DMA transfer address is TIMER_DMACFG */ + +/* DMA access burst length */ +#define DMACFG_DMATC(regval) (BITS(8, 12) & ((uint32_t)(regval) << 8U)) +#define TIMER_DMACFG_DMATC_1TRANSFER DMACFG_DMATC(0) /*!< DMA transfer 1 time */ +#define TIMER_DMACFG_DMATC_2TRANSFER DMACFG_DMATC(1) /*!< DMA transfer 2 times */ +#define TIMER_DMACFG_DMATC_3TRANSFER DMACFG_DMATC(2) /*!< DMA transfer 3 times */ +#define TIMER_DMACFG_DMATC_4TRANSFER DMACFG_DMATC(3) /*!< DMA transfer 4 times */ +#define TIMER_DMACFG_DMATC_5TRANSFER DMACFG_DMATC(4) /*!< DMA transfer 5 times */ +#define TIMER_DMACFG_DMATC_6TRANSFER DMACFG_DMATC(5) /*!< DMA transfer 6 times */ +#define TIMER_DMACFG_DMATC_7TRANSFER DMACFG_DMATC(6) /*!< DMA transfer 7 times */ +#define TIMER_DMACFG_DMATC_8TRANSFER DMACFG_DMATC(7) /*!< DMA transfer 8 times */ +#define TIMER_DMACFG_DMATC_9TRANSFER DMACFG_DMATC(8) /*!< DMA transfer 9 times */ +#define TIMER_DMACFG_DMATC_10TRANSFER DMACFG_DMATC(9) /*!< DMA transfer 10 times */ +#define TIMER_DMACFG_DMATC_11TRANSFER DMACFG_DMATC(10) /*!< DMA transfer 11 times */ +#define TIMER_DMACFG_DMATC_12TRANSFER DMACFG_DMATC(11) /*!< DMA transfer 12 times */ +#define TIMER_DMACFG_DMATC_13TRANSFER DMACFG_DMATC(12) /*!< DMA transfer 13 times */ +#define TIMER_DMACFG_DMATC_14TRANSFER DMACFG_DMATC(13) /*!< DMA transfer 14 times */ +#define TIMER_DMACFG_DMATC_15TRANSFER DMACFG_DMATC(14) /*!< DMA transfer 15 times */ +#define TIMER_DMACFG_DMATC_16TRANSFER DMACFG_DMATC(15) /*!< DMA transfer 16 times */ +#define TIMER_DMACFG_DMATC_17TRANSFER DMACFG_DMATC(16) /*!< DMA transfer 17 times */ +#define TIMER_DMACFG_DMATC_18TRANSFER DMACFG_DMATC(17) /*!< DMA transfer 18 times */ + +/* TIMER software event generation source */ +#define TIMER_EVENT_SRC_UPG ((uint16_t)0x0001U) /*!< update event generation */ +#define TIMER_EVENT_SRC_CH0G ((uint16_t)0x0002U) /*!< channel 0 capture or compare event generation */ +#define TIMER_EVENT_SRC_CH1G ((uint16_t)0x0004U) /*!< channel 1 capture or compare event generation */ +#define TIMER_EVENT_SRC_CH2G ((uint16_t)0x0008U) /*!< channel 2 capture or compare event generation */ +#define TIMER_EVENT_SRC_CH3G ((uint16_t)0x0010U) /*!< channel 3 capture or compare event generation */ +#define TIMER_EVENT_SRC_CMTG ((uint16_t)0x0020U) /*!< channel commutation event generation */ +#define TIMER_EVENT_SRC_TRGG ((uint16_t)0x0040U) /*!< trigger event generation */ +#define TIMER_EVENT_SRC_BRKG ((uint16_t)0x0080U) /*!< break event generation */ + +/* center-aligned mode selection */ +#define CTL0_CAM(regval) ((uint16_t)(BITS(5, 6) & ((uint32_t)(regval) << 5U))) +#define TIMER_COUNTER_EDGE CTL0_CAM(0) /*!< edge-aligned mode */ +#define TIMER_COUNTER_CENTER_DOWN CTL0_CAM(1) /*!< center-aligned and counting down assert mode */ +#define TIMER_COUNTER_CENTER_UP CTL0_CAM(2) /*!< center-aligned and counting up assert mode */ +#define TIMER_COUNTER_CENTER_BOTH CTL0_CAM(3) /*!< center-aligned and counting up/down assert mode */ + +/* TIMER prescaler reload mode */ +#define TIMER_PSC_RELOAD_NOW TIMER_SWEVG_UPG /*!< the prescaler is loaded right now */ +#define TIMER_PSC_RELOAD_UPDATE ((uint32_t)0x00000000U) /*!< the prescaler is loaded at the next update event */ + +/* count direction */ +#define TIMER_COUNTER_UP ((uint16_t)0x0000U) /*!< counter up direction */ +#define TIMER_COUNTER_DOWN ((uint16_t)TIMER_CTL0_DIR) /*!< counter down direction */ + +/* specify division ratio between TIMER clock and dead-time and sampling clock */ +#define CTL0_CKDIV(regval) ((uint16_t)(BITS(8, 9) & ((uint32_t)(regval) << 8U))) +#define TIMER_CKDIV_DIV1 CTL0_CKDIV(0) /*!< clock division value is 1,fDTS=fTIMER_CK */ +#define TIMER_CKDIV_DIV2 CTL0_CKDIV(1) /*!< clock division value is 2,fDTS= fTIMER_CK/2 */ +#define TIMER_CKDIV_DIV4 CTL0_CKDIV(2) /*!< clock division value is 4, fDTS= fTIMER_CK/4 */ + +/* single pulse mode */ +#define TIMER_SP_MODE_SINGLE TIMER_CTL0_SPM /*!< single pulse mode */ +#define TIMER_SP_MODE_REPETITIVE ((uint32_t)0x00000000U) /*!< repetitive pulse mode */ + +/* update source */ +#define TIMER_UPDATE_SRC_REGULAR TIMER_CTL0_UPS /*!< update generate only by counter overflow/underflow */ +#define TIMER_UPDATE_SRC_GLOBAL ((uint32_t)0x00000000U) /*!< update generate by setting of UPG bit or the counter overflow/underflow,or the slave mode controller trigger */ + +/* run mode off-state configure */ +#define TIMER_ROS_STATE_ENABLE ((uint16_t)TIMER_CCHP_ROS) /*!< when POEN bit is set, the channel output signals(CHx_O/CHx_ON) are enabled, with relationship to CHxEN/CHxNEN bits */ +#define TIMER_ROS_STATE_DISABLE ((uint16_t)0x0000U) /*!< when POEN bit is set, the channel output signals(CHx_O/CHx_ON) are disabled */ + + +/* idle mode off-state configure */ +#define TIMER_IOS_STATE_ENABLE ((uint16_t)TIMER_CCHP_IOS) /*!< when POEN bit is reset, he channel output signals(CHx_O/CHx_ON) are enabled, with relationship to CHxEN/CHxNEN bits */ +#define TIMER_IOS_STATE_DISABLE ((uint16_t)0x0000U) /*!< when POEN bit is reset, the channel output signals(CHx_O/CHx_ON) are disabled */ + +/* break input polarity */ +#define TIMER_BREAK_POLARITY_LOW ((uint16_t)0x0000U) /*!< break input polarity is low */ +#define TIMER_BREAK_POLARITY_HIGH ((uint16_t)TIMER_CCHP_BRKP) /*!< break input polarity is high */ + +/* output automatic enable */ +#define TIMER_OUTAUTO_ENABLE ((uint16_t)TIMER_CCHP_OAEN) /*!< output automatic enable */ +#define TIMER_OUTAUTO_DISABLE ((uint16_t)0x0000U) /*!< output automatic disable */ + +/* complementary register protect control */ +#define CCHP_PROT(regval) ((uint16_t)(BITS(8, 9) & ((uint32_t)(regval) << 8U))) +#define TIMER_CCHP_PROT_OFF CCHP_PROT(0) /*!< protect disable */ +#define TIMER_CCHP_PROT_0 CCHP_PROT(1) /*!< PROT mode 0 */ +#define TIMER_CCHP_PROT_1 CCHP_PROT(2) /*!< PROT mode 1 */ +#define TIMER_CCHP_PROT_2 CCHP_PROT(3) /*!< PROT mode 2 */ + +/* break input enable */ +#define TIMER_BREAK_ENABLE ((uint16_t)TIMER_CCHP_BRKEN) /*!< break input enable */ +#define TIMER_BREAK_DISABLE ((uint16_t)0x0000U) /*!< break input disable */ + +/* TIMER channel n(n=0,1,2,3) */ +#define TIMER_CH_0 ((uint16_t)0x0000U) /*!< TIMER channel 0(TIMERx(x=0..4)) */ +#define TIMER_CH_1 ((uint16_t)0x0001U) /*!< TIMER channel 1(TIMERx(x=0..4)) */ +#define TIMER_CH_2 ((uint16_t)0x0002U) /*!< TIMER channel 2(TIMERx(x=0..4)) */ +#define TIMER_CH_3 ((uint16_t)0x0003U) /*!< TIMER channel 3(TIMERx(x=0..4)) */ + +/* channel enable state */ +#define TIMER_CCX_ENABLE ((uint16_t)0x0001U) /*!< channel enable */ +#define TIMER_CCX_DISABLE ((uint16_t)0x0000U) /*!< channel disable */ + +/* channel complementary output enable state */ +#define TIMER_CCXN_ENABLE ((uint16_t)0x0004U) /*!< channel complementary enable */ +#define TIMER_CCXN_DISABLE ((uint16_t)0x0000U) /*!< channel complementary disable */ + +/* channel output polarity */ +#define TIMER_OC_POLARITY_HIGH ((uint16_t)0x0000U) /*!< channel output polarity is high */ +#define TIMER_OC_POLARITY_LOW ((uint16_t)0x0002U) /*!< channel output polarity is low */ + +/* channel complementary output polarity */ +#define TIMER_OCN_POLARITY_HIGH ((uint16_t)0x0000U) /*!< channel complementary output polarity is high */ +#define TIMER_OCN_POLARITY_LOW ((uint16_t)0x0008U) /*!< channel complementary output polarity is low */ + +/* idle state of channel output */ +#define TIMER_OC_IDLE_STATE_HIGH ((uint16_t)0x0100) /*!< idle state of channel output is high */ +#define TIMER_OC_IDLE_STATE_LOW ((uint16_t)0x0000) /*!< idle state of channel output is low */ + +/* idle state of channel complementary output */ +#define TIMER_OCN_IDLE_STATE_HIGH ((uint16_t)0x0200U) /*!< idle state of channel complementary output is high */ +#define TIMER_OCN_IDLE_STATE_LOW ((uint16_t)0x0000U) /*!< idle state of channel complementary output is low */ + +/* channel output compare mode */ +#define TIMER_OC_MODE_TIMING ((uint16_t)0x0000U) /*!< timing mode */ +#define TIMER_OC_MODE_ACTIVE ((uint16_t)0x0010U) /*!< active mode */ +#define TIMER_OC_MODE_INACTIVE ((uint16_t)0x0020U) /*!< inactive mode */ +#define TIMER_OC_MODE_TOGGLE ((uint16_t)0x0030U) /*!< toggle mode */ +#define TIMER_OC_MODE_LOW ((uint16_t)0x0040U) /*!< force low mode */ +#define TIMER_OC_MODE_HIGH ((uint16_t)0x0050U) /*!< force high mode */ +#define TIMER_OC_MODE_PWM0 ((uint16_t)0x0060U) /*!< PWM0 mode */ +#define TIMER_OC_MODE_PWM1 ((uint16_t)0x0070U) /*!< PWM1 mode */ + +/* channel output compare shadow enable */ +#define TIMER_OC_SHADOW_ENABLE ((uint16_t)0x0008U) /*!< channel output shadow state enable */ +#define TIMER_OC_SHADOW_DISABLE ((uint16_t)0x0000U) /*!< channel output shadow state disable */ + +/* channel output compare fast enable */ +#define TIMER_OC_FAST_ENABLE ((uint16_t)0x0004) /*!< channel output fast function enable */ +#define TIMER_OC_FAST_DISABLE ((uint16_t)0x0000) /*!< channel output fast function disable */ + +/* channel output compare clear enable */ +#define TIMER_OC_CLEAR_ENABLE ((uint16_t)0x0080U) /*!< channel output clear function enable */ +#define TIMER_OC_CLEAR_DISABLE ((uint16_t)0x0000U) /*!< channel output clear function disable */ + +/* channel control shadow register update control */ +#define TIMER_UPDATECTL_CCU ((uint32_t)0x00000000U) /*!< the shadow registers update by when CMTG bit is set */ +#define TIMER_UPDATECTL_CCUTRI TIMER_CTL1_CCUC /*!< the shadow registers update by when CMTG bit is set or an rising edge of TRGI occurs */ + +/* channel input capture polarity */ +#define TIMER_IC_POLARITY_RISING ((uint16_t)0x0000U) /*!< input capture rising edge */ +#define TIMER_IC_POLARITY_FALLING ((uint16_t)0x0002U) /*!< input capture falling edge */ +#define TIMER_IC_POLARITY_BOTH_EDGE ((uint16_t)0x000AU) /*!< input capture both edge */ + +/* TIMER input capture selection */ +#define TIMER_IC_SELECTION_DIRECTTI ((uint16_t)0x0001U) /*!< channel n is configured as input and icy is mapped on CIy */ +#define TIMER_IC_SELECTION_INDIRECTTI ((uint16_t)0x0002U) /*!< channel n is configured as input and icy is mapped on opposite input */ +#define TIMER_IC_SELECTION_ITS ((uint16_t)0x0003U) /*!< channel n is configured as input and icy is mapped on ITS */ + +/* channel input capture prescaler */ +#define TIMER_IC_PSC_DIV1 ((uint16_t)0x0000U) /*!< no prescaler */ +#define TIMER_IC_PSC_DIV2 ((uint16_t)0x0004U) /*!< divided by 2 */ +#define TIMER_IC_PSC_DIV4 ((uint16_t)0x0008U) /*!< divided by 4 */ +#define TIMER_IC_PSC_DIV8 ((uint16_t)0x000CU) /*!< divided by 8 */ + +/* trigger selection */ +#define SMCFG_TRGSEL(regval) (BITS(4, 6) & ((uint32_t)(regval) << 4U)) +#define TIMER_SMCFG_TRGSEL_ITI0 SMCFG_TRGSEL(0) /*!< internal trigger 0 */ +#define TIMER_SMCFG_TRGSEL_ITI1 SMCFG_TRGSEL(1) /*!< internal trigger 1 */ +#define TIMER_SMCFG_TRGSEL_ITI2 SMCFG_TRGSEL(2) /*!< internal trigger 2 */ +#define TIMER_SMCFG_TRGSEL_ITI3 SMCFG_TRGSEL(3) /*!< internal trigger 3 */ +#define TIMER_SMCFG_TRGSEL_CI0F_ED SMCFG_TRGSEL(4) /*!< TI0 Edge Detector */ +#define TIMER_SMCFG_TRGSEL_CI0FE0 SMCFG_TRGSEL(5) /*!< filtered TIMER input 0 */ +#define TIMER_SMCFG_TRGSEL_CI1FE1 SMCFG_TRGSEL(6) /*!< filtered TIMER input 1 */ +#define TIMER_SMCFG_TRGSEL_ETIFP SMCFG_TRGSEL(7) /*!< filtered external trigger input */ + +/* master mode control */ +#define CTL1_MMC(regval) (BITS(4, 6) & ((uint32_t)(regval) << 4U)) +#define TIMER_TRI_OUT_SRC_RESET CTL1_MMC(0) /*!< the UPG bit as trigger output */ +#define TIMER_TRI_OUT_SRC_ENABLE CTL1_MMC(1) /*!< the counter enable signal TIMER_CTL0_CEN as trigger output */ +#define TIMER_TRI_OUT_SRC_UPDATE CTL1_MMC(2) /*!< update event as trigger output */ +#define TIMER_TRI_OUT_SRC_CH0 CTL1_MMC(3) /*!< a capture or a compare match occurred in channel 0 as trigger output TRGO */ +#define TIMER_TRI_OUT_SRC_O0CPRE CTL1_MMC(4) /*!< O0CPRE as trigger output */ +#define TIMER_TRI_OUT_SRC_O1CPRE CTL1_MMC(5) /*!< O1CPRE as trigger output */ +#define TIMER_TRI_OUT_SRC_O2CPRE CTL1_MMC(6) /*!< O2CPRE as trigger output */ +#define TIMER_TRI_OUT_SRC_O3CPRE CTL1_MMC(7) /*!< O3CPRE as trigger output */ + +/* slave mode control */ +#define SMCFG_SMC(regval) (BITS(0, 2) & ((uint32_t)(regval) << 0U)) +#define TIMER_SLAVE_MODE_DISABLE SMCFG_SMC(0) /*!< slave mode disable */ +#define TIMER_ENCODER_MODE0 SMCFG_SMC(1) /*!< encoder mode 0 */ +#define TIMER_ENCODER_MODE1 SMCFG_SMC(2) /*!< encoder mode 1 */ +#define TIMER_ENCODER_MODE2 SMCFG_SMC(3) /*!< encoder mode 2 */ +#define TIMER_SLAVE_MODE_RESTART SMCFG_SMC(4) /*!< restart mode */ +#define TIMER_SLAVE_MODE_PAUSE SMCFG_SMC(5) /*!< pause mode */ +#define TIMER_SLAVE_MODE_EVENT SMCFG_SMC(6) /*!< event mode */ +#define TIMER_SLAVE_MODE_EXTERNAL0 SMCFG_SMC(7) /*!< external clock mode 0 */ + +/* master slave mode selection */ +#define TIMER_MASTER_SLAVE_MODE_ENABLE TIMER_SMCFG_MSM /*!< master slave mode enable */ +#define TIMER_MASTER_SLAVE_MODE_DISABLE ((uint32_t)0x00000000U) /*!< master slave mode disable */ + +/* external trigger prescaler */ +#define SMCFG_ETPSC(regval) (BITS(12, 13) & ((uint32_t)(regval) << 12U)) +#define TIMER_EXT_TRI_PSC_OFF SMCFG_ETPSC(0) /*!< no divided */ +#define TIMER_EXT_TRI_PSC_DIV2 SMCFG_ETPSC(1) /*!< divided by 2 */ +#define TIMER_EXT_TRI_PSC_DIV4 SMCFG_ETPSC(2) /*!< divided by 4 */ +#define TIMER_EXT_TRI_PSC_DIV8 SMCFG_ETPSC(3) /*!< divided by 8 */ + +/* external trigger polarity */ +#define TIMER_ETP_FALLING TIMER_SMCFG_ETP /*!< active low or falling edge active */ +#define TIMER_ETP_RISING ((uint32_t)0x00000000U) /*!< active high or rising edge active */ + +/* channel 0 trigger input selection */ +#define TIMER_HALLINTERFACE_ENABLE TIMER_CTL1_TI0S /*!< TIMER hall sensor mode enable */ +#define TIMER_HALLINTERFACE_DISABLE ((uint32_t)0x00000000U) /*!< TIMER hall sensor mode disable */ + +/* TIMERx(x=0..4) write CHxVAL register selection */ +#define TIMER_CHVSEL_ENABLE ((uint16_t)TIMER_CFG_OUTSEL) /*!< write CHxVAL register selection enable */ +#define TIMER_CHVSEL_DISABLE ((uint16_t)0x0000U) /*!< write CHxVAL register selection disable */ + +/* function declarations */ +/* TIMER timebase */ +/* deinit a timer */ +void timer_deinit(uint32_t timer_periph); +/* initialize TIMER init parameter struct */ +void timer_struct_para_init(timer_parameter_struct* initpara); +/* initialize TIMER counter */ +void timer_init(uint32_t timer_periph, timer_parameter_struct* initpara); +/* enable a timer */ +void timer_enable(uint32_t timer_periph); +/* disable a timer */ +void timer_disable(uint32_t timer_periph); +/* enable the auto reload shadow function */ +void timer_auto_reload_shadow_enable(uint32_t timer_periph); +/* disable the auto reload shadow function */ +void timer_auto_reload_shadow_disable(uint32_t timer_periph); +/* enable the update event */ +void timer_update_event_enable(uint32_t timer_periph); +/* disable the update event */ +void timer_update_event_disable(uint32_t timer_periph); +/* set TIMER counter alignment mode */ +void timer_counter_alignment(uint32_t timer_periph, uint16_t aligned); +/* set TIMER counter up direction */ +void timer_counter_up_direction(uint32_t timer_periph); +/* set TIMER counter down direction */ +void timer_counter_down_direction(uint32_t timer_periph); + +/* configure TIMER prescaler */ +void timer_prescaler_config(uint32_t timer_periph, uint16_t prescaler, uint32_t pscreload); +/* configure TIMER repetition register value */ +void timer_repetition_value_config(uint32_t timer_periph, uint16_t repetition); +/* configure TIMER autoreload register value */ +void timer_autoreload_value_config(uint32_t timer_periph, uint16_t autoreload); +/* configure TIMER counter register value */ +void timer_counter_value_config(uint32_t timer_periph, uint16_t counter); +/* read TIMER counter value */ +uint32_t timer_counter_read(uint32_t timer_periph); +/* read TIMER prescaler value */ +uint16_t timer_prescaler_read(uint32_t timer_periph); +/* configure TIMER single pulse mode */ +void timer_single_pulse_mode_config(uint32_t timer_periph, uint32_t spmode); +/* configure TIMER update source */ +void timer_update_source_config(uint32_t timer_periph, uint32_t update); + +/* TIMER DMA and event */ +/* enable the TIMER DMA */ +void timer_dma_enable(uint32_t timer_periph, uint16_t dma); +/* disable the TIMER DMA */ +void timer_dma_disable(uint32_t timer_periph, uint16_t dma); +/* channel DMA request source selection */ +void timer_channel_dma_request_source_select(uint32_t timer_periph, uint32_t dma_request); +/* configure the TIMER DMA transfer */ +void timer_dma_transfer_config(uint32_t timer_periph, uint32_t dma_baseaddr, uint32_t dma_lenth); +/* software generate events */ +void timer_event_software_generate(uint32_t timer_periph, uint16_t event); + +/* TIMER channel complementary protection */ +/* initialize TIMER break parameter struct */ +void timer_break_struct_para_init(timer_break_parameter_struct* breakpara); +/* configure TIMER break function */ +void timer_break_config(uint32_t timer_periph, timer_break_parameter_struct* breakpara); +/* enable TIMER break function */ +void timer_break_enable(uint32_t timer_periph); +/* disable TIMER break function */ +void timer_break_disable(uint32_t timer_periph); +/* enable TIMER output automatic function */ +void timer_automatic_output_enable(uint32_t timer_periph); +/* disable TIMER output automatic function */ +void timer_automatic_output_disable(uint32_t timer_periph); +/* enable or disable TIMER primary output function */ +void timer_primary_output_config(uint32_t timer_periph, ControlStatus newvalue); +/* enable or disable channel capture/compare control shadow register */ +void timer_channel_control_shadow_config(uint32_t timer_periph, ControlStatus newvalue); +/* configure TIMER channel control shadow register update control */ +void timer_channel_control_shadow_update_config(uint32_t timer_periph, uint32_t ccuctl); + +/* TIMER channel output */ +/* initialize TIMER channel output parameter struct */ +void timer_channel_output_struct_para_init(timer_oc_parameter_struct* ocpara); +/* configure TIMER channel output function */ +void timer_channel_output_config(uint32_t timer_periph, uint16_t channel, timer_oc_parameter_struct* ocpara); +/* configure TIMER channel output compare mode */ +void timer_channel_output_mode_config(uint32_t timer_periph, uint16_t channel, uint16_t ocmode); +/* configure TIMER channel output pulse value */ +void timer_channel_output_pulse_value_config(uint32_t timer_periph, uint16_t channel, uint32_t pulse); +/* configure TIMER channel output shadow function */ +void timer_channel_output_shadow_config(uint32_t timer_periph, uint16_t channel, uint16_t ocshadow); +/* configure TIMER channel output fast function */ +void timer_channel_output_fast_config(uint32_t timer_periph, uint16_t channel, uint16_t ocfast); +/* configure TIMER channel output clear function */ +void timer_channel_output_clear_config(uint32_t timer_periph, uint16_t channel, uint16_t occlear); +/* configure TIMER channel output polarity */ +void timer_channel_output_polarity_config(uint32_t timer_periph, uint16_t channel, uint16_t ocpolarity); +/* configure TIMER channel complementary output polarity */ +void timer_channel_complementary_output_polarity_config(uint32_t timer_periph, uint16_t channel, uint16_t ocnpolarity); +/* configure TIMER channel enable state */ +void timer_channel_output_state_config(uint32_t timer_periph, uint16_t channel, uint32_t state); +/* configure TIMER channel complementary output enable state */ +void timer_channel_complementary_output_state_config(uint32_t timer_periph, uint16_t channel, uint16_t ocnstate); + +/* TIMER channel input */ +/* initialize TIMER channel input parameter struct */ +void timer_channel_input_struct_para_init(timer_ic_parameter_struct* icpara); +/* configure TIMER input capture parameter */ +void timer_input_capture_config(uint32_t timer_periph, uint16_t channel, timer_ic_parameter_struct* icpara); +/* configure TIMER channel input capture prescaler value */ +void timer_channel_input_capture_prescaler_config(uint32_t timer_periph, uint16_t channel, uint16_t prescaler); +/* read TIMER channel capture compare register value */ +uint32_t timer_channel_capture_value_register_read(uint32_t timer_periph, uint16_t channel); +/* configure TIMER input pwm capture function */ +void timer_input_pwm_capture_config(uint32_t timer_periph, uint16_t channel, timer_ic_parameter_struct* icpwm); +/* configure TIMER hall sensor mode */ +void timer_hall_mode_config(uint32_t timer_periph, uint32_t hallmode); + +/* TIMER master and slave mode */ +/* select TIMER input trigger source */ +void timer_input_trigger_source_select(uint32_t timer_periph, uint32_t intrigger); +/* select TIMER master mode output trigger source */ +void timer_master_output_trigger_source_select(uint32_t timer_periph, uint32_t outrigger); +/* select TIMER slave mode */ +void timer_slave_mode_select(uint32_t timer_periph, uint32_t slavemode); +/* configure TIMER master slave mode */ +void timer_master_slave_mode_config(uint32_t timer_periph, uint32_t masterslave); +/* configure TIMER external trigger input */ +void timer_external_trigger_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter); +/* configure TIMER quadrature decoder mode */ +void timer_quadrature_decoder_mode_config(uint32_t timer_periph, uint32_t decomode, uint16_t ic0polarity, uint16_t ic1polarity); +/* configure TIMER internal clock mode */ +void timer_internal_clock_config(uint32_t timer_periph); +/* configure TIMER the internal trigger as external clock input */ +void timer_internal_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t intrigger); +/* configure TIMER the external trigger as external clock input */ +void timer_external_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t extrigger, uint16_t extpolarity, uint32_t extfilter); +/* configure TIMER the external clock mode 0 */ +void timer_external_clock_mode0_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter); +/* configure TIMER the external clock mode 1 */ +void timer_external_clock_mode1_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter); +/* disable TIMER the external clock mode 1 */ +void timer_external_clock_mode1_disable(uint32_t timer_periph); + +/* TIMER interrupt and flag */ +/* enable the TIMER interrupt */ +void timer_interrupt_enable(uint32_t timer_periph, uint32_t interrupt); +/* disable the TIMER interrupt */ +void timer_interrupt_disable(uint32_t timer_periph, uint32_t interrupt); +/* get TIMER interrupt flag */ +FlagStatus timer_interrupt_flag_get(uint32_t timer_periph, uint32_t interrupt); +/* clear TIMER interrupt flag */ +void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt); +/* get TIMER flag */ +FlagStatus timer_flag_get(uint32_t timer_periph, uint32_t flag); +/* clear TIMER flag */ +void timer_flag_clear(uint32_t timer_periph, uint32_t flag); + +#endif /* GD32VF103_TIMER_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h new file mode 100644 index 0000000..aadadfa --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_usart.h @@ -0,0 +1,375 @@ +/*! + \file gd32vf103_usart.h + \brief definitions for the USART + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + \version 2019-09-18, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2018, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_USART_H +#define GD32VF103_USART_H + +#include "gd32vf103.h" + +/* USARTx(x=0,1,2)/UARTx(x=3,4) definitions */ +#define USART1 USART_BASE /*!< USART1 base address */ +#define USART2 (USART_BASE+(0x00000400U)) /*!< USART2 base address */ +#define UART3 (USART_BASE+(0x00000800U)) /*!< UART3 base address */ +#define UART4 (USART_BASE+(0x00000C00U)) /*!< UART4 base address */ +#define USART0 (USART_BASE+(0x0000F400U)) /*!< USART0 base address */ + +/* registers definitions */ +#define USART_STAT(usartx) REG32((usartx) + (0x00000000U)) /*!< USART status register */ +#define USART_DATA(usartx) REG32((usartx) + (0x00000004U)) /*!< USART data register */ +#define USART_BAUD(usartx) REG32((usartx) + (0x00000008U)) /*!< USART baud rate register */ +#define USART_CTL0(usartx) REG32((usartx) + (0x0000000CU)) /*!< USART control register 0 */ +#define USART_CTL1(usartx) REG32((usartx) + (0x00000010U)) /*!< USART control register 1 */ +#define USART_CTL2(usartx) REG32((usartx) + (0x00000014U)) /*!< USART control register 2 */ +#define USART_GP(usartx) REG32((usartx) + (0x00000018U)) /*!< USART guard time and prescaler register */ + +/* bits definitions */ +/* USARTx_STAT */ +#define USART_STAT_PERR BIT(0) /*!< parity error flag */ +#define USART_STAT_FERR BIT(1) /*!< frame error flag */ +#define USART_STAT_NERR BIT(2) /*!< noise error flag */ +#define USART_STAT_ORERR BIT(3) /*!< overrun error */ +#define USART_STAT_IDLEF BIT(4) /*!< IDLE frame detected flag */ +#define USART_STAT_RBNE BIT(5) /*!< read data buffer not empty */ +#define USART_STAT_TC BIT(6) /*!< transmission complete */ +#define USART_STAT_TBE BIT(7) /*!< transmit data buffer empty */ +#define USART_STAT_LBDF BIT(8) /*!< LIN break detected flag */ +#define USART_STAT_CTSF BIT(9) /*!< CTS change flag */ + +/* USARTx_DATA */ +#define USART_DATA_DATA BITS(0,8) /*!< transmit or read data value */ + +/* USARTx_BAUD */ +#define USART_BAUD_FRADIV BITS(0,3) /*!< fraction part of baud-rate divider */ +#define USART_BAUD_INTDIV BITS(4,15) /*!< integer part of baud-rate divider */ + +/* USARTx_CTL0 */ +#define USART_CTL0_SBKCMD BIT(0) /*!< send break command */ +#define USART_CTL0_RWU BIT(1) /*!< receiver wakeup from mute mode */ +#define USART_CTL0_REN BIT(2) /*!< receiver enable */ +#define USART_CTL0_TEN BIT(3) /*!< transmitter enable */ +#define USART_CTL0_IDLEIE BIT(4) /*!< idle line detected interrupt enable */ +#define USART_CTL0_RBNEIE BIT(5) /*!< read data buffer not empty interrupt and overrun error interrupt enable */ +#define USART_CTL0_TCIE BIT(6) /*!< transmission complete interrupt enable */ +#define USART_CTL0_TBEIE BIT(7) /*!< transmitter buffer empty interrupt enable */ +#define USART_CTL0_PERRIE BIT(8) /*!< parity error interrupt enable */ +#define USART_CTL0_PM BIT(9) /*!< parity mode */ +#define USART_CTL0_PCEN BIT(10) /*!< parity check function enable */ +#define USART_CTL0_WM BIT(11) /*!< wakeup method in mute mode */ +#define USART_CTL0_WL BIT(12) /*!< word length */ +#define USART_CTL0_UEN BIT(13) /*!< USART enable */ + +/* USARTx_CTL1 */ +#define USART_CTL1_ADDR BITS(0,3) /*!< address of USART */ +#define USART_CTL1_LBLEN BIT(5) /*!< LIN break frame length */ +#define USART_CTL1_LBDIE BIT(6) /*!< LIN break detected interrupt eanble */ +#define USART_CTL1_CLEN BIT(8) /*!< CK length */ +#define USART_CTL1_CPH BIT(9) /*!< CK phase */ +#define USART_CTL1_CPL BIT(10) /*!< CK polarity */ +#define USART_CTL1_CKEN BIT(11) /*!< CK pin enable */ +#define USART_CTL1_STB BITS(12,13) /*!< STOP bits length */ +#define USART_CTL1_LMEN BIT(14) /*!< LIN mode enable */ + +/* USARTx_CTL2 */ +#define USART_CTL2_ERRIE BIT(0) /*!< error interrupt enable */ +#define USART_CTL2_IREN BIT(1) /*!< IrDA mode enable */ +#define USART_CTL2_IRLP BIT(2) /*!< IrDA low-power */ +#define USART_CTL2_HDEN BIT(3) /*!< half-duplex enable */ +#define USART_CTL2_NKEN BIT(4) /*!< NACK enable in smartcard mode */ +#define USART_CTL2_SCEN BIT(5) /*!< smartcard mode enable */ +#define USART_CTL2_DENR BIT(6) /*!< DMA request enable for reception */ +#define USART_CTL2_DENT BIT(7) /*!< DMA request enable for transmission */ +#define USART_CTL2_RTSEN BIT(8) /*!< RTS enable */ +#define USART_CTL2_CTSEN BIT(9) /*!< CTS enable */ +#define USART_CTL2_CTSIE BIT(10) /*!< CTS interrupt enable */ + +/* USARTx_GP */ +#define USART_GP_PSC BITS(0,7) /*!< prescaler value for dividing the system clock */ +#define USART_GP_GUAT BITS(8,15) /*!< guard time value in smartcard mode */ + +/* constants definitions */ +/* define the USART bit position and its register index offset */ +#define USART_REGIDX_BIT(regidx, bitpos) (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos)) +#define USART_REG_VAL(usartx, offset) (REG32((usartx) + (((uint32_t)(offset) & (0x0000FFFFU)) >> 6))) +#define USART_BIT_POS(val) ((uint32_t)(val) & (0x0000001FU)) +#define USART_REGIDX_BIT2(regidx, bitpos, regidx2, bitpos2) (((uint32_t)(regidx2) << 22) | (uint32_t)((bitpos2) << 16)\ + | (((uint32_t)(regidx) << 6) | (uint32_t)(bitpos))) +#define USART_REG_VAL2(usartx, offset) (REG32((usartx) + ((uint32_t)(offset) >> 22))) +#define USART_BIT_POS2(val) (((uint32_t)(val) & (0x001F0000U)) >> 16) + +/* register offset */ +#define USART_STAT_REG_OFFSET (0x00000000U) /*!< STAT register offset */ +#define USART_CTL0_REG_OFFSET (0x0000000CU) /*!< CTL0 register offset */ +#define USART_CTL1_REG_OFFSET (0x00000010U) /*!< CTL1 register offset */ +#define USART_CTL2_REG_OFFSET (0x00000014U) /*!< CTL2 register offset */ + +/* USART flags */ +typedef enum +{ + /* flags in STAT register */ + USART_FLAG_CTS = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 9U), /*!< CTS change flag */ + USART_FLAG_LBD = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 8U), /*!< LIN break detected flag */ + USART_FLAG_TBE = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 7U), /*!< transmit data buffer empty */ + USART_FLAG_TC = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 6U), /*!< transmission complete */ + USART_FLAG_RBNE = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 5U), /*!< read data buffer not empty */ + USART_FLAG_IDLE = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 4U), /*!< IDLE frame detected flag */ + USART_FLAG_ORERR = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 3U), /*!< overrun error */ + USART_FLAG_NERR = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 2U), /*!< noise error flag */ + USART_FLAG_FERR = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 1U), /*!< frame error flag */ + USART_FLAG_PERR = USART_REGIDX_BIT(USART_STAT_REG_OFFSET, 0U), /*!< parity error flag */ +}usart_flag_enum; + +/* USART interrupt flags */ +typedef enum +{ + /* interrupt flags in CTL0 register */ + USART_INT_FLAG_PERR = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 8U, USART_STAT_REG_OFFSET, 0U), /*!< parity error interrupt and flag */ + USART_INT_FLAG_TBE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 7U, USART_STAT_REG_OFFSET, 7U), /*!< transmitter buffer empty interrupt and flag */ + USART_INT_FLAG_TC = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 6U, USART_STAT_REG_OFFSET, 6U), /*!< transmission complete interrupt and flag */ + USART_INT_FLAG_RBNE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 5U, USART_STAT_REG_OFFSET, 5U), /*!< read data buffer not empty interrupt and flag */ + USART_INT_FLAG_RBNE_ORERR = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 5U, USART_STAT_REG_OFFSET, 3U), /*!< read data buffer not empty interrupt and overrun error flag */ + USART_INT_FLAG_IDLE = USART_REGIDX_BIT2(USART_CTL0_REG_OFFSET, 4U, USART_STAT_REG_OFFSET, 4U), /*!< IDLE line detected interrupt and flag */ + /* interrupt flags in CTL1 register */ + USART_INT_FLAG_LBD = USART_REGIDX_BIT2(USART_CTL1_REG_OFFSET, 6U, USART_STAT_REG_OFFSET, 8U), /*!< LIN break detected interrupt and flag */ + /* interrupt flags in CTL2 register */ + USART_INT_FLAG_CTS = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 10U, USART_STAT_REG_OFFSET, 9U), /*!< CTS interrupt and flag */ + USART_INT_FLAG_ERR_ORERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT_REG_OFFSET, 3U), /*!< error interrupt and overrun error */ + USART_INT_FLAG_ERR_NERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT_REG_OFFSET, 2U), /*!< error interrupt and noise error flag */ + USART_INT_FLAG_ERR_FERR = USART_REGIDX_BIT2(USART_CTL2_REG_OFFSET, 0U, USART_STAT_REG_OFFSET, 1U), /*!< error interrupt and frame error flag */ +}usart_interrupt_flag_enum; + +/* USART interrupt enable or disable */ +typedef enum +{ + /* interrupt in CTL0 register */ + USART_INT_PERR = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 8U), /*!< parity error interrupt */ + USART_INT_TBE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 7U), /*!< transmitter buffer empty interrupt */ + USART_INT_TC = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 6U), /*!< transmission complete interrupt */ + USART_INT_RBNE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 5U), /*!< read data buffer not empty interrupt and overrun error interrupt */ + USART_INT_IDLE = USART_REGIDX_BIT(USART_CTL0_REG_OFFSET, 4U), /*!< IDLE line detected interrupt */ + /* interrupt in CTL1 register */ + USART_INT_LBD = USART_REGIDX_BIT(USART_CTL1_REG_OFFSET, 6U), /*!< LIN break detected interrupt */ + /* interrupt in CTL2 register */ + USART_INT_CTS = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 10U), /*!< CTS interrupt */ + USART_INT_ERR = USART_REGIDX_BIT(USART_CTL2_REG_OFFSET, 0U), /*!< error interrupt */ +}usart_interrupt_enum; + +/* USART receiver configure */ +#define CTL0_REN(regval) (BIT(2) & ((uint32_t)(regval) << 2)) +#define USART_RECEIVE_ENABLE CTL0_REN(1) /*!< enable receiver */ +#define USART_RECEIVE_DISABLE CTL0_REN(0) /*!< disable receiver */ + +/* USART transmitter configure */ +#define CTL0_TEN(regval) (BIT(3) & ((uint32_t)(regval) << 3)) +#define USART_TRANSMIT_ENABLE CTL0_TEN(1) /*!< enable transmitter */ +#define USART_TRANSMIT_DISABLE CTL0_TEN(0) /*!< disable transmitter */ + +/* USART parity bits definitions */ +#define CTL0_PM(regval) (BITS(9,10) & ((uint32_t)(regval) << 9)) +#define USART_PM_NONE CTL0_PM(0) /*!< no parity */ +#define USART_PM_EVEN CTL0_PM(2) /*!< even parity */ +#define USART_PM_ODD CTL0_PM(3) /*!< odd parity */ + +/* USART wakeup method in mute mode */ +#define CTL0_WM(regval) (BIT(11) & ((uint32_t)(regval) << 11)) +#define USART_WM_IDLE CTL0_WM(0) /*!< idle line */ +#define USART_WM_ADDR CTL0_WM(1) /*!< address match */ + +/* USART word length definitions */ +#define CTL0_WL(regval) (BIT(12) & ((uint32_t)(regval) << 12)) +#define USART_WL_8BIT CTL0_WL(0) /*!< 8 bits */ +#define USART_WL_9BIT CTL0_WL(1) /*!< 9 bits */ + +/* USART stop bits definitions */ +#define CTL1_STB(regval) (BITS(12,13) & ((uint32_t)(regval) << 12)) +#define USART_STB_1BIT CTL1_STB(0) /*!< 1 bit */ +#define USART_STB_0_5BIT CTL1_STB(1) /*!< 0.5 bit */ +#define USART_STB_2BIT CTL1_STB(2) /*!< 2 bits */ +#define USART_STB_1_5BIT CTL1_STB(3) /*!< 1.5 bits */ + +/* USART LIN break frame length */ +#define CTL1_LBLEN(regval) (BIT(5) & ((uint32_t)(regval) << 5)) +#define USART_LBLEN_10B CTL1_LBLEN(0) /*!< 10 bits */ +#define USART_LBLEN_11B CTL1_LBLEN(1) /*!< 11 bits */ + +/* USART CK length */ +#define CTL1_CLEN(regval) (BIT(8) & ((uint32_t)(regval) << 8)) +#define USART_CLEN_NONE CTL1_CLEN(0) /*!< there are 7 CK pulses for an 8 bit frame and 8 CK pulses for a 9 bit frame */ +#define USART_CLEN_EN CTL1_CLEN(1) /*!< there are 8 CK pulses for an 8 bit frame and 9 CK pulses for a 9 bit frame */ + +/* USART clock phase */ +#define CTL1_CPH(regval) (BIT(9) & ((uint32_t)(regval) << 9)) +#define USART_CPH_1CK CTL1_CPH(0) /*!< first clock transition is the first data capture edge */ +#define USART_CPH_2CK CTL1_CPH(1) /*!< second clock transition is the first data capture edge */ + +/* USART clock polarity */ +#define CTL1_CPL(regval) (BIT(10) & ((uint32_t)(regval) << 10)) +#define USART_CPL_LOW CTL1_CPL(0) /*!< steady low value on CK pin */ +#define USART_CPL_HIGH CTL1_CPL(1) /*!< steady high value on CK pin */ + +/* USART DMA request for receive configure */ +#define CLT2_DENR(regval) (BIT(6) & ((uint32_t)(regval) << 6)) +#define USART_DENR_ENABLE CLT2_DENR(1) /*!< DMA request enable for reception */ +#define USART_DENR_DISABLE CLT2_DENR(0) /*!< DMA request disable for reception */ + +/* USART DMA request for transmission configure */ +#define CLT2_DENT(regval) (BIT(7) & ((uint32_t)(regval) << 7)) +#define USART_DENT_ENABLE CLT2_DENT(1) /*!< DMA request enable for transmission */ +#define USART_DENT_DISABLE CLT2_DENT(0) /*!< DMA request disable for transmission */ + +/* USART RTS configure */ +#define CLT2_RTSEN(regval) (BIT(8) & ((uint32_t)(regval) << 8)) +#define USART_RTS_ENABLE CLT2_RTSEN(1) /*!< RTS enable */ +#define USART_RTS_DISABLE CLT2_RTSEN(0) /*!< RTS disable */ + +/* USART CTS configure */ +#define CLT2_CTSEN(regval) (BIT(9) & ((uint32_t)(regval) << 9)) +#define USART_CTS_ENABLE CLT2_CTSEN(1) /*!< CTS enable */ +#define USART_CTS_DISABLE CLT2_CTSEN(0) /*!< CTS disable */ + +/* USART IrDA low-power enable */ +#define CTL2_IRLP(regval) (BIT(2) & ((uint32_t)(regval) << 2)) +#define USART_IRLP_LOW CTL2_IRLP(1) /*!< low-power */ +#define USART_IRLP_NORMAL CTL2_IRLP(0) /*!< normal */ + +/* function declarations */ +/* initialization functions */ +/* reset USART */ +void usart_deinit(uint32_t usart_periph); +/* configure USART baud rate value */ +void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval); +/* configure USART parity function */ +void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg); +/* configure USART word length */ +void usart_word_length_set(uint32_t usart_periph, uint32_t wlen); +/* configure USART stop bit length */ +void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen); + +/* USART normal mode communication */ +/* enable USART */ +void usart_enable(uint32_t usart_periph); +/* disable USART */ +void usart_disable(uint32_t usart_periph); +/* configure USART transmitter */ +void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig); +/* configure USART receiver */ +void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig); +/* USART transmit data function */ +void usart_data_transmit(uint32_t usart_periph, uint32_t data); +/* USART receive data function */ +uint16_t usart_data_receive(uint32_t usart_periph); + +/* multi-processor communication */ +/* configure address of the USART */ +void usart_address_config(uint32_t usart_periph, uint8_t addr); +/* enable mute mode */ +void usart_mute_mode_enable(uint32_t usart_periph); +/* disable mute mode */ +void usart_mute_mode_disable(uint32_t usart_periph); +/* configure wakeup method in mute mode */ +void usart_mute_mode_wakeup_config(uint32_t usart_periph, uint32_t wmethod); + +/* LIN mode communication */ +/* LIN mode enable */ +void usart_lin_mode_enable(uint32_t usart_periph); +/* LIN mode disable */ +void usart_lin_mode_disable(uint32_t usart_periph); +/* LIN break detection length */ +void usart_lin_break_detection_length_config(uint32_t usart_periph, uint32_t lblen); +/* send break frame */ +void usart_send_break(uint32_t usart_periph); + +/* half-duplex communication */ +/* half-duplex enable */ +void usart_halfduplex_enable(uint32_t usart_periph); +/* half-duplex disable */ +void usart_halfduplex_disable(uint32_t usart_periph); + +/* synchronous communication */ +/* clock enable */ +void usart_synchronous_clock_enable(uint32_t usart_periph); +/* clock disable */ +void usart_synchronous_clock_disable(uint32_t usart_periph); +/* configure usart synchronous mode parameters */ +void usart_synchronous_clock_config(uint32_t usart_periph, uint32_t clen, uint32_t cph, uint32_t cpl); + +/* smartcard communication */ +/* guard time value configure in smartcard mode */ +void usart_guard_time_config(uint32_t usart_periph, uint32_t gaut); +/* smartcard mode enable */ +void usart_smartcard_mode_enable(uint32_t usart_periph); +/* smartcard mode disable */ +void usart_smartcard_mode_disable(uint32_t usart_periph); +/* NACK enable in smartcard mode */ +void usart_smartcard_mode_nack_enable(uint32_t usart_periph); +/* NACK disable in smartcard mode */ +void usart_smartcard_mode_nack_disable(uint32_t usart_periph); + +/* IrDA communication */ +/* enable IrDA mode */ +void usart_irda_mode_enable(uint32_t usart_periph); +/* disable IrDA mode */ +void usart_irda_mode_disable(uint32_t usart_periph); +/* configure the peripheral clock prescaler */ +void usart_prescaler_config(uint32_t usart_periph, uint8_t psc); +/* configure IrDA low-power */ +void usart_irda_lowpower_config(uint32_t usart_periph, uint32_t irlp); + +/* hardware flow communication */ +/* configure hardware flow control RTS */ +void usart_hardware_flow_rts_config(uint32_t usart_periph, uint32_t rtsconfig); +/* configure hardware flow control CTS */ +void usart_hardware_flow_cts_config(uint32_t usart_periph, uint32_t ctsconfig); + +/* configure USART DMA for reception */ +void usart_dma_receive_config(uint32_t usart_periph, uint32_t dmacmd); +/* configure USART DMA for transmission */ +void usart_dma_transmit_config(uint32_t usart_periph, uint32_t dmacmd); + +/* flag functions */ +/* get flag in STAT register */ +FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag); +/* clear flag in STAT register */ +void usart_flag_clear(uint32_t usart_periph, usart_flag_enum flag); + +/* interrupt functions */ +/* enable USART interrupt */ +void usart_interrupt_enable(uint32_t usart_periph, uint32_t interrupt); +/* disable USART interrupt */ +void usart_interrupt_disable(uint32_t usart_periph, uint32_t interrupt); +/* get USART interrupt and flag status */ +FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, uint32_t int_flag); +/* clear interrupt flag in STAT register */ +void usart_interrupt_flag_clear(uint32_t usart_periph, uint32_t int_flag); +#endif /* GD32VF103_USART_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h new file mode 100644 index 0000000..23f5905 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Include/gd32vf103_wwdgt.h @@ -0,0 +1,86 @@ +/*! + \file gd32vf103_wwdgt.h + \brief definitions for the WWDGT + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_WWDGT_H +#define GD32VF103_WWDGT_H + +#include "gd32vf103.h" + +/* WWDGT definitions */ +#define WWDGT WWDGT_BASE /*!< WWDGT base address */ + +/* registers definitions */ +#define WWDGT_CTL REG32((WWDGT) + 0x00000000U) /*!< WWDGT control register */ +#define WWDGT_CFG REG32((WWDGT) + 0x00000004U) /*!< WWDGT configuration register */ +#define WWDGT_STAT REG32((WWDGT) + 0x00000008U) /*!< WWDGT status register */ + +/* bits definitions */ +/* WWDGT_CTL */ +#define WWDGT_CTL_CNT BITS(0,6) /*!< WWDGT counter value */ +#define WWDGT_CTL_WDGTEN BIT(7) /*!< WWDGT counter enable */ + +/* WWDGT_CFG */ +#define WWDGT_CFG_WIN BITS(0,6) /*!< WWDGT counter window value */ +#define WWDGT_CFG_PSC BITS(7,8) /*!< WWDGT prescaler divider value */ +#define WWDGT_CFG_EWIE BIT(9) /*!< early wakeup interrupt enable */ + +/* WWDGT_STAT */ +#define WWDGT_STAT_EWIF BIT(0) /*!< early wakeup interrupt flag */ + +/* constants definitions */ +#define CFG_PSC(regval) (BITS(7,8) & ((uint32_t)(regval) << 7)) /*!< write value to WWDGT_CFG_PSC bit field */ +#define WWDGT_CFG_PSC_DIV1 CFG_PSC(0) /*!< the time base of WWDGT = (PCLK1/4096)/1 */ +#define WWDGT_CFG_PSC_DIV2 CFG_PSC(1) /*!< the time base of WWDGT = (PCLK1/4096)/2 */ +#define WWDGT_CFG_PSC_DIV4 CFG_PSC(2) /*!< the time base of WWDGT = (PCLK1/4096)/4 */ +#define WWDGT_CFG_PSC_DIV8 CFG_PSC(3) /*!< the time base of WWDGT = (PCLK1/4096)/8 */ + +/* function declarations */ +/* reset the window watchdog timer configuration */ +void wwdgt_deinit(void); +/* start the window watchdog timer counter */ +void wwdgt_enable(void); + +/* configure the window watchdog timer counter value */ +void wwdgt_counter_update(uint16_t counter_value); +/* configure counter value, window value, and prescaler divider value */ +void wwdgt_config(uint16_t counter, uint16_t window, uint32_t prescaler); + +/* enable early wakeup interrupt of WWDGT */ +void wwdgt_interrupt_enable(void); +/* check early wakeup interrupt state of WWDGT */ +FlagStatus wwdgt_flag_get(void); +/* clear early wakeup interrupt state of WWDGT */ +void wwdgt_flag_clear(void); + +#endif /* GD32VF103_WWDGT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c new file mode 100644 index 0000000..362a87a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c @@ -0,0 +1,992 @@ +/*! + \file gd32vf103_adc.c + \brief ADC driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_adc.h" + +/* discontinuous mode macro*/ +#define ADC_CHANNEL_LENGTH_SUBTRACT_ONE ((uint8_t)1U) + +/* ADC regular channel macro */ +#define ADC_REGULAR_CHANNEL_RANK_SIX ((uint8_t)6U) +#define ADC_REGULAR_CHANNEL_RANK_TWELVE ((uint8_t)12U) +#define ADC_REGULAR_CHANNEL_RANK_SIXTEEN ((uint8_t)16U) +#define ADC_REGULAR_CHANNEL_RANK_LENGTH ((uint8_t)5U) + +/* ADC sampling time macro */ +#define ADC_CHANNEL_SAMPLE_TEN ((uint8_t)10U) +#define ADC_CHANNEL_SAMPLE_EIGHTEEN ((uint8_t)18U) +#define ADC_CHANNEL_SAMPLE_LENGTH ((uint8_t)3U) + +/* ADC inserted channel macro */ +#define ADC_INSERTED_CHANNEL_RANK_LENGTH ((uint8_t)5U) +#define ADC_INSERTED_CHANNEL_SHIFT_LENGTH ((uint8_t)15U) + +/* ADC inserted channel offset macro */ +#define ADC_OFFSET_LENGTH ((uint8_t)3U) +#define ADC_OFFSET_SHIFT_LENGTH ((uint8_t)4U) + +/*! + \brief reset ADC + \param[in] adc_periph: ADCx, x=0,1 + \param[out] none + \retval none +*/ +void adc_deinit(uint32_t adc_periph) +{ + switch(adc_periph){ + case ADC0: + /* reset ADC0 */ + rcu_periph_reset_enable(RCU_ADC0RST); + rcu_periph_reset_disable(RCU_ADC0RST); + break; + case ADC1: + /* reset ADC1 */ + rcu_periph_reset_enable(RCU_ADC1RST); + rcu_periph_reset_disable(RCU_ADC1RST); + break; + default: + break; + } +} + +/*! + \brief configure the ADC sync mode + \param[in] mode: ADC mode + only one parameter can be selected which is shown as below: + \arg ADC_MODE_FREE: all the ADCs work independently + \arg ADC_DAUL_REGULAL_PARALLEL_INSERTED_PARALLEL: ADC0 and ADC1 work in combined regular parallel + inserted parallel mode + \arg ADC_DAUL_REGULAL_PARALLEL_INSERTED_ROTATION: ADC0 and ADC1 work in combined regular parallel + trigger rotation mode + \arg ADC_DAUL_INSERTED_PARALLEL_REGULAL_FOLLOWUP_FAST: ADC0 and ADC1 work in combined inserted parallel + follow-up fast mode + \arg ADC_DAUL_INSERTED_PARALLEL_REGULAL_FOLLOWUP_SLOW: ADC0 and ADC1 work in combined inserted parallel + follow-up slow mode + \arg ADC_DAUL_INSERTED_PARALLEL: ADC0 and ADC1 work in inserted parallel mode only + \arg ADC_DAUL_REGULAL_PARALLEL: ADC0 and ADC1 work in regular parallel mode only + \arg ADC_DAUL_REGULAL_FOLLOWUP_FAST: ADC0 and ADC1 work in follow-up fast mode only + \arg ADC_DAUL_REGULAL_FOLLOWUP_SLOW: ADC0 and ADC1 work in follow-up slow mode only + \arg ADC_DAUL_INSERTED_TRIGGER_ROTATION: ADC0 and ADC1 work in trigger rotation mode only + \param[out] none + \retval none +*/ +void adc_mode_config(uint32_t mode) +{ + ADC_CTL0(ADC0) &= ~(ADC_CTL0_SYNCM); + ADC_CTL0(ADC0) |= mode; +} + +/*! + \brief enable or disable ADC special function + \param[in] adc_periph: ADCx, x=0,1 + \param[in] function: the function to config + only one parameter can be selected which is shown as below: + \arg ADC_SCAN_MODE: scan mode select + \arg ADC_INSERTED_CHANNEL_AUTO: inserted channel group convert automatically + \arg ADC_CONTINUOUS_MODE: continuous mode select + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void adc_special_function_config(uint32_t adc_periph, uint32_t function, ControlStatus newvalue) +{ + if(newvalue){ + if(0U != (function & ADC_SCAN_MODE)){ + /* enable scan mode */ + ADC_CTL0(adc_periph) |= ADC_SCAN_MODE; + } + if(0U != (function & ADC_INSERTED_CHANNEL_AUTO)){ + /* enable inserted channel group convert automatically */ + ADC_CTL0(adc_periph) |= ADC_INSERTED_CHANNEL_AUTO; + } + if(0U != (function & ADC_CONTINUOUS_MODE)){ + /* enable continuous mode */ + ADC_CTL1(adc_periph) |= ADC_CONTINUOUS_MODE; + } + }else{ + if(0U != (function & ADC_SCAN_MODE)){ + /* disable scan mode */ + ADC_CTL0(adc_periph) &= ~ADC_SCAN_MODE; + } + if(0U != (function & ADC_INSERTED_CHANNEL_AUTO)){ + /* disable inserted channel group convert automatically */ + ADC_CTL0(adc_periph) &= ~ADC_INSERTED_CHANNEL_AUTO; + } + if(0U != (function & ADC_CONTINUOUS_MODE)){ + /* disable continuous mode */ + ADC_CTL1(adc_periph) &= ~ADC_CONTINUOUS_MODE; + } + } +} + +/*! + \brief configure ADC data alignment + \param[in] adc_periph: ADCx, x=0,1 + \param[in] data_alignment: data alignment select + only one parameter can be selected which is shown as below: + \arg ADC_DATAALIGN_RIGHT: LSB alignment + \arg ADC_DATAALIGN_LEFT: MSB alignment + \param[out] none + \retval none +*/ +void adc_data_alignment_config(uint32_t adc_periph, uint32_t data_alignment) +{ + if(ADC_DATAALIGN_RIGHT != data_alignment){ + /* MSB alignment */ + ADC_CTL1(adc_periph) |= ADC_CTL1_DAL; + }else{ + /* LSB alignment */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_DAL); + } +} + +/*! + \brief enable ADC interface + \param[in] adc_periph: ADCx, x=0,1 + \param[out] none + \retval none +*/ +void adc_enable(uint32_t adc_periph) +{ + if(RESET == (ADC_CTL1(adc_periph) & ADC_CTL1_ADCON)){ + /* enable ADC */ + ADC_CTL1(adc_periph) |= (uint32_t)ADC_CTL1_ADCON; + } +} + +/*! + \brief disable ADC interface + \param[in] adc_periph: ADCx, x=0,1 + \param[out] none + \retval none +*/ +void adc_disable(uint32_t adc_periph) +{ + /* disable ADC */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ADCON); +} + +/*! + \brief ADC calibration and reset calibration + \param[in] adc_periph: ADCx, x=0,1 + \param[out] none + \retval none +*/ +void adc_calibration_enable(uint32_t adc_periph) +{ + /* reset the selected ADC1 calibration registers */ + ADC_CTL1(adc_periph) |= (uint32_t) ADC_CTL1_RSTCLB; + /* check the RSTCLB bit state */ + while(RESET != (ADC_CTL1(adc_periph) & ADC_CTL1_RSTCLB)){ + } + /* enable ADC calibration process */ + ADC_CTL1(adc_periph) |= ADC_CTL1_CLB; + /* check the CLB bit state */ + while(RESET != (ADC_CTL1(adc_periph) & ADC_CTL1_CLB)){ + } +} + +/*! + \brief enable the temperature sensor and Vrefint channel + \param[in] none + \param[out] none + \retval none +*/ +void adc_tempsensor_vrefint_enable(void) +{ + /* enable the temperature sensor and Vrefint channel */ + ADC_CTL1(ADC0) |= ADC_CTL1_TSVREN; +} + +/*! + \brief disable the temperature sensor and Vrefint channel + \param[in] none + \param[out] none + \retval none +*/ +void adc_tempsensor_vrefint_disable(void) +{ + /* disable the temperature sensor and Vrefint channel */ + ADC_CTL1(ADC0) &= ~ADC_CTL1_TSVREN; +} + +/*! + \brief enable DMA request + \param[in] adc_periph: ADCx, x=0,1 + \param[out] none + \retval none +*/ +void adc_dma_mode_enable(uint32_t adc_periph) +{ + /* enable DMA request */ + ADC_CTL1(adc_periph) |= (uint32_t)(ADC_CTL1_DMA); +} + +/*! + \brief disable DMA request + \param[in] adc_periph: ADCx, x=0,1 + \param[out] none + \retval none +*/ +void adc_dma_mode_disable(uint32_t adc_periph) +{ + /* disable DMA request */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_DMA); +} + +/*! + \brief configure ADC discontinuous mode + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_channel_group: select the channel group + only one parameter can be selected which is shown as below: + \arg ADC_REGULAR_CHANNEL: regular channel group + \arg ADC_INSERTED_CHANNEL: inserted channel group + \arg ADC_CHANNEL_DISCON_DISABLE: disable discontinuous mode of regular & inserted channel + \param[in] length: number of conversions in discontinuous mode,the number can be 1..8 + for regular channel, the number has no effect for inserted channel + \param[out] none + \retval none +*/ +void adc_discontinuous_mode_config(uint32_t adc_periph, uint8_t adc_channel_group, uint8_t length) +{ + /* disable discontinuous mode of regular & inserted channel */ + ADC_CTL0(adc_periph) &= ~((uint32_t)(ADC_CTL0_DISRC | ADC_CTL0_DISIC)); + switch(adc_channel_group){ + case ADC_REGULAR_CHANNEL: + /* config the number of conversions in discontinuous mode */ + ADC_CTL0(adc_periph) &= ~((uint32_t)ADC_CTL0_DISNUM); + ADC_CTL0(adc_periph) |= CTL0_DISNUM(((uint32_t)length - ADC_CHANNEL_LENGTH_SUBTRACT_ONE)); + /* enable regular channel group discontinuous mode */ + ADC_CTL0(adc_periph) |= (uint32_t)ADC_CTL0_DISRC; + break; + case ADC_INSERTED_CHANNEL: + /* enable inserted channel group discontinuous mode */ + ADC_CTL0(adc_periph) |= (uint32_t)ADC_CTL0_DISIC; + break; + case ADC_CHANNEL_DISCON_DISABLE: + /* disable discontinuous mode of regular & inserted channel */ + default: + break; + } +} + +/*! + \brief configure the length of regular channel group or inserted channel group + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_channel_group: select the channel group + only one parameter can be selected which is shown as below: + \arg ADC_REGULAR_CHANNEL: regular channel group + \arg ADC_INSERTED_CHANNEL: inserted channel group + \param[in] length: the length of the channel + regular channel 1-16 + inserted channel 1-4 + \param[out] none + \retval none +*/ +void adc_channel_length_config(uint32_t adc_periph, uint8_t adc_channel_group, uint32_t length) +{ + switch(adc_channel_group){ + case ADC_REGULAR_CHANNEL: + /* configure the length of regular channel group */ + ADC_RSQ0(adc_periph) &= ~((uint32_t)ADC_RSQ0_RL); + ADC_RSQ0(adc_periph) |= RSQ0_RL((uint32_t)(length-ADC_CHANNEL_LENGTH_SUBTRACT_ONE)); + break; + case ADC_INSERTED_CHANNEL: + /* configure the length of inserted channel group */ + ADC_ISQ(adc_periph) &= ~((uint32_t)ADC_ISQ_IL); + ADC_ISQ(adc_periph) |= ISQ_IL((uint32_t)(length-ADC_CHANNEL_LENGTH_SUBTRACT_ONE)); + break; + default: + break; + } +} + +/*! + \brief configure ADC regular channel + \param[in] adc_periph: ADCx, x=0,1 + \param[in] rank: the regular group sequence rank,this parameter must be between 0 to 15 + \param[in] adc_channel: the selected ADC channel + only one parameter can be selected which is shown as below: + \arg ADC_CHANNEL_x(x=0..17)(x=16 and x=17 are only for ADC0): ADC Channelx + \param[in] sample_time: the sample time value + only one parameter can be selected which is shown as below: + \arg ADC_SAMPLETIME_1POINT5: 1.5 cycles + \arg ADC_SAMPLETIME_7POINT5: 7.5 cycles + \arg ADC_SAMPLETIME_13POINT5: 13.5 cycles + \arg ADC_SAMPLETIME_28POINT5: 28.5 cycles + \arg ADC_SAMPLETIME_41POINT5: 41.5 cycles + \arg ADC_SAMPLETIME_55POINT5: 55.5 cycles + \arg ADC_SAMPLETIME_71POINT5: 71.5 cycles + \arg ADC_SAMPLETIME_239POINT5: 239.5 cycles + \param[out] none + \retval none +*/ +void adc_regular_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t adc_channel, uint32_t sample_time) +{ + uint32_t rsq,sampt; + + /* ADC regular sequence config */ + if(rank < ADC_REGULAR_CHANNEL_RANK_SIX){ + /* the regular group sequence rank is smaller than six */ + rsq = ADC_RSQ2(adc_periph); + rsq &= ~((uint32_t)(ADC_RSQX_RSQN << (ADC_REGULAR_CHANNEL_RANK_LENGTH*rank))); + /* the channel number is written to these bits to select a channel as the nth conversion in the regular channel group */ + rsq |= ((uint32_t)adc_channel << (ADC_REGULAR_CHANNEL_RANK_LENGTH*rank)); + ADC_RSQ2(adc_periph) = rsq; + }else if(rank < ADC_REGULAR_CHANNEL_RANK_TWELVE){ + /* the regular group sequence rank is smaller than twelve */ + rsq = ADC_RSQ1(adc_periph); + rsq &= ~((uint32_t)(ADC_RSQX_RSQN << (ADC_REGULAR_CHANNEL_RANK_LENGTH*(rank-ADC_REGULAR_CHANNEL_RANK_SIX)))); + /* the channel number is written to these bits to select a channel as the nth conversion in the regular channel group */ + rsq |= ((uint32_t)adc_channel << (ADC_REGULAR_CHANNEL_RANK_LENGTH*(rank-ADC_REGULAR_CHANNEL_RANK_SIX))); + ADC_RSQ1(adc_periph) = rsq; + }else if(rank < ADC_REGULAR_CHANNEL_RANK_SIXTEEN){ + /* the regular group sequence rank is smaller than sixteen */ + rsq = ADC_RSQ0(adc_periph); + rsq &= ~((uint32_t)(ADC_RSQX_RSQN << (ADC_REGULAR_CHANNEL_RANK_LENGTH*(rank-ADC_REGULAR_CHANNEL_RANK_TWELVE)))); + /* the channel number is written to these bits to select a channel as the nth conversion in the regular channel group */ + rsq |= ((uint32_t)adc_channel << (ADC_REGULAR_CHANNEL_RANK_LENGTH*(rank-ADC_REGULAR_CHANNEL_RANK_TWELVE))); + ADC_RSQ0(adc_periph) = rsq; + }else{ + } + + /* ADC sampling time config */ + if(adc_channel < ADC_CHANNEL_SAMPLE_TEN){ + /* the regular group sequence rank is smaller than ten */ + sampt = ADC_SAMPT1(adc_periph); + sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (ADC_CHANNEL_SAMPLE_LENGTH*adc_channel))); + /* channel sample time set*/ + sampt |= (uint32_t)(sample_time << (ADC_CHANNEL_SAMPLE_LENGTH*adc_channel)); + ADC_SAMPT1(adc_periph) = sampt; + }else if(adc_channel < ADC_CHANNEL_SAMPLE_EIGHTEEN){ + /* the regular group sequence rank is smaller than eighteen */ + sampt = ADC_SAMPT0(adc_periph); + sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (ADC_CHANNEL_SAMPLE_LENGTH*(adc_channel-ADC_CHANNEL_SAMPLE_TEN)))); + /* channel sample time set*/ + sampt |= (uint32_t)(sample_time << (ADC_CHANNEL_SAMPLE_LENGTH*(adc_channel-ADC_CHANNEL_SAMPLE_TEN))); + ADC_SAMPT0(adc_periph) = sampt; + }else{ + } +} + +/*! + \brief configure ADC inserted channel + \param[in] adc_periph: ADCx, x=0,1 + \param[in] rank: the inserted group sequencer rank,this parameter must be between 0 to 3 + \param[in] adc_channel: the selected ADC channel + only one parameter can be selected which is shown as below: + \arg ADC_CHANNEL_x(x=0..17)(x=16 and x=17 are only for ADC0): ADC Channelx + \param[in] sample_time: The sample time value + only one parameter can be selected which is shown as below: + \arg ADC_SAMPLETIME_1POINT5: 1.5 cycles + \arg ADC_SAMPLETIME_7POINT5: 7.5 cycles + \arg ADC_SAMPLETIME_13POINT5: 13.5 cycles + \arg ADC_SAMPLETIME_28POINT5: 28.5 cycles + \arg ADC_SAMPLETIME_41POINT5: 41.5 cycles + \arg ADC_SAMPLETIME_55POINT5: 55.5 cycles + \arg ADC_SAMPLETIME_71POINT5: 71.5 cycles + \arg ADC_SAMPLETIME_239POINT5: 239.5 cycles + \param[out] none + \retval none +*/ +void adc_inserted_channel_config(uint32_t adc_periph, uint8_t rank, uint8_t adc_channel, uint32_t sample_time) +{ + uint8_t inserted_length; + uint32_t isq,sampt; + /* get inserted channel group length */ + inserted_length = (uint8_t)GET_BITS(ADC_ISQ(adc_periph) , 20U , 21U); + /* the channel number is written to these bits to select a channel as the nth conversion in the inserted channel group */ + isq = ADC_ISQ(adc_periph); + isq &= ~((uint32_t)(ADC_ISQ_ISQN << (ADC_INSERTED_CHANNEL_SHIFT_LENGTH-(inserted_length-rank)*ADC_INSERTED_CHANNEL_RANK_LENGTH))); + isq |= ((uint32_t)adc_channel << (ADC_INSERTED_CHANNEL_SHIFT_LENGTH-(inserted_length-rank)*ADC_INSERTED_CHANNEL_RANK_LENGTH)); + ADC_ISQ(adc_periph) = isq; + + /* ADC sampling time config */ + if(adc_channel < ADC_CHANNEL_SAMPLE_TEN){ + /* the inserted group sequence rank is smaller than ten */ + sampt = ADC_SAMPT1(adc_periph); + sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (ADC_CHANNEL_SAMPLE_LENGTH*adc_channel))); + /* channel sample time set*/ + sampt |= (uint32_t) sample_time << (ADC_CHANNEL_SAMPLE_LENGTH*adc_channel); + ADC_SAMPT1(adc_periph) = sampt; + }else if(adc_channel < ADC_CHANNEL_SAMPLE_EIGHTEEN){ + /* the inserted group sequence rank is smaller than eighteen */ + sampt = ADC_SAMPT0(adc_periph); + sampt &= ~((uint32_t)(ADC_SAMPTX_SPTN << (ADC_CHANNEL_SAMPLE_LENGTH*(adc_channel-ADC_CHANNEL_SAMPLE_TEN)))); + /* channel sample time set*/ + sampt |= ((uint32_t)sample_time << (ADC_CHANNEL_SAMPLE_LENGTH*(adc_channel-ADC_CHANNEL_SAMPLE_TEN))); + ADC_SAMPT0(adc_periph) = sampt; + }else{ + } +} + +/*! + \brief configure ADC inserted channel offset + \param[in] adc_periph: ADCx, x=0,1 + \param[in] inserted_channel: insert channel select + only one parameter can be selected + \arg ADC_INSERTED_CHANNEL_0: inserted channel0 + \arg ADC_INSERTED_CHANNEL_1: inserted channel1 + \arg ADC_INSERTED_CHANNEL_2: inserted channel2 + \arg ADC_INSERTED_CHANNEL_3: inserted channel3 + \param[in] offset: the offset data + \param[out] none + \retval none +*/ +void adc_inserted_channel_offset_config(uint32_t adc_periph, uint8_t inserted_channel, uint16_t offset) +{ + uint8_t inserted_length; + uint32_t num = 0U; + + inserted_length = (uint8_t)GET_BITS(ADC_ISQ(adc_periph) , 20U , 21U); + num = ((uint32_t)ADC_OFFSET_LENGTH - ((uint32_t)inserted_length - (uint32_t)inserted_channel)); + + if(num <= ADC_OFFSET_LENGTH){ + /* calculate the offset of the register */ + num = num * ADC_OFFSET_SHIFT_LENGTH; + /* config the offset of the selected channels */ + REG32((adc_periph) + 0x14U + num) = IOFFX_IOFF((uint32_t)offset); + } +} + +/*! + \brief configure ADC external trigger source + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_channel_group: select the channel group + only one parameter can be selected which is shown as below: + \arg ADC_REGULAR_CHANNEL: regular channel group + \arg ADC_INSERTED_CHANNEL: inserted channel group + \param[in] external_trigger_source: regular or inserted group trigger source + only one parameter can be selected + for regular channel: + \arg ADC0_1_EXTTRIG_REGULAR_T0_CH0: TIMER0 CH0 event select + \arg ADC0_1_EXTTRIG_REGULAR_T0_CH1: TIMER0 CH1 event select + \arg ADC0_1_EXTTRIG_REGULAR_T0_CH2: TIMER0 CH2 event select + \arg ADC0_1_EXTTRIG_REGULAR_T1_CH1: TIMER1 CH1 event select + \arg ADC0_1_EXTTRIG_REGULAR_T2_TRGO: TIMER2 TRGO event select + \arg ADC0_1_EXTTRIG_REGULAR_T3_CH3: TIMER3 CH3 event select + \arg ADC0_1_EXTTRIG_REGULAR_EXTI_11: external interrupt line 11 + \arg ADC0_1_EXTTRIG_REGULAR_NONE: software trigger + for inserted channel: + \arg ADC0_1_EXTTRIG_INSERTED_T0_TRGO: TIMER0 TRGO event select + \arg ADC0_1_EXTTRIG_INSERTED_T0_CH3: TIMER0 CH3 event select + \arg ADC0_1_EXTTRIG_INSERTED_T1_TRGO: TIMER1 TRGO event select + \arg ADC0_1_EXTTRIG_INSERTED_T1_CH0: TIMER1 CH0 event select + \arg ADC0_1_EXTTRIG_INSERTED_T2_CH3: TIMER2 CH3 event select + \arg ADC0_1_EXTTRIG_INSERTED_T3_TRGO: TIMER3 TRGO event select + \arg ADC0_1_EXTTRIG_INSERTED_EXTI_15: external interrupt line 15 + \arg ADC0_1_EXTTRIG_INSERTED_NONE: software trigger + \param[out] none + \retval none +*/ +void adc_external_trigger_source_config(uint32_t adc_periph, uint8_t adc_channel_group, uint32_t external_trigger_source) +{ + switch(adc_channel_group){ + case ADC_REGULAR_CHANNEL: + /* configure ADC regular group external trigger source */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ETSRC); + ADC_CTL1(adc_periph) |= (uint32_t)external_trigger_source; + break; + case ADC_INSERTED_CHANNEL: + /* configure ADC inserted group external trigger source */ + ADC_CTL1(adc_periph) &= ~((uint32_t)ADC_CTL1_ETSIC); + ADC_CTL1(adc_periph) |= (uint32_t)external_trigger_source; + break; + default: + break; + } +} + +/*! + \brief configure ADC external trigger + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_channel_group: select the channel group + one or more parameters can be selected which are shown as below: + \arg ADC_REGULAR_CHANNEL: regular channel group + \arg ADC_INSERTED_CHANNEL: inserted channel group + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void adc_external_trigger_config(uint32_t adc_periph, uint8_t adc_channel_group, ControlStatus newvalue) +{ + if(newvalue){ + if(0U != (adc_channel_group & ADC_REGULAR_CHANNEL)){ + /* enable ADC regular channel group external trigger */ + ADC_CTL1(adc_periph) |= ADC_CTL1_ETERC; + } + if(0U != (adc_channel_group & ADC_INSERTED_CHANNEL)){ + /* enable ADC inserted channel group external trigger */ + ADC_CTL1(adc_periph) |= ADC_CTL1_ETEIC; + } + }else{ + if(0U != (adc_channel_group & ADC_REGULAR_CHANNEL)){ + /* disable ADC regular channel group external trigger */ + ADC_CTL1(adc_periph) &= ~ADC_CTL1_ETERC; + } + if(0U != (adc_channel_group & ADC_INSERTED_CHANNEL)){ + /* disable ADC regular channel group external trigger */ + ADC_CTL1(adc_periph) &= ~ADC_CTL1_ETEIC; + } + } +} + +/*! + \brief enable ADC software trigger + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_channel_group: select the channel group + one or more parameters can be selected which are shown as below: + \arg ADC_REGULAR_CHANNEL: regular channel group + \arg ADC_INSERTED_CHANNEL: inserted channel group + \param[out] none + \retval none +*/ +void adc_software_trigger_enable(uint32_t adc_periph, uint8_t adc_channel_group) +{ + if(0U != (adc_channel_group & ADC_REGULAR_CHANNEL)){ + /* enable ADC regular channel group software trigger */ + ADC_CTL1(adc_periph) |= ADC_CTL1_SWRCST; + } + if(0U != (adc_channel_group & ADC_INSERTED_CHANNEL)){ + /* enable ADC inserted channel group software trigger */ + ADC_CTL1(adc_periph) |= ADC_CTL1_SWICST; + } +} + +/*! + \brief read ADC regular group data register + \param[in] adc_periph: ADCx, x=0,1 + \param[in] none + \param[out] none + \retval the conversion value +*/ +uint16_t adc_regular_data_read(uint32_t adc_periph) +{ + return (uint16_t)(ADC_RDATA(adc_periph)); +} + +/*! + \brief read ADC inserted group data register + \param[in] adc_periph: ADCx, x=0,1 + \param[in] inserted_channel: insert channel select + only one parameter can be selected + \arg ADC_INSERTED_CHANNEL_0: inserted Channel0 + \arg ADC_INSERTED_CHANNEL_1: inserted channel1 + \arg ADC_INSERTED_CHANNEL_2: inserted Channel2 + \arg ADC_INSERTED_CHANNEL_3: inserted Channel3 + \param[out] none + \retval the conversion value +*/ +uint16_t adc_inserted_data_read(uint32_t adc_periph, uint8_t inserted_channel) +{ + uint32_t idata; + /* read the data of the selected channel */ + switch(inserted_channel){ + case ADC_INSERTED_CHANNEL_0: + /* read the data of channel 0 */ + idata = ADC_IDATA0(adc_periph); + break; + case ADC_INSERTED_CHANNEL_1: + /* read the data of channel 1 */ + idata = ADC_IDATA1(adc_periph); + break; + case ADC_INSERTED_CHANNEL_2: + /* read the data of channel 2 */ + idata = ADC_IDATA2(adc_periph); + break; + case ADC_INSERTED_CHANNEL_3: + /* read the data of channel 3 */ + idata = ADC_IDATA3(adc_periph); + break; + default: + idata = 0U; + break; + } + return (uint16_t)idata; +} + +/*! + \brief read the last ADC0 and ADC1 conversion result data in sync mode + \param[in] none + \param[out] none + \retval the conversion value +*/ +uint32_t adc_sync_mode_convert_value_read(void) +{ + /* return conversion value */ + return ADC_RDATA(ADC0); +} + + +/*! + \brief configure ADC analog watchdog single channel + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_channel: the selected ADC channel + only one parameter can be selected which is shown as below: + \arg ADC_CHANNEL_x: ADC Channelx(x=0..17)(x=16 and x=17 are only for ADC0) + \param[out] none + \retval none +*/ +void adc_watchdog_single_channel_enable(uint32_t adc_periph, uint8_t adc_channel) +{ + ADC_CTL0(adc_periph) &= (uint32_t)~(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN | ADC_CTL0_WDSC | ADC_CTL0_WDCHSEL); + /* analog watchdog channel select */ + ADC_CTL0(adc_periph) |= (uint32_t)adc_channel; + ADC_CTL0(adc_periph) |= (uint32_t)(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN | ADC_CTL0_WDSC); +} + +/*! + \brief configure ADC analog watchdog group channel + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_channel_group: the channel group use analog watchdog + only one parameter can be selected which is shown as below: + \arg ADC_REGULAR_CHANNEL: regular channel group + \arg ADC_INSERTED_CHANNEL: inserted channel group + \arg ADC_REGULAR_INSERTED_CHANNEL: both regular and inserted group + \param[out] none + \retval none +*/ +void adc_watchdog_group_channel_enable(uint32_t adc_periph, uint8_t adc_channel_group) +{ + ADC_CTL0(adc_periph) &= (uint32_t)~(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN | ADC_CTL0_WDSC); + /* select the group */ + switch(adc_channel_group){ + case ADC_REGULAR_CHANNEL: + /* regular channel analog watchdog enable */ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_RWDEN; + break; + case ADC_INSERTED_CHANNEL: + /* inserted channel analog watchdog enable */ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_IWDEN; + break; + case ADC_REGULAR_INSERTED_CHANNEL: + /* regular and inserted channel analog watchdog enable */ + ADC_CTL0(adc_periph) |= (uint32_t)(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN); + break; + default: + break; + } +} + +/*! + \brief disable ADC analog watchdog + \param[in] adc_periph: ADCx, x=0,1 + \param[out] none + \retval none +*/ +void adc_watchdog_disable(uint32_t adc_periph) +{ + ADC_CTL0(adc_periph) &= (uint32_t)~(ADC_CTL0_RWDEN | ADC_CTL0_IWDEN | ADC_CTL0_WDSC | ADC_CTL0_WDCHSEL); +} + +/*! + \brief configure ADC analog watchdog threshold + \param[in] adc_periph: ADCx, x=0,1 + \param[in] low_threshold: analog watchdog low threshold, 0..4095 + \param[in] high_threshold: analog watchdog high threshold, 0..4095 + \param[out] none + \retval none +*/ +void adc_watchdog_threshold_config(uint32_t adc_periph, uint16_t low_threshold, uint16_t high_threshold) +{ + ADC_WDLT(adc_periph) = (uint32_t)WDLT_WDLT(low_threshold); + ADC_WDHT(adc_periph) = (uint32_t)WDHT_WDHT(high_threshold); +} + +/*! + \brief get the ADC flag bits + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_flag: the adc flag bits + only one parameter can be selected which is shown as below: + \arg ADC_FLAG_WDE: analog watchdog event flag + \arg ADC_FLAG_EOC: end of group conversion flag + \arg ADC_FLAG_EOIC: end of inserted group conversion flag + \arg ADC_FLAG_STIC: start flag of inserted channel group + \arg ADC_FLAG_STRC: start flag of regular channel group + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus adc_flag_get(uint32_t adc_periph, uint32_t adc_flag) +{ + FlagStatus reval = RESET; + if(ADC_STAT(adc_periph) & adc_flag){ + reval = SET; + } + return reval; +} + +/*! + \brief clear the ADC flag bits + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_flag: the adc flag bits + one or more parameters can be selected which are shown as below: + \arg ADC_FLAG_WDE: analog watchdog event flag + \arg ADC_FLAG_EOC: end of group conversion flag + \arg ADC_FLAG_EOIC: end of inserted group conversion flag + \arg ADC_FLAG_STIC: start flag of inserted channel group + \arg ADC_FLAG_STRC: start flag of regular channel group + \param[out] none + \retval none +*/ +void adc_flag_clear(uint32_t adc_periph, uint32_t adc_flag) +{ + ADC_STAT(adc_periph) &= ~((uint32_t)adc_flag); +} + +/*! + \brief get the bit state of ADCx software start conversion + \param[in] adc_periph: ADCx, x=0,1 + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus adc_regular_software_startconv_flag_get(uint32_t adc_periph) +{ + FlagStatus reval = RESET; + if((uint32_t)RESET != (ADC_CTL1(adc_periph) & ADC_CTL1_SWRCST)){ + reval = SET; + } + return reval; +} + +/*! + \brief get the bit state of ADCx software inserted channel start conversion + \param[in] adc_periph: ADCx, x=0,1 + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus adc_inserted_software_startconv_flag_get(uint32_t adc_periph) +{ + FlagStatus reval = RESET; + if((uint32_t)RESET != (ADC_CTL1(adc_periph) & ADC_CTL1_SWICST)){ + reval = SET; + } + return reval; +} + +/*! + \brief get the ADC interrupt bits + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_interrupt: the adc interrupt bits + only one parameter can be selected which is shown as below: + \arg ADC_INT_FLAG_WDE: analog watchdog interrupt + \arg ADC_INT_FLAG_EOC: end of group conversion interrupt + \arg ADC_INT_FLAG_EOIC: end of inserted group conversion interrupt + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus adc_interrupt_flag_get(uint32_t adc_periph, uint32_t adc_interrupt) +{ + FlagStatus interrupt_flag = RESET; + uint32_t state; + /* check the interrupt bits */ + switch(adc_interrupt){ + case ADC_INT_FLAG_WDE: + /* get the ADC analog watchdog interrupt bits */ + state = ADC_STAT(adc_periph) & ADC_STAT_WDE; + if((ADC_CTL0(adc_periph) & ADC_CTL0_WDEIE) && state){ + interrupt_flag = SET; + } + break; + case ADC_INT_FLAG_EOC: + /* get the ADC end of group conversion interrupt bits */ + state = ADC_STAT(adc_periph) & ADC_STAT_EOC; + if((ADC_CTL0(adc_periph) & ADC_CTL0_EOCIE) && state){ + interrupt_flag = SET; + } + break; + case ADC_INT_FLAG_EOIC: + /* get the ADC end of inserted group conversion interrupt bits */ + state = ADC_STAT(adc_periph) & ADC_STAT_EOIC; + if((ADC_CTL0(adc_periph) & ADC_CTL0_EOICIE) && state){ + interrupt_flag = SET; + } + break; + default: + break; + } + return interrupt_flag; +} + +/*! + \brief clear the ADC flag + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_interrupt: the adc status flag + one or more parameters can be selected which are shown as below: + \arg ADC_INT_FLAG_WDE: analog watchdog interrupt + \arg ADC_INT_FLAG_EOC: end of group conversion interrupt + \arg ADC_INT_FLAG_EOIC: end of inserted group conversion interrupt + \param[out] none + \retval none +*/ +void adc_interrupt_flag_clear(uint32_t adc_periph, uint32_t adc_interrupt) +{ + ADC_STAT(adc_periph) &= ~((uint32_t)adc_interrupt); +} + +/*! + \brief enable ADC interrupt + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_interrupt: the adc interrupt + one or more parameters can be selected which are shown as below: + \arg ADC_INT_WDE: analog watchdog interrupt flag + \arg ADC_INT_EOC: end of group conversion interrupt flag + \arg ADC_INT_EOIC: end of inserted group conversion interrupt flag + \param[out] none + \retval none +*/ +void adc_interrupt_enable(uint32_t adc_periph, uint32_t adc_interrupt) +{ + /* enable ADC analog watchdog interrupt */ + if(0U != (adc_interrupt & ADC_INT_WDE)){ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_WDEIE; + } + /* enable ADC end of group conversion interrupt */ + if(0U != (adc_interrupt & ADC_INT_EOC)){ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_EOCIE; + } + /* enable ADC end of inserted group conversion interrupt */ + if(0U != (adc_interrupt & ADC_INT_EOIC)){ + ADC_CTL0(adc_periph) |= (uint32_t) ADC_CTL0_EOICIE; + } +} + +/*! + \brief disable ADC interrupt + \param[in] adc_periph: ADCx, x=0,1 + \param[in] adc_interrupt: the adc interrupt flag + one or more parameters can be selected which are shown as below: + \arg ADC_INT_WDE: analog watchdog interrupt flag + \arg ADC_INT_EOC: end of group conversion interrupt flag + \arg ADC_INT_EOIC: end of inserted group conversion interrupt flag + \param[out] none + \retval none +*/ +void adc_interrupt_disable(uint32_t adc_periph, uint32_t adc_interrupt) +{ + /* disable ADC analog watchdog interrupt */ + if(0U != (adc_interrupt & ADC_INT_WDE)){ + ADC_CTL0(adc_periph) &= ~(uint32_t) ADC_CTL0_WDEIE; + } + /* disable ADC end of group conversion interrupt */ + if(0U != (adc_interrupt & ADC_INT_EOC)){ + ADC_CTL0(adc_periph) &= ~(uint32_t) ADC_CTL0_EOCIE; + } + /* disable ADC end of inserted group conversion interrupt */ + if(0U != (adc_interrupt & ADC_INT_EOIC)){ + ADC_CTL0(adc_periph) &= ~(uint32_t) ADC_CTL0_EOICIE; + } +} + +/*! + \brief adc resolution config + \param[in] adc_periph: ADCx, x=0,1 + \param[in] resolution: ADC resolution + only one parameter can be selected which is shown as below: + \arg ADC_RESOLUTION_12B: 12-bit ADC resolution + \arg ADC_RESOLUTION_10B: 10-bit ADC resolution + \arg ADC_RESOLUTION_8B: 8-bit ADC resolution + \arg ADC_RESOLUTION_6B: 6-bit ADC resolution + \param[out] none + \retval none +*/ +void adc_resolution_config(uint32_t adc_periph, uint32_t resolution) +{ + ADC_OVSCR(adc_periph) &= ~((uint32_t)ADC_OVSCR_DRES); + ADC_OVSCR(adc_periph) |= (uint32_t)resolution; +} + +/*! + \brief adc oversample mode config + \param[in] adc_periph: ADCx, x=0,1 + \param[in] mode: ADC oversampling mode + only one parameter can be selected which is shown as below: + \arg ADC_OVERSAMPLING_ALL_CONVERT: all oversampled conversions for a channel + are done consecutively after a trigger + \arg ADC_OVERSAMPLING_ONE_CONVERT: each oversampled conversion for a channel + needs a trigger + \param[in] shift: ADC oversampling shift + only one parameter can be selected which is shown as below: + \arg ADC_OVERSAMPLING_SHIFT_NONE: no oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_1B: 1-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_2B: 2-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_3B: 3-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_4B: 3-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_5B: 5-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_6B: 6-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_7B: 7-bit oversampling shift + \arg ADC_OVERSAMPLING_SHIFT_8B: 8-bit oversampling shift + \param[in] ratio: ADC oversampling ratio + only one parameter can be selected which is shown as below: + \arg ADC_OVERSAMPLING_RATIO_MUL2: oversampling ratio X2 + \arg ADC_OVERSAMPLING_RATIO_MUL4: oversampling ratio X4 + \arg ADC_OVERSAMPLING_RATIO_MUL8: oversampling ratio X8 + \arg ADC_OVERSAMPLING_RATIO_MUL16: oversampling ratio X16 + \arg ADC_OVERSAMPLING_RATIO_MUL32: oversampling ratio X32 + \arg ADC_OVERSAMPLING_RATIO_MUL64: oversampling ratio X64 + \arg ADC_OVERSAMPLING_RATIO_MUL128: oversampling ratio X128 + \arg ADC_OVERSAMPLING_RATIO_MUL256: oversampling ratio X256 + \param[out] none + \retval none +*/ +void adc_oversample_mode_config(uint32_t adc_periph, uint8_t mode, uint16_t shift,uint8_t ratio) +{ + if(mode){ + ADC_OVSCR(adc_periph) |= (uint32_t)ADC_OVSCR_TOVS; + }else{ + ADC_OVSCR(adc_periph) &= ~((uint32_t)ADC_OVSCR_TOVS); + } + /* config the shift and ratio */ + ADC_OVSCR(adc_periph) &= ~((uint32_t)(ADC_OVSCR_OVSR | ADC_OVSCR_OVSS)); + ADC_OVSCR(adc_periph) |= ((uint32_t)shift | (uint32_t)ratio); +} + +/*! + \brief enable ADC oversample mode + \param[in] adc_periph: ADCx, x=0,1 + \param[out] none + \retval none +*/ +void adc_oversample_mode_enable(uint32_t adc_periph) +{ + ADC_OVSCR(adc_periph) |= ADC_OVSCR_OVSEN; +} + +/*! + \brief disable ADC oversample mode + \param[in] adc_periph: ADCx, x=0,1 + \param[out] none + \retval none +*/ +void adc_oversample_mode_disable(uint32_t adc_periph) +{ + ADC_OVSCR(adc_periph) &= ~((uint32_t)ADC_OVSCR_OVSEN); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c new file mode 100644 index 0000000..3be5bdc --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c @@ -0,0 +1,292 @@ +/*! + \file gd32vf103_bkp.c + \brief BKP driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_bkp.h" + +/* BKP register bits offset */ +#define BKP_TAMPER_BITS_OFFSET ((uint32_t)8U) + +/*! + \brief reset BKP registers + \param[in] none + \param[out] none + \retval none +*/ +void bkp_deinit(void) +{ + /* reset BKP domain register*/ + rcu_bkp_reset_enable(); + rcu_bkp_reset_disable(); +} + +/*! + \brief write BKP data register + \param[in] register_number: refer to bkp_data_register_enum + only one parameter can be selected which is shown as below: + \arg BKP_DATA_x(x = 0..41): bkp data register number x + \param[in] data: the data to be write in BKP data register + \param[out] none + \retval none +*/ +void bkp_data_write(bkp_data_register_enum register_number, uint16_t data) +{ + if((register_number >= BKP_DATA_10) && (register_number <= BKP_DATA_41)){ + BKP_DATA10_41(register_number - 1U) = data; + }else if((register_number >= BKP_DATA_0) && (register_number <= BKP_DATA_9)){ + BKP_DATA0_9(register_number - 1U) = data; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief read BKP data register + \param[in] register_number: refer to bkp_data_register_enum + only one parameter can be selected which is shown as below: + \arg BKP_DATA_x(x = 0..41): bkp data register number x + \param[out] none + \retval data of BKP data register +*/ +uint16_t bkp_data_read(bkp_data_register_enum register_number) +{ + uint16_t data = 0U; + + /* get the data from the BKP data register */ + if((register_number >= BKP_DATA_10) && (register_number <= BKP_DATA_41)){ + data = BKP_DATA10_41(register_number - 1U); + }else if((register_number >= BKP_DATA_0) && (register_number <= BKP_DATA_9)){ + data = BKP_DATA0_9(register_number - 1U); + }else{ + /* illegal parameters */ + } + return data; +} + +/*! + \brief enable RTC clock calibration output + \param[in] none + \param[out] none + \retval none +*/ +void bkp_rtc_calibration_output_enable(void) +{ + BKP_OCTL |= (uint16_t)BKP_OCTL_COEN; +} + +/*! + \brief disable RTC clock calibration output + \param[in] none + \param[out] none + \retval none +*/ +void bkp_rtc_calibration_output_disable(void) +{ + BKP_OCTL &= (uint16_t)~BKP_OCTL_COEN; +} + +/*! + \brief enable RTC alarm or second signal output + \param[in] none + \param[out] none + \retval none +*/ +void bkp_rtc_signal_output_enable(void) +{ + BKP_OCTL |= (uint16_t)BKP_OCTL_ASOEN; +} + +/*! + \brief disable RTC alarm or second signal output + \param[in] none + \param[out] none + \retval none +*/ +void bkp_rtc_signal_output_disable(void) +{ + BKP_OCTL &= (uint16_t)~BKP_OCTL_ASOEN; +} + +/*! + \brief select RTC output + \param[in] outputsel: RTC output selection + only one parameter can be selected which is shown as below: + \arg RTC_OUTPUT_ALARM_PULSE: RTC alarm pulse is selected as the RTC output + \arg RTC_OUTPUT_SECOND_PULSE: RTC second pulse is selected as the RTC output + \param[out] none + \retval none +*/ +void bkp_rtc_output_select(uint16_t outputsel) +{ + uint16_t ctl = 0U; + + /* configure BKP_OCTL_ROSEL with outputsel */ + ctl = BKP_OCTL; + ctl &= (uint16_t)~BKP_OCTL_ROSEL; + ctl |= outputsel; + BKP_OCTL = ctl; +} + +/*! + \brief set RTC clock calibration value + \param[in] value: RTC clock calibration value + \arg 0x00 - 0x7F + \param[out] none + \retval none +*/ +void bkp_rtc_calibration_value_set(uint8_t value) +{ + uint16_t ctl; + + /* configure BKP_OCTL_RCCV with value */ + ctl = BKP_OCTL; + ctl &= (uint16_t)~BKP_OCTL_RCCV; + ctl |= (uint16_t)OCTL_RCCV(value); + BKP_OCTL = ctl; +} + +/*! + \brief enable tamper detection + \param[in] none + \param[out] none + \retval none +*/ +void bkp_tamper_detection_enable(void) +{ + BKP_TPCTL |= (uint16_t)BKP_TPCTL_TPEN; +} + +/*! + \brief disable tamper detection + \param[in] none + \param[out] none + \retval none +*/ +void bkp_tamper_detection_disable(void) +{ + BKP_TPCTL &= (uint16_t)~BKP_TPCTL_TPEN; +} + +/*! + \brief set tamper pin active level + \param[in] level: tamper active level + only one parameter can be selected which is shown as below: + \arg TAMPER_PIN_ACTIVE_HIGH: the tamper pin is active high + \arg TAMPER_PIN_ACTIVE_LOW: the tamper pin is active low + \param[out] none + \retval none +*/ +void bkp_tamper_active_level_set(uint16_t level) +{ + uint16_t ctl = 0U; + + /* configure BKP_TPCTL_TPAL with level */ + ctl = BKP_TPCTL; + ctl &= (uint16_t)~BKP_TPCTL_TPAL; + ctl |= level; + BKP_TPCTL = ctl; +} + +/*! + \brief enable tamper interrupt + \param[in] none + \param[out] none + \retval none +*/ +void bkp_interrupt_enable(void) +{ + BKP_TPCS |= (uint16_t)BKP_TPCS_TPIE; +} + +/*! + \brief disable tamper interrupt + \param[in] none + \param[out] none + \retval none +*/ +void bkp_interrupt_disable(void) +{ + BKP_TPCS &= (uint16_t)~BKP_TPCS_TPIE; +} + +/*! + \brief get tamper flag state + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus bkp_flag_get(void) +{ + if(RESET != (BKP_TPCS & BKP_FLAG_TAMPER)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear tamper flag state + \param[in] none + \param[out] none + \retval none +*/ +void bkp_flag_clear(void) +{ + BKP_TPCS |= (uint16_t)(BKP_FLAG_TAMPER >> BKP_TAMPER_BITS_OFFSET); +} + +/*! + \brief get tamper interrupt flag state + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus bkp_interrupt_flag_get(void) +{ + if(RESET != (BKP_TPCS & BKP_INT_FLAG_TAMPER)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear tamper interrupt flag state + \param[in] none + \param[out] none + \retval none +*/ +void bkp_interrupt_flag_clear(void) +{ + BKP_TPCS |= (uint16_t)(BKP_INT_FLAG_TAMPER >> BKP_TAMPER_BITS_OFFSET); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c new file mode 100644 index 0000000..9cb6a58 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c @@ -0,0 +1,989 @@ +/*! + \file gd32vf103_can.c + \brief CAN driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_can.h" + +#define CAN_ERROR_HANDLE(s) do{}while(1) + +/*! + \brief deinitialize CAN + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval none +*/ +void can_deinit(uint32_t can_periph) +{ + if(CAN0 == can_periph){ + rcu_periph_reset_enable(RCU_CAN0RST); + rcu_periph_reset_disable(RCU_CAN0RST); + }else{ + rcu_periph_reset_enable(RCU_CAN1RST); + rcu_periph_reset_disable(RCU_CAN1RST); + } +} + +/*! + \brief initialize CAN parameter struct with a default value + \param[in] type: the type of CAN parameter struct + only one parameter can be selected which is shown as below: + \arg CAN_INIT_STRUCT: the CAN initial struct + \arg CAN_FILTER_STRUCT: the CAN filter struct + \arg CAN_TX_MESSAGE_STRUCT: the CAN TX message struct + \arg CAN_RX_MESSAGE_STRUCT: the CAN RX message struct + \param[in] p_struct: the pointer of the specific struct + \param[out] none + \retval none +*/ +void can_struct_para_init(can_struct_type_enum type, void* p_struct) +{ + uint8_t i; + + /* get type of the struct */ + switch(type){ + /* used for can_init() */ + case CAN_INIT_STRUCT: + ((can_parameter_struct*)p_struct)->auto_bus_off_recovery = DISABLE; + ((can_parameter_struct*)p_struct)->no_auto_retrans = DISABLE; + ((can_parameter_struct*)p_struct)->auto_wake_up = DISABLE; + ((can_parameter_struct*)p_struct)->prescaler = 0x03FFU; + ((can_parameter_struct*)p_struct)->rec_fifo_overwrite = DISABLE; + ((can_parameter_struct*)p_struct)->resync_jump_width = CAN_BT_SJW_1TQ; + ((can_parameter_struct*)p_struct)->time_segment_1 = CAN_BT_BS1_3TQ; + ((can_parameter_struct*)p_struct)->time_segment_2 = CAN_BT_BS2_1TQ; + ((can_parameter_struct*)p_struct)->time_triggered = DISABLE; + ((can_parameter_struct*)p_struct)->trans_fifo_order = DISABLE; + ((can_parameter_struct*)p_struct)->working_mode = CAN_NORMAL_MODE; + + break; + /* used for can_filter_init() */ + case CAN_FILTER_STRUCT: + ((can_filter_parameter_struct*)p_struct)->filter_bits = CAN_FILTERBITS_32BIT; + ((can_filter_parameter_struct*)p_struct)->filter_enable = DISABLE; + ((can_filter_parameter_struct*)p_struct)->filter_fifo_number = CAN_FIFO0; + ((can_filter_parameter_struct*)p_struct)->filter_list_high = 0x0000U; + ((can_filter_parameter_struct*)p_struct)->filter_list_low = 0x0000U; + ((can_filter_parameter_struct*)p_struct)->filter_mask_high = 0x0000U; + ((can_filter_parameter_struct*)p_struct)->filter_mask_low = 0x0000U; + ((can_filter_parameter_struct*)p_struct)->filter_mode = CAN_FILTERMODE_MASK; + ((can_filter_parameter_struct*)p_struct)->filter_number = 0U; + + break; + /* used for can_message_transmit() */ + case CAN_TX_MESSAGE_STRUCT: + for(i = 0U; i < 8U; i++){ + ((can_trasnmit_message_struct*)p_struct)->tx_data[i] = 0U; + } + + ((can_trasnmit_message_struct*)p_struct)->tx_dlen = 0u; + ((can_trasnmit_message_struct*)p_struct)->tx_efid = 0U; + ((can_trasnmit_message_struct*)p_struct)->tx_ff = (uint8_t)CAN_FF_STANDARD; + ((can_trasnmit_message_struct*)p_struct)->tx_ft = (uint8_t)CAN_FT_DATA; + ((can_trasnmit_message_struct*)p_struct)->tx_sfid = 0U; + + break; + /* used for can_message_receive() */ + case CAN_RX_MESSAGE_STRUCT: + for(i = 0U; i < 8U; i++){ + ((can_receive_message_struct*)p_struct)->rx_data[i] = 0U; + } + + ((can_receive_message_struct*)p_struct)->rx_dlen = 0U; + ((can_receive_message_struct*)p_struct)->rx_efid = 0U; + ((can_receive_message_struct*)p_struct)->rx_ff = (uint8_t)CAN_FF_STANDARD; + ((can_receive_message_struct*)p_struct)->rx_fi = 0U; + ((can_receive_message_struct*)p_struct)->rx_ft = (uint8_t)CAN_FT_DATA; + ((can_receive_message_struct*)p_struct)->rx_sfid = 0U; + + break; + + default: + CAN_ERROR_HANDLE("parameter is invalid \r\n"); + } +} + +/*! + \brief initialize CAN + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] can_parameter_init: parameters for CAN initializtion + \arg working_mode: CAN_NORMAL_MODE, CAN_LOOPBACK_MODE, CAN_SILENT_MODE, CAN_SILENT_LOOPBACK_MODE + \arg resync_jump_width: CAN_BT_SJW_xTQ(x=1, 2, 3, 4) + \arg time_segment_1: CAN_BT_BS1_xTQ(1..16) + \arg time_segment_2: CAN_BT_BS2_xTQ(1..8) + \arg time_triggered: ENABLE or DISABLE + \arg auto_bus_off_recovery: ENABLE or DISABLE + \arg auto_wake_up: ENABLE or DISABLE + \arg no_auto_retrans: ENABLE or DISABLE + \arg rec_fifo_overwrite: ENABLE or DISABLE + \arg trans_fifo_order: ENABLE or DISABLE + \arg prescaler: 0x0000 - 0x03FF + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus can_init(uint32_t can_periph, can_parameter_struct* can_parameter_init) +{ + uint32_t timeout = CAN_TIMEOUT; + ErrStatus flag = ERROR; + + /* disable sleep mode */ + CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD; + /* enable initialize mode */ + CAN_CTL(can_periph) |= CAN_CTL_IWMOD; + /* wait ACK */ + while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)){ + timeout--; + } + /* check initialize working success */ + if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)){ + flag = ERROR; + }else{ + /* set the bit timing register */ + CAN_BT(can_periph) = (BT_MODE((uint32_t)can_parameter_init->working_mode) | \ + BT_SJW((uint32_t)can_parameter_init->resync_jump_width) | \ + BT_BS1((uint32_t)can_parameter_init->time_segment_1) | \ + BT_BS2((uint32_t)can_parameter_init->time_segment_2) | \ + BT_BAUDPSC(((uint32_t)(can_parameter_init->prescaler) - 1U))); + + /* time trigger communication mode */ + if(ENABLE == can_parameter_init->time_triggered){ + CAN_CTL(can_periph) |= CAN_CTL_TTC; + }else{ + CAN_CTL(can_periph) &= ~CAN_CTL_TTC; + } + /* automatic bus-off managment */ + if(ENABLE == can_parameter_init->auto_bus_off_recovery){ + CAN_CTL(can_periph) |= CAN_CTL_ABOR; + }else{ + CAN_CTL(can_periph) &= ~CAN_CTL_ABOR; + } + /* automatic wakeup mode */ + if(ENABLE == can_parameter_init->auto_wake_up){ + CAN_CTL(can_periph) |= CAN_CTL_AWU; + }else{ + CAN_CTL(can_periph) &= ~CAN_CTL_AWU; + } + /* automatic retransmission mode disable*/ + if(ENABLE == can_parameter_init->no_auto_retrans){ + CAN_CTL(can_periph) |= CAN_CTL_ARD; + }else{ + CAN_CTL(can_periph) &= ~CAN_CTL_ARD; + } + /* receive fifo overwrite mode */ + if(ENABLE == can_parameter_init->rec_fifo_overwrite){ + CAN_CTL(can_periph) |= CAN_CTL_RFOD; + }else{ + CAN_CTL(can_periph) &= ~CAN_CTL_RFOD; + } + /* transmit fifo order */ + if(ENABLE == can_parameter_init->trans_fifo_order){ + CAN_CTL(can_periph) |= CAN_CTL_TFO; + }else{ + CAN_CTL(can_periph) &= ~CAN_CTL_TFO; + } + /* disable initialize mode */ + CAN_CTL(can_periph) &= ~CAN_CTL_IWMOD; + timeout = CAN_TIMEOUT; + /* wait the ACK */ + while((CAN_STAT_IWS == (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)){ + timeout--; + } + /* check exit initialize mode */ + if(0U != timeout){ + flag = SUCCESS; + } + } + CAN_TMI0(can_periph) = 0x0; + CAN_TMI1(can_periph) = 0x0; + CAN_TMI2(can_periph) = 0x0; + CAN_TMP0(can_periph) = 0x0; + CAN_TMP1(can_periph) = 0x0; + CAN_TMP2(can_periph) = 0x0; + CAN_TMDATA00(can_periph) = 0x0; + CAN_TMDATA01(can_periph) = 0x0; + CAN_TMDATA02(can_periph) = 0x0; + CAN_TMDATA10(can_periph) = 0x0; + CAN_TMDATA11(can_periph) = 0x0; + CAN_TMDATA12(can_periph) = 0x0; + + return flag; +} + +/*! + \brief initialize CAN filter + \param[in] can_filter_parameter_init: struct for CAN filter initialization + \arg filter_list_high: 0x0000 - 0xFFFF + \arg filter_list_low: 0x0000 - 0xFFFF + \arg filter_mask_high: 0x0000 - 0xFFFF + \arg filter_mask_low: 0x0000 - 0xFFFF + \arg filter_fifo_number: CAN_FIFO0, CAN_FIFO1 + \arg filter_number: 0 - 27 + \arg filter_mode: CAN_FILTERMODE_MASK, CAN_FILTERMODE_LIST + \arg filter_bits: CAN_FILTERBITS_32BIT, CAN_FILTERBITS_16BIT + \arg filter_enable: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void can_filter_init(can_filter_parameter_struct* can_filter_parameter_init) +{ + uint32_t val = 0U; + + val = ((uint32_t)1) << (can_filter_parameter_init->filter_number); + /* filter lock disable */ + CAN_FCTL(CAN0) |= CAN_FCTL_FLD; + /* disable filter */ + CAN_FW(CAN0) &= ~(uint32_t)val; + + /* filter 16 bits */ + if(CAN_FILTERBITS_16BIT == can_filter_parameter_init->filter_bits){ + /* set filter 16 bits */ + CAN_FSCFG(CAN0) &= ~(uint32_t)val; + /* first 16 bits list and first 16 bits mask or first 16 bits list and second 16 bits list */ + CAN_FDATA0(CAN0, can_filter_parameter_init->filter_number) = \ + FDATA_MASK_HIGH((can_filter_parameter_init->filter_mask_low) & CAN_FILTER_MASK_16BITS) | \ + FDATA_MASK_LOW((can_filter_parameter_init->filter_list_low) & CAN_FILTER_MASK_16BITS); + /* second 16 bits list and second 16 bits mask or third 16 bits list and fourth 16 bits list */ + CAN_FDATA1(CAN0, can_filter_parameter_init->filter_number) = \ + FDATA_MASK_HIGH((can_filter_parameter_init->filter_mask_high) & CAN_FILTER_MASK_16BITS) | \ + FDATA_MASK_LOW((can_filter_parameter_init->filter_list_high) & CAN_FILTER_MASK_16BITS); + } + /* filter 32 bits */ + if(CAN_FILTERBITS_32BIT == can_filter_parameter_init->filter_bits){ + /* set filter 32 bits */ + CAN_FSCFG(CAN0) |= (uint32_t)val; + /* 32 bits list or first 32 bits list */ + CAN_FDATA0(CAN0, can_filter_parameter_init->filter_number) = \ + FDATA_MASK_HIGH((can_filter_parameter_init->filter_list_high) & CAN_FILTER_MASK_16BITS) | + FDATA_MASK_LOW((can_filter_parameter_init->filter_list_low) & CAN_FILTER_MASK_16BITS); + /* 32 bits mask or second 32 bits list */ + CAN_FDATA1(CAN0, can_filter_parameter_init->filter_number) = \ + FDATA_MASK_HIGH((can_filter_parameter_init->filter_mask_high) & CAN_FILTER_MASK_16BITS) | + FDATA_MASK_LOW((can_filter_parameter_init->filter_mask_low) & CAN_FILTER_MASK_16BITS); + } + + /* filter mode */ + if(CAN_FILTERMODE_MASK == can_filter_parameter_init->filter_mode){ + /* mask mode */ + CAN_FMCFG(CAN0) &= ~(uint32_t)val; + }else{ + /* list mode */ + CAN_FMCFG(CAN0) |= (uint32_t)val; + } + + /* filter FIFO */ + if(CAN_FIFO0 == (can_filter_parameter_init->filter_fifo_number)){ + /* FIFO0 */ + CAN_FAFIFO(CAN0) &= ~(uint32_t)val; + }else{ + /* FIFO1 */ + CAN_FAFIFO(CAN0) |= (uint32_t)val; + } + + /* filter working */ + if(ENABLE == can_filter_parameter_init->filter_enable){ + + CAN_FW(CAN0) |= (uint32_t)val; + } + + /* filter lock enable */ + CAN_FCTL(CAN0) &= ~CAN_FCTL_FLD; +} + +/*! + \brief set CAN1 fliter start bank number + \param[in] start_bank: CAN1 start bank number + only one parameter can be selected which is shown as below: + \arg (1..27) + \param[out] none + \retval none +*/ +void can1_filter_start_bank(uint8_t start_bank) +{ + /* filter lock disable */ + CAN_FCTL(CAN0) |= CAN_FCTL_FLD; + /* set CAN1 filter start number */ + CAN_FCTL(CAN0) &= ~(uint32_t)CAN_FCTL_HBC1F; + CAN_FCTL(CAN0) |= FCTL_HBC1F(start_bank); + /* filter lock enaable */ + CAN_FCTL(CAN0) &= ~CAN_FCTL_FLD; +} + +/*! + \brief enable CAN debug freeze + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval none +*/ +void can_debug_freeze_enable(uint32_t can_periph) +{ + /* set DFZ bit */ + CAN_CTL(can_periph) |= CAN_CTL_DFZ; + if(CAN0 == can_periph){ + dbg_periph_enable(DBG_CAN0_HOLD); + }else{ + dbg_periph_enable(DBG_CAN1_HOLD); + } +} + +/*! + \brief disable CAN debug freeze + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval none +*/ +void can_debug_freeze_disable(uint32_t can_periph) +{ + /* set DFZ bit */ + CAN_CTL(can_periph) &= ~CAN_CTL_DFZ; + if(CAN0 == can_periph){ + dbg_periph_disable(DBG_CAN0_HOLD); + }else{ + dbg_periph_disable(DBG_CAN1_HOLD); + } +} + +/*! + \brief enable CAN time trigger mode + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval none +*/ +void can_time_trigger_mode_enable(uint32_t can_periph) +{ + uint8_t mailbox_number; + + /* enable the tcc mode */ + CAN_CTL(can_periph) |= CAN_CTL_TTC; + /* enable time stamp */ + for(mailbox_number = 0U; mailbox_number < 3U; mailbox_number++){ + CAN_TMP(can_periph, mailbox_number) |= CAN_TMP_TSEN; + } +} + +/*! + \brief disable CAN time trigger mode + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval none +*/ +void can_time_trigger_mode_disable(uint32_t can_periph) +{ + uint8_t mailbox_number; + + /* disable the TCC mode */ + CAN_CTL(can_periph) &= ~CAN_CTL_TTC; + /* reset TSEN bits */ + for(mailbox_number = 0U; mailbox_number < 3U; mailbox_number++){ + CAN_TMP(can_periph, mailbox_number) &= ~CAN_TMP_TSEN; + } +} + +/*! + \brief transmit CAN message + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] transmit_message: struct for CAN transmit message + \arg tx_sfid: 0x00000000 - 0x000007FF + \arg tx_efid: 0x00000000 - 0x1FFFFFFF + \arg tx_ff: CAN_FF_STANDARD, CAN_FF_EXTENDED + \arg tx_ft: CAN_FT_DATA, CAN_FT_REMOTE + \arg tx_dlenc: 1 - 7 + \arg tx_data[]: 0x00 - 0xFF + \param[out] none + \retval mailbox_number +*/ +uint8_t can_message_transmit(uint32_t can_periph, can_trasnmit_message_struct* transmit_message) +{ + uint8_t mailbox_number = CAN_MAILBOX0; + + /* select one empty mailbox */ + if(CAN_TSTAT_TME0 == (CAN_TSTAT(can_periph)&CAN_TSTAT_TME0)){ + mailbox_number = CAN_MAILBOX0; + }else if(CAN_TSTAT_TME1 == (CAN_TSTAT(can_periph)&CAN_TSTAT_TME1)){ + mailbox_number = CAN_MAILBOX1; + }else if(CAN_TSTAT_TME2 == (CAN_TSTAT(can_periph)&CAN_TSTAT_TME2)){ + mailbox_number = CAN_MAILBOX2; + }else{ + mailbox_number = CAN_NOMAILBOX; + } + /* return no mailbox empty */ + if(CAN_NOMAILBOX == mailbox_number){ + return CAN_NOMAILBOX; + } + + CAN_TMI(can_periph, mailbox_number) &= CAN_TMI_TEN; + if(CAN_FF_STANDARD == transmit_message->tx_ff){ + /* set transmit mailbox standard identifier */ + CAN_TMI(can_periph, mailbox_number) |= (uint32_t)(TMI_SFID(transmit_message->tx_sfid) | \ + transmit_message->tx_ft); + }else{ + /* set transmit mailbox extended identifier */ + CAN_TMI(can_periph, mailbox_number) |= (uint32_t)(TMI_EFID(transmit_message->tx_efid) | \ + transmit_message->tx_ff | \ + transmit_message->tx_ft); + } + /* set the data length */ + CAN_TMP(can_periph, mailbox_number) &= ~CAN_TMP_DLENC; + CAN_TMP(can_periph, mailbox_number) |= transmit_message->tx_dlen; + /* set the data */ + CAN_TMDATA0(can_periph, mailbox_number) = TMDATA0_DB3(transmit_message->tx_data[3]) | \ + TMDATA0_DB2(transmit_message->tx_data[2]) | \ + TMDATA0_DB1(transmit_message->tx_data[1]) | \ + TMDATA0_DB0(transmit_message->tx_data[0]); + CAN_TMDATA1(can_periph, mailbox_number) = TMDATA1_DB7(transmit_message->tx_data[7]) | \ + TMDATA1_DB6(transmit_message->tx_data[6]) | \ + TMDATA1_DB5(transmit_message->tx_data[5]) | \ + TMDATA1_DB4(transmit_message->tx_data[4]); + /* enable transmission */ + CAN_TMI(can_periph, mailbox_number) |= CAN_TMI_TEN; + + return mailbox_number; +} + +/*! + \brief get CAN transmit state + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] mailbox_number + only one parameter can be selected which is shown as below: + \arg CAN_MAILBOX(x=0,1,2) + \param[out] none + \retval can_transmit_state_enum +*/ +can_transmit_state_enum can_transmit_states(uint32_t can_periph, uint8_t mailbox_number) +{ + can_transmit_state_enum state = CAN_TRANSMIT_FAILED; + uint32_t val = 0U; + + /* check selected mailbox state */ + switch(mailbox_number){ + /* mailbox0 */ + case CAN_MAILBOX0: + val = CAN_TSTAT(can_periph) & (CAN_TSTAT_MTF0 | CAN_TSTAT_MTFNERR0 | CAN_TSTAT_TME0); + break; + /* mailbox1 */ + case CAN_MAILBOX1: + val = CAN_TSTAT(can_periph) & (CAN_TSTAT_MTF1 | CAN_TSTAT_MTFNERR1 | CAN_TSTAT_TME1); + break; + /* mailbox2 */ + case CAN_MAILBOX2: + val = CAN_TSTAT(can_periph) & (CAN_TSTAT_MTF2 | CAN_TSTAT_MTFNERR2 | CAN_TSTAT_TME2); + break; + default: + val = CAN_TRANSMIT_FAILED; + break; + } + + switch(val){ + /* transmit pending */ + case (CAN_STATE_PENDING): + state = CAN_TRANSMIT_PENDING; + break; + /* mailbox0 transmit succeeded */ + case (CAN_TSTAT_MTF0 | CAN_TSTAT_MTFNERR0 | CAN_TSTAT_TME0): + state = CAN_TRANSMIT_OK; + break; + /* mailbox1 transmit succeeded */ + case (CAN_TSTAT_MTF1 | CAN_TSTAT_MTFNERR1 | CAN_TSTAT_TME1): + state = CAN_TRANSMIT_OK; + break; + /* mailbox2 transmit succeeded */ + case (CAN_TSTAT_MTF2 | CAN_TSTAT_MTFNERR2 | CAN_TSTAT_TME2): + state = CAN_TRANSMIT_OK; + break; + /* transmit failed */ + default: + state = CAN_TRANSMIT_FAILED; + break; + } + return state; +} + +/*! + \brief stop CAN transmission + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] mailbox_number + only one parameter can be selected which is shown as below: + \arg CAN_MAILBOXx(x=0,1,2) + \param[out] none + \retval none +*/ +void can_transmission_stop(uint32_t can_periph, uint8_t mailbox_number) +{ + if(CAN_MAILBOX0 == mailbox_number){ + CAN_TSTAT(can_periph) |= CAN_TSTAT_MST0; + while(CAN_TSTAT_MST0 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST0)){ + } + }else if(CAN_MAILBOX1 == mailbox_number){ + CAN_TSTAT(can_periph) |= CAN_TSTAT_MST1; + while(CAN_TSTAT_MST1 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST1)){ + } + }else if(CAN_MAILBOX2 == mailbox_number){ + CAN_TSTAT(can_periph) |= CAN_TSTAT_MST2; + while(CAN_TSTAT_MST2 == (CAN_TSTAT(can_periph) & CAN_TSTAT_MST2)){ + } + }else{ + /* illegal parameters */ + } +} + +/*! + \brief CAN receive message + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] fifo_number + \arg CAN_FIFOx(x=0,1) + \param[out] receive_message: struct for CAN receive message + \arg rx_sfid: 0x00000000 - 0x000007FF + \arg rx_efid: 0x00000000 - 0x1FFFFFFF + \arg rx_ff: CAN_FF_STANDARD, CAN_FF_EXTENDED + \arg rx_ft: CAN_FT_DATA, CAN_FT_REMOTE + \arg rx_dlenc: 1 - 7 + \arg rx_data[]: 0x00 - 0xFF + \arg rx_fi: 0 - 27 + \retval none +*/ +void can_message_receive(uint32_t can_periph, uint8_t fifo_number, can_receive_message_struct* receive_message) +{ + /* get the frame format */ + receive_message->rx_ff = (uint8_t)(CAN_RFIFOMI_FF & CAN_RFIFOMI(can_periph, fifo_number)); + if(CAN_FF_STANDARD == receive_message->rx_ff){ + /* get standard identifier */ + receive_message->rx_sfid = (uint32_t)(GET_RFIFOMI_SFID(CAN_RFIFOMI(can_periph, fifo_number))); + }else{ + /* get extended identifier */ + receive_message->rx_efid = (uint32_t)(GET_RFIFOMI_EFID(CAN_RFIFOMI(can_periph, fifo_number))); + } + + /* get frame type */ + receive_message->rx_ft = (uint8_t)(CAN_RFIFOMI_FT & CAN_RFIFOMI(can_periph, fifo_number)); + /* filtering index */ + receive_message->rx_fi = (uint8_t)(GET_RFIFOMP_FI(CAN_RFIFOMP(can_periph, fifo_number))); + /* get recevie data length */ + receive_message->rx_dlen = (uint8_t)(GET_RFIFOMP_DLENC(CAN_RFIFOMP(can_periph, fifo_number))); + + /* receive data */ + receive_message -> rx_data[0] = (uint8_t)(GET_RFIFOMDATA0_DB0(CAN_RFIFOMDATA0(can_periph, fifo_number))); + receive_message -> rx_data[1] = (uint8_t)(GET_RFIFOMDATA0_DB1(CAN_RFIFOMDATA0(can_periph, fifo_number))); + receive_message -> rx_data[2] = (uint8_t)(GET_RFIFOMDATA0_DB2(CAN_RFIFOMDATA0(can_periph, fifo_number))); + receive_message -> rx_data[3] = (uint8_t)(GET_RFIFOMDATA0_DB3(CAN_RFIFOMDATA0(can_periph, fifo_number))); + receive_message -> rx_data[4] = (uint8_t)(GET_RFIFOMDATA1_DB4(CAN_RFIFOMDATA1(can_periph, fifo_number))); + receive_message -> rx_data[5] = (uint8_t)(GET_RFIFOMDATA1_DB5(CAN_RFIFOMDATA1(can_periph, fifo_number))); + receive_message -> rx_data[6] = (uint8_t)(GET_RFIFOMDATA1_DB6(CAN_RFIFOMDATA1(can_periph, fifo_number))); + receive_message -> rx_data[7] = (uint8_t)(GET_RFIFOMDATA1_DB7(CAN_RFIFOMDATA1(can_periph, fifo_number))); + + /* release FIFO */ + if(CAN_FIFO0 == fifo_number){ + CAN_RFIFO0(can_periph) |= CAN_RFIFO0_RFD0; + }else{ + CAN_RFIFO1(can_periph) |= CAN_RFIFO1_RFD1; + } +} + +/*! + \brief release FIFO0 + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] fifo_number + only one parameter can be selected which is shown as below: + \arg CAN_FIFOx(x=0,1) + \param[out] none + \retval none +*/ +void can_fifo_release(uint32_t can_periph, uint8_t fifo_number) +{ + if(CAN_FIFO0 == fifo_number){ + CAN_RFIFO0(can_periph) |= CAN_RFIFO0_RFD0; + }else if(CAN_FIFO1 == fifo_number){ + CAN_RFIFO1(can_periph) |= CAN_RFIFO1_RFD1; + }else{ + /* illegal parameters */ + CAN_ERROR_HANDLE("CAN FIFO NUM is invalid \r\n"); + } +} + +/*! + \brief CAN receive message length + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] fifo_number + only one parameter can be selected which is shown as below: + \arg CAN_FIFOx(x=0,1) + \param[out] none + \retval message length +*/ +uint8_t can_receive_message_length_get(uint32_t can_periph, uint8_t fifo_number) +{ + uint8_t val = 0U; + + if(CAN_FIFO0 == fifo_number){ + /* FIFO0 */ + val = (uint8_t)(CAN_RFIFO0(can_periph) & CAN_RFIF_RFL_MASK); + }else if(CAN_FIFO1 == fifo_number){ + /* FIFO1 */ + val = (uint8_t)(CAN_RFIFO1(can_periph) & CAN_RFIF_RFL_MASK); + }else{ + /* illegal parameters */ + } + return val; +} + +/*! + \brief set CAN working mode + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] can_working_mode + only one parameter can be selected which is shown as below: + \arg CAN_MODE_INITIALIZE + \arg CAN_MODE_NORMAL + \arg CAN_MODE_SLEEP + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus can_working_mode_set(uint32_t can_periph, uint8_t working_mode) +{ + ErrStatus flag = ERROR; + /* timeout for IWS or also for SLPWS bits */ + uint32_t timeout = CAN_TIMEOUT; + + if(CAN_MODE_INITIALIZE == working_mode){ + /* disable sleep mode */ + CAN_CTL(can_periph) &= (~(uint32_t)CAN_CTL_SLPWMOD); + /* set initialize mode */ + CAN_CTL(can_periph) |= (uint8_t)CAN_CTL_IWMOD; + /* wait the acknowledge */ + while((CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)) && (0U != timeout)){ + timeout--; + } + if(CAN_STAT_IWS != (CAN_STAT(can_periph) & CAN_STAT_IWS)){ + flag = ERROR; + }else{ + flag = SUCCESS; + } + }else if(CAN_MODE_NORMAL == working_mode){ + /* enter normal mode */ + CAN_CTL(can_periph) &= ~(uint32_t)(CAN_CTL_SLPWMOD | CAN_CTL_IWMOD); + /* wait the acknowledge */ + while((0U != (CAN_STAT(can_periph) & (CAN_STAT_IWS | CAN_STAT_SLPWS))) && (0U != timeout)){ + timeout--; + } + if(0U != (CAN_STAT(can_periph) & (CAN_STAT_IWS | CAN_STAT_SLPWS))){ + flag = ERROR; + }else{ + flag = SUCCESS; + } + }else if(CAN_MODE_SLEEP == working_mode){ + /* disable initialize mode */ + CAN_CTL(can_periph) &= (~(uint32_t)CAN_CTL_IWMOD); + /* set sleep mode */ + CAN_CTL(can_periph) |= (uint8_t)CAN_CTL_SLPWMOD; + /* wait the acknowledge */ + while((CAN_STAT_SLPWS != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)) && (0U != timeout)){ + timeout--; + } + if(CAN_STAT_SLPWS != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)){ + flag = ERROR; + }else{ + flag = SUCCESS; + } + }else{ + flag = ERROR; + } + return flag; +} + +/*! + \brief wake up CAN + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus can_wakeup(uint32_t can_periph) +{ + ErrStatus flag = ERROR; + uint32_t timeout = CAN_TIMEOUT; + + /* wakeup */ + CAN_CTL(can_periph) &= ~CAN_CTL_SLPWMOD; + + while((0U != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)) && (0x00U != timeout)){ + timeout--; + } + /* check state */ + if(0U != (CAN_STAT(can_periph) & CAN_STAT_SLPWS)){ + flag = ERROR; + }else{ + flag = SUCCESS; + } + return flag; +} + +/*! + \brief get CAN error type + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval can_error_enum + \arg CAN_ERROR_NONE: no error + \arg CAN_ERROR_FILL: fill error + \arg CAN_ERROR_FORMATE: format error + \arg CAN_ERROR_ACK: ACK error + \arg CAN_ERROR_BITRECESSIVE: bit recessive + \arg CAN_ERROR_BITDOMINANTER: bit dominant error + \arg CAN_ERROR_CRC: CRC error + \arg CAN_ERROR_SOFTWARECFG: software configure +*/ +can_error_enum can_error_get(uint32_t can_periph) +{ + can_error_enum error; + error = CAN_ERROR_NONE; + + /* get error type */ + error = (can_error_enum)(GET_ERR_ERRN(CAN_ERR(can_periph))); + return error; +} + +/*! + \brief get CAN receive error number + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval error number +*/ +uint8_t can_receive_error_number_get(uint32_t can_periph) +{ + uint8_t val; + + /* get error count */ + val = (uint8_t)(GET_ERR_RECNT(CAN_ERR(can_periph))); + return val; +} + +/*! + \brief get CAN transmit error number + \param[in] can_periph + \arg CANx(x=0,1) + \param[out] none + \retval error number +*/ +uint8_t can_transmit_error_number_get(uint32_t can_periph) +{ + uint8_t val; + + val = (uint8_t)(GET_ERR_TECNT(CAN_ERR(can_periph))); + return val; +} + +/*! + \brief enable CAN interrupt + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] interrupt + one or more parameters can be selected which are shown as below: + \arg CAN_INT_TME: transmit mailbox empty interrupt enable + \arg CAN_INT_RFNE0: receive FIFO0 not empty interrupt enable + \arg CAN_INT_RFF0: receive FIFO0 full interrupt enable + \arg CAN_INT_RFO0: receive FIFO0 overfull interrupt enable + \arg CAN_INT_RFNE1: receive FIFO1 not empty interrupt enable + \arg CAN_INT_RFF1: receive FIFO1 full interrupt enable + \arg CAN_INT_RFO1: receive FIFO1 overfull interrupt enable + \arg CAN_INT_WERR: warning error interrupt enable + \arg CAN_INT_PERR: passive error interrupt enable + \arg CAN_INT_BO: bus-off interrupt enable + \arg CAN_INT_ERRN: error number interrupt enable + \arg CAN_INT_ERR: error interrupt enable + \arg CAN_INT_WU: wakeup interrupt enable + \arg CAN_INT_SLPW: sleep working interrupt enable + \param[out] none + \retval none +*/ +void can_interrupt_enable(uint32_t can_periph, uint32_t interrupt) +{ + CAN_INTEN(can_periph) |= interrupt; +} + +/*! + \brief disable CAN interrupt + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] interrupt + one or more parameters can be selected which are shown as below: + \arg CAN_INT_TME: transmit mailbox empty interrupt enable + \arg CAN_INT_RFNE0: receive FIFO0 not empty interrupt enable + \arg CAN_INT_RFF0: receive FIFO0 full interrupt enable + \arg CAN_INT_RFO0: receive FIFO0 overfull interrupt enable + \arg CAN_INT_RFNE1: receive FIFO1 not empty interrupt enable + \arg CAN_INT_RFF1: receive FIFO1 full interrupt enable + \arg CAN_INT_RFO1: receive FIFO1 overfull interrupt enable + \arg CAN_INT_WERR: warning error interrupt enable + \arg CAN_INT_PERR: passive error interrupt enable + \arg CAN_INT_BO: bus-off interrupt enable + \arg CAN_INT_ERRN: error number interrupt enable + \arg CAN_INT_ERR: error interrupt enable + \arg CAN_INT_WU: wakeup interrupt enable + \arg CAN_INT_SLPW: sleep working interrupt enable + \param[out] none + \retval none +*/ +void can_interrupt_disable(uint32_t can_periph, uint32_t interrupt) +{ + CAN_INTEN(can_periph) &= ~interrupt; +} + +/*! + \brief get CAN flag state + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] flag: CAN flags, refer to can_flag_enum + only one parameter can be selected which is shown as below: + \arg CAN_FLAG_MTE2: mailbox 2 transmit error + \arg CAN_FLAG_MTE1: mailbox 1 transmit error + \arg CAN_FLAG_MTE0: mailbox 0 transmit error + \arg CAN_FLAG_MTF2: mailbox 2 transmit finished + \arg CAN_FLAG_MTF1: mailbox 1 transmit finished + \arg CAN_FLAG_MTF0: mailbox 0 transmit finished + \arg CAN_FLAG_RFO0: receive FIFO0 overfull + \arg CAN_FLAG_RFF0: receive FIFO0 full + \arg CAN_FLAG_RFO1: receive FIFO1 overfull + \arg CAN_FLAG_RFF1: receive FIFO1 full + \arg CAN_FLAG_BOERR: bus-off error + \arg CAN_FLAG_PERR: passive error + \arg CAN_FLAG_WERR: warning error + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus can_flag_get(uint32_t can_periph, can_flag_enum flag) +{ + /* get flag and interrupt enable state */ + if(RESET != (CAN_REG_VAL(can_periph, flag) & BIT(CAN_BIT_POS(flag)))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear CAN flag state + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] flag: CAN flags, refer to can_flag_enum + only one parameter can be selected which is shown as below: + \arg CAN_FLAG_MTE2: mailbox 2 transmit error + \arg CAN_FLAG_MTE1: mailbox 1 transmit error + \arg CAN_FLAG_MTE0: mailbox 0 transmit error + \arg CAN_FLAG_MTF2: mailbox 2 transmit finished + \arg CAN_FLAG_MTF1: mailbox 1 transmit finished + \arg CAN_FLAG_MTF0: mailbox 0 transmit finished + \arg CAN_FLAG_RFO0: receive FIFO0 overfull + \arg CAN_FLAG_RFF0: receive FIFO0 full + \arg CAN_FLAG_RFO1: receive FIFO1 overfull + \arg CAN_FLAG_RFF1: receive FIFO1 full + \arg CAN_FLAG_BOERR: bus-off error + \arg CAN_FLAG_PERR: passive error + \arg CAN_FLAG_WERR: warning error + \param[out] none + \retval none +*/ +void can_flag_clear(uint32_t can_periph, can_flag_enum flag) +{ + CAN_REG_VAL(can_periph, flag) = BIT(CAN_BIT_POS(flag)); +} + +/*! + \brief get CAN interrupt flag state + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] flag: CAN interrupt flags, refer to can_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg CAN_INT_FLAG_SLPIF: status change interrupt flag of sleep working mode entering + \arg CAN_INT_FLAG_WUIF: status change interrupt flag of wakeup from sleep working mode + \arg CAN_INT_FLAG_ERRIF: error interrupt flag + \arg CAN_INT_FLAG_MTF2: mailbox 2 transmit finished interrupt flag + \arg CAN_INT_FLAG_MTF1: mailbox 1 transmit finished interrupt flag + \arg CAN_INT_FLAG_MTF0: mailbox 0 transmit finished interrupt flag + \arg CAN_INT_FLAG_RFO0: receive FIFO0 overfull interrupt flag + \arg CAN_INT_FLAG_RFF0: receive FIFO0 full interrupt flag + \arg CAN_INT_FLAG_RFO1: receive FIFO1 overfull interrupt flag + \arg CAN_INT_FLAG_RFF1: receive FIFO1 full interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus can_interrupt_flag_get(uint32_t can_periph, can_interrupt_flag_enum flag) +{ + uint32_t ret1 = RESET; + uint32_t ret2 = RESET; + + /* get the staus of interrupt flag */ + ret1 = CAN_REG_VALS(can_periph, flag) & BIT(CAN_BIT_POS0(flag)); + /* get the staus of interrupt enale bit */ + ret2 = CAN_INTEN(can_periph) & BIT(CAN_BIT_POS1(flag)); + if(ret1 && ret2){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear CAN interrupt flag state + \param[in] can_periph + \arg CANx(x=0,1) + \param[in] flag: CAN interrupt flags, refer to can_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg CAN_INT_FLAG_SLPIF: status change interrupt flag of sleep working mode entering + \arg CAN_INT_FLAG_WUIF: status change interrupt flag of wakeup from sleep working mode + \arg CAN_INT_FLAG_ERRIF: error interrupt flag + \arg CAN_INT_FLAG_MTF2: mailbox 2 transmit finished interrupt flag + \arg CAN_INT_FLAG_MTF1: mailbox 1 transmit finished interrupt flag + \arg CAN_INT_FLAG_MTF0: mailbox 0 transmit finished interrupt flag + \arg CAN_INT_FLAG_RFO0: receive FIFO0 overfull interrupt flag + \arg CAN_INT_FLAG_RFF0: receive FIFO0 full interrupt flag + \arg CAN_INT_FLAG_RFO1: receive FIFO1 overfull interrupt flag + \arg CAN_INT_FLAG_RFF1: receive FIFO1 full interrupt flag + \arg CAN_FLAG_BOERR: bus-off error + \arg CAN_FLAG_PERR: passive error + \arg CAN_FLAG_WERR: warning error + \param[out] none + \retval none +*/ +void can_interrupt_flag_clear(uint32_t can_periph, can_interrupt_flag_enum flag) +{ + CAN_REG_VALS(can_periph, flag) = BIT(CAN_BIT_POS0(flag)); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c new file mode 100644 index 0000000..b4fb680 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c @@ -0,0 +1,127 @@ +/*! + \file gd32vf103_crc.c + \brief CRC driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_crc.h" + +#define CRC_DATA_RESET_VALUE ((uint32_t)0xFFFFFFFFU) +#define CRC_FDATA_RESET_VALUE ((uint32_t)0x00000000U) + +/*! + \brief deinit CRC calculation unit + \param[in] none + \param[out] none + \retval none +*/ +void crc_deinit(void) +{ + CRC_DATA = CRC_DATA_RESET_VALUE; + CRC_FDATA = CRC_FDATA_RESET_VALUE; + CRC_CTL = (uint32_t)CRC_CTL_RST; +} + +/*! + \brief reset data register(CRC_DATA) to the value of 0xFFFFFFFF + \param[in] none + \param[out] none + \retval none +*/ +void crc_data_register_reset(void) +{ + CRC_CTL |= (uint32_t)CRC_CTL_RST; +} + +/*! + \brief read the value of the data register + \param[in] none + \param[out] none + \retval 32-bit value of the data register +*/ +uint32_t crc_data_register_read(void) +{ + uint32_t data; + data = CRC_DATA; + return (data); +} + +/*! + \brief read the value of the free data register + \param[in] none + \param[out] none + \retval 8-bit value of the free data register +*/ +uint8_t crc_free_data_register_read(void) +{ + uint8_t fdata; + fdata = (uint8_t)CRC_FDATA; + return (fdata); +} + +/*! + \brief write data to the free data register + \param[in] free_data: specified 8-bit data + \param[out] none + \retval none +*/ +void crc_free_data_register_write(uint8_t free_data) +{ + CRC_FDATA = (uint32_t)free_data; +} + +/*! + \brief calculate the CRC value of a 32-bit data + \param[in] sdata: specified 32-bit data + \param[out] none + \retval 32-bit value calculated by CRC +*/ +uint32_t crc_single_data_calculate(uint32_t sdata) +{ + CRC_DATA = sdata; + return (CRC_DATA); +} + +/*! + \brief calculate the CRC value of an array of 32-bit values + \param[in] array: pointer to an array of 32-bit values + \param[in] size: size of the array + \param[out] none + \retval 32-bit value calculated by CRC +*/ +uint32_t crc_block_data_calculate(uint32_t array[], uint32_t size) +{ + uint32_t index; + for(index = 0U; index < size; index++){ + CRC_DATA = array[index]; + } + return (CRC_DATA); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c new file mode 100644 index 0000000..c866e07 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c @@ -0,0 +1,537 @@ +/*! + \file gd32vf103_dac.c + \brief DAC driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_dac.h" + +/* DAC register bit offset */ +#define DAC1_REG_OFFSET ((uint32_t)16U) +#define DH_12BIT_OFFSET ((uint32_t)16U) +#define DH_8BIT_OFFSET ((uint32_t)8U) + +/*! + \brief deinitialize DAC + \param[in] none + \param[out] none + \retval none +*/ +void dac_deinit(void) +{ + rcu_periph_reset_enable(RCU_DACRST); + rcu_periph_reset_disable(RCU_DACRST); +} + +/*! + \brief enable DAC + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_enable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL |= DAC_CTL_DEN0; + }else{ + DAC_CTL |= DAC_CTL_DEN1; + } +} + +/*! + \brief disable DAC + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_disable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL &= ~DAC_CTL_DEN0; + }else{ + DAC_CTL &= ~DAC_CTL_DEN1; + } +} + +/*! + \brief enable DAC DMA function + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_dma_enable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL |= DAC_CTL_DDMAEN0; + }else{ + DAC_CTL |= DAC_CTL_DDMAEN1; + } +} + +/*! + \brief disable DAC DMA function + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_dma_disable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL &= ~DAC_CTL_DDMAEN0; + }else{ + DAC_CTL &= ~DAC_CTL_DDMAEN1; + } +} + +/*! + \brief enable DAC output buffer + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_output_buffer_enable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL &= ~DAC_CTL_DBOFF0; + }else{ + DAC_CTL &= ~DAC_CTL_DBOFF1; + } +} + +/*! + \brief disable DAC output buffer + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_output_buffer_disable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL |= DAC_CTL_DBOFF0; + }else{ + DAC_CTL |= DAC_CTL_DBOFF1; + } +} + +/*! + \brief get DAC output value + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval DAC output data +*/ +uint16_t dac_output_value_get(uint32_t dac_periph) +{ + uint16_t data = 0U; + if(DAC0 == dac_periph){ + /* store the DAC0 output value */ + data = (uint16_t)DAC0_DO; + }else{ + /* store the DAC1 output value */ + data = (uint16_t)DAC1_DO; + } + return data; +} + +/*! + \brief set the DAC specified data holding register value + \param[in] dac_periph: DACx(x = 0,1) + \param[in] dac_align: data alignment + only one parameter can be selected which is shown as below: + \arg DAC_ALIGN_8B_R: data right 8 bit alignment + \arg DAC_ALIGN_12B_R: data right 12 bit alignment + \arg DAC_ALIGN_12B_L: data left 12 bit alignment + \param[in] data: data to be loaded + \param[out] none + \retval none +*/ +void dac_data_set(uint32_t dac_periph, uint32_t dac_align, uint16_t data) +{ + if(DAC0 == dac_periph){ + switch(dac_align){ + /* data right 12 bit alignment */ + case DAC_ALIGN_12B_R: + DAC0_R12DH = data; + break; + /* data left 12 bit alignment */ + case DAC_ALIGN_12B_L: + DAC0_L12DH = data; + break; + /* data right 8 bit alignment */ + case DAC_ALIGN_8B_R: + DAC0_R8DH = data; + break; + default: + break; + } + }else{ + switch(dac_align){ + /* data right 12 bit alignment */ + case DAC_ALIGN_12B_R: + DAC1_R12DH = data; + break; + /* data left 12 bit alignment */ + case DAC_ALIGN_12B_L: + DAC1_L12DH = data; + break; + /* data right 8 bit alignment */ + case DAC_ALIGN_8B_R: + DAC1_R8DH = data; + break; + default: + break; + } + } +} + +/*! + \brief enable DAC trigger + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_trigger_enable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL |= DAC_CTL_DTEN0; + }else{ + DAC_CTL |= DAC_CTL_DTEN1; + } +} + +/*! + \brief disable DAC trigger + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_trigger_disable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_CTL &= ~DAC_CTL_DTEN0; + }else{ + DAC_CTL &= ~DAC_CTL_DTEN1; + } +} + +/*! + \brief set DAC trigger source + \param[in] dac_periph: DACx(x = 0,1) + \param[in] triggersource: external triggers of DAC + only one parameter can be selected which is shown as below: + \arg DAC_TRIGGER_T1_TRGO: TIMER1 TRGO + \arg DAC_TRIGGER_T2_TRGO: TIMER2 TRGO + \arg DAC_TRIGGER_T3_TRGO: TIMER3 TRGO + \arg DAC_TRIGGER_T4_TRGO: TIMER4 TRGO + \arg DAC_TRIGGER_T5_TRGO: TIMER5 TRGO + \arg DAC_TRIGGER_T6_TRGO: TIMER6 TRGO + \arg DAC_TRIGGER_EXTI_9: EXTI interrupt line9 event + \arg DAC_TRIGGER_SOFTWARE: software trigger + \param[out] none + \retval none +*/ +void dac_trigger_source_config(uint32_t dac_periph,uint32_t triggersource) +{ + if(DAC0 == dac_periph){ + /* configure DAC0 trigger source */ + DAC_CTL &= ~DAC_CTL_DTSEL0; + DAC_CTL |= triggersource; + }else{ + /* configure DAC1 trigger source */ + DAC_CTL &= ~DAC_CTL_DTSEL1; + DAC_CTL |= (triggersource << DAC1_REG_OFFSET); + } +} + +/*! + \brief enable DAC software trigger + \param[in] dac_periph: DACx(x = 0,1) + \retval none +*/ +void dac_software_trigger_enable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_SWT |= DAC_SWT_SWTR0; + }else{ + DAC_SWT |= DAC_SWT_SWTR1; + } +} + +/*! + \brief disable DAC software trigger + \param[in] dac_periph: DACx(x = 0,1) + \param[out] none + \retval none +*/ +void dac_software_trigger_disable(uint32_t dac_periph) +{ + if(DAC0 == dac_periph){ + DAC_SWT &= ~DAC_SWT_SWTR0; + }else{ + DAC_SWT &= ~DAC_SWT_SWTR1; + } +} + +/*! + \brief configure DAC wave mode + \param[in] dac_periph: DACx(x = 0,1) + \param[in] wave_mode: noise wave mode + only one parameter can be selected which is shown as below: + \arg DAC_WAVE_DISABLE: wave disable + \arg DAC_WAVE_MODE_LFSR: LFSR noise mode + \arg DAC_WAVE_MODE_TRIANGLE: triangle noise mode + \param[out] none + \retval none +*/ +void dac_wave_mode_config(uint32_t dac_periph, uint32_t wave_mode) +{ + if(DAC0 == dac_periph){ + /* configure DAC0 wave mode */ + DAC_CTL &= ~DAC_CTL_DWM0; + DAC_CTL |= wave_mode; + }else{ + /* configure DAC1 wave mode */ + DAC_CTL &= ~DAC_CTL_DWM1; + DAC_CTL |= (wave_mode << DAC1_REG_OFFSET); + } +} + +/*! + \brief configure DAC wave bit width + \param[in] dac_periph: DACx(x = 0,1) + \param[in] bit_width: noise wave bit width + only one parameter can be selected which is shown as below: + \arg DAC_WAVE_BIT_WIDTH_1: bit width of the wave signal is 1 + \arg DAC_WAVE_BIT_WIDTH_2: bit width of the wave signal is 2 + \arg DAC_WAVE_BIT_WIDTH_3: bit width of the wave signal is 3 + \arg DAC_WAVE_BIT_WIDTH_4: bit width of the wave signal is 4 + \arg DAC_WAVE_BIT_WIDTH_5: bit width of the wave signal is 5 + \arg DAC_WAVE_BIT_WIDTH_6: bit width of the wave signal is 6 + \arg DAC_WAVE_BIT_WIDTH_7: bit width of the wave signal is 7 + \arg DAC_WAVE_BIT_WIDTH_8: bit width of the wave signal is 8 + \arg DAC_WAVE_BIT_WIDTH_9: bit width of the wave signal is 9 + \arg DAC_WAVE_BIT_WIDTH_10: bit width of the wave signal is 10 + \arg DAC_WAVE_BIT_WIDTH_11: bit width of the wave signal is 11 + \arg DAC_WAVE_BIT_WIDTH_12: bit width of the wave signal is 12 + \param[out] none + \retval none +*/ +void dac_wave_bit_width_config(uint32_t dac_periph, uint32_t bit_width) +{ + if(DAC0 == dac_periph){ + /* configure DAC0 wave bit width */ + DAC_CTL &= ~DAC_CTL_DWBW0; + DAC_CTL |= bit_width; + }else{ + /* configure DAC1 wave bit width */ + DAC_CTL &= ~DAC_CTL_DWBW1; + DAC_CTL |= (bit_width << DAC1_REG_OFFSET); + } +} + +/*! + \brief configure DAC LFSR noise mode + \param[in] dac_periph: DACx(x = 0,1) + \param[in] unmask_bits: unmask LFSR bits in DAC LFSR noise mode + only one parameter can be selected which is shown as below: + \arg DAC_LFSR_BIT0: unmask the LFSR bit0 + \arg DAC_LFSR_BITS1_0: unmask the LFSR bits[1:0] + \arg DAC_LFSR_BITS2_0: unmask the LFSR bits[2:0] + \arg DAC_LFSR_BITS3_0: unmask the LFSR bits[3:0] + \arg DAC_LFSR_BITS4_0: unmask the LFSR bits[4:0] + \arg DAC_LFSR_BITS5_0: unmask the LFSR bits[5:0] + \arg DAC_LFSR_BITS6_0: unmask the LFSR bits[6:0] + \arg DAC_LFSR_BITS7_0: unmask the LFSR bits[7:0] + \arg DAC_LFSR_BITS8_0: unmask the LFSR bits[8:0] + \arg DAC_LFSR_BITS9_0: unmask the LFSR bits[9:0] + \arg DAC_LFSR_BITS10_0: unmask the LFSR bits[10:0] + \arg DAC_LFSR_BITS11_0: unmask the LFSR bits[11:0] + \param[out] none + \retval none +*/ +void dac_lfsr_noise_config(uint32_t dac_periph, uint32_t unmask_bits) +{ + if(DAC0 == dac_periph){ + /* configure DAC0 LFSR noise mode */ + DAC_CTL &= ~DAC_CTL_DWBW0; + DAC_CTL |= unmask_bits; + }else{ + /* configure DAC1 LFSR noise mode */ + DAC_CTL &= ~DAC_CTL_DWBW1; + DAC_CTL |= (unmask_bits << DAC1_REG_OFFSET); + } +} + +/*! + \brief configure DAC triangle noise mode + \param[in] dac_periph: DACx(x = 0,1) + \param[in] amplitude: triangle amplitude in DAC triangle noise mode + only one parameter can be selected which is shown as below: + \arg DAC_TRIANGLE_AMPLITUDE_1: triangle amplitude is 1 + \arg DAC_TRIANGLE_AMPLITUDE_3: triangle amplitude is 3 + \arg DAC_TRIANGLE_AMPLITUDE_7: triangle amplitude is 7 + \arg DAC_TRIANGLE_AMPLITUDE_15: triangle amplitude is 15 + \arg DAC_TRIANGLE_AMPLITUDE_31: triangle amplitude is 31 + \arg DAC_TRIANGLE_AMPLITUDE_63: triangle amplitude is 63 + \arg DAC_TRIANGLE_AMPLITUDE_127: triangle amplitude is 127 + \arg DAC_TRIANGLE_AMPLITUDE_255: triangle amplitude is 255 + \arg DAC_TRIANGLE_AMPLITUDE_511: triangle amplitude is 511 + \arg DAC_TRIANGLE_AMPLITUDE_1023: triangle amplitude is 1023 + \arg DAC_TRIANGLE_AMPLITUDE_2047: triangle amplitude is 2047 + \arg DAC_TRIANGLE_AMPLITUDE_4095: triangle amplitude is 4095 + \param[out] none + \retval none +*/ +void dac_triangle_noise_config(uint32_t dac_periph, uint32_t amplitude) +{ + if(DAC0 == dac_periph){ + /* configure DAC0 triangle noise mode */ + DAC_CTL &= ~DAC_CTL_DWBW0; + DAC_CTL |= amplitude; + }else{ + /* configure DAC1 triangle noise mode */ + DAC_CTL &= ~DAC_CTL_DWBW1; + DAC_CTL |= (amplitude << DAC1_REG_OFFSET); + } +} + +/*! + \brief enable DAC concurrent mode + \param[in] none + \param[out] none + \retval none +*/ +void dac_concurrent_enable(void) +{ + uint32_t ctl = 0U; + ctl = DAC_CTL_DEN0 | DAC_CTL_DEN1; + DAC_CTL |= (ctl); +} + +/*! + \brief disable DAC concurrent mode + \param[in] none + \param[out] none + \retval none +*/ +void dac_concurrent_disable(void) +{ + uint32_t ctl = 0U; + ctl = DAC_CTL_DEN0 | DAC_CTL_DEN1; + DAC_CTL &= (~ctl); +} + +/*! + \brief enable DAC concurrent software trigger function + \param[in] none + \param[out] none + \retval none +*/ +void dac_concurrent_software_trigger_enable(void) +{ + uint32_t swt = 0U; + swt = DAC_SWT_SWTR0 | DAC_SWT_SWTR1; + DAC_SWT |= (swt); +} + +/*! + \brief disable DAC concurrent software trigger function + \param[in] none + \param[out] none + \retval none +*/ +void dac_concurrent_software_trigger_disable(void) +{ + uint32_t swt = 0U; + swt = DAC_SWT_SWTR0 | DAC_SWT_SWTR1; + DAC_SWT &= (~swt); +} + +/*! + \brief enable DAC concurrent buffer function + \param[in] none + \param[out] none + \retval none +*/ +void dac_concurrent_output_buffer_enable(void) +{ + uint32_t ctl = 0U; + ctl = DAC_CTL_DBOFF0 | DAC_CTL_DBOFF1; + DAC_CTL &= (~ctl); +} + +/*! + \brief disable DAC concurrent buffer function + \param[in] none + \param[out] none + \retval none +*/ +void dac_concurrent_output_buffer_disable(void) +{ + uint32_t ctl = 0U; + ctl = DAC_CTL_DBOFF0 | DAC_CTL_DBOFF1; + DAC_CTL |= (ctl); +} + +/*! + \brief set DAC concurrent mode data holding register value + \param[in] dac_align: data alignment + only one parameter can be selected which is shown as below: + \arg DAC_ALIGN_8B_R: data right 8b alignment + \arg DAC_ALIGN_12B_R: data right 12b alignment + \arg DAC_ALIGN_12B_L: data left 12b alignment + \param[in] data0: data to be loaded + \param[in] data1: data to be loaded + \param[out] none + \retval none +*/ +void dac_concurrent_data_set(uint32_t dac_align, uint16_t data0, uint16_t data1) +{ + uint32_t data = 0U; + switch(dac_align){ + /* data right 12b alignment */ + case DAC_ALIGN_12B_R: + data = ((uint32_t)data1 << DH_12BIT_OFFSET) | data0; + DACC_R12DH = data; + break; + /* data left 12b alignment */ + case DAC_ALIGN_12B_L: + data = ((uint32_t)data1 << DH_12BIT_OFFSET) | data0; + DACC_L12DH = data; + break; + /* data right 8b alignment */ + case DAC_ALIGN_8B_R: + data = ((uint32_t)data1 << DH_8BIT_OFFSET) | data0; + DACC_R8DH = data; + break; + default: + break; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c new file mode 100644 index 0000000..7b10a52 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c @@ -0,0 +1,110 @@ +/*! + \file gd32vf103_dbg.c + \brief DBG driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_dbg.h" + +/*! + \brief read DBG_ID code register + \param[in] none + \param[out] none + \retval DBG_ID code +*/ +uint32_t dbg_id_get(void) +{ + return DBG_ID; +} + +/*! + \brief enable low power behavior when the mcu is in debug mode + \param[in] dbg_low_power: + one or more parameters can be selected which are shown as below: + \arg DBG_LOW_POWER_SLEEP: keep debugger connection during sleep mode + \arg DBG_LOW_POWER_DEEPSLEEP: keep debugger connection during deepsleep mode + \arg DBG_LOW_POWER_STANDBY: keep debugger connection during standby mode + \param[out] none + \retval none +*/ +void dbg_low_power_enable(uint32_t dbg_low_power) +{ + DBG_CTL |= dbg_low_power; +} + +/*! + \brief disable low power behavior when the mcu is in debug mode + \param[in] dbg_low_power: + one or more parameters can be selected which are shown as below: + \arg DBG_LOW_POWER_SLEEP: donot keep debugger connection during sleep mode + \arg DBG_LOW_POWER_DEEPSLEEP: donot keep debugger connection during deepsleep mode + \arg DBG_LOW_POWER_STANDBY: donot keep debugger connection during standby mode + \param[out] none + \retval none +*/ +void dbg_low_power_disable(uint32_t dbg_low_power) +{ + DBG_CTL &= ~dbg_low_power; +} + +/*! + \brief enable peripheral behavior when the mcu is in debug mode + \param[in] dbg_periph: refer to dbg_periph_enum + one or more parameters can be selected which are shown as below: + \arg DBG_FWDGT_HOLD : debug FWDGT kept when core is halted + \arg DBG_WWDGT_HOLD : debug WWDGT kept when core is halted + \arg DBG_CANx_HOLD (x=0,1): hold CANx counter when core is halted + \arg DBG_I2Cx_HOLD (x=0,1): hold I2Cx smbus when core is halted + \arg DBG_TIMERx_HOLD (x=0,1,2,3,4,5,6): hold TIMERx counter when core is halted + \param[out] none + \retval none +*/ +void dbg_periph_enable(dbg_periph_enum dbg_periph) +{ + DBG_CTL |= (uint32_t)dbg_periph; +} + +/*! + \brief disable peripheral behavior when the mcu is in debug mode + \param[in] dbg_periph: refer to dbg_periph_enum + one or more parameters can be selected which are shown as below: + \arg DBG_FWDGT_HOLD : debug FWDGT kept when core is halted + \arg DBG_WWDGT_HOLD : debug WWDGT kept when core is halted + \arg DBG_CANx_HOLD (x=0,1): hold CAN0 counter when core is halted + \arg DBG_I2Cx_HOLD (x=0,1): hold I2Cx smbus when core is halted + \arg DBG_TIMERx_HOLD (x=0,1,2,3,4,5,6): hold TIMERx counter when core is halted + \param[out] none + \retval none +*/ +void dbg_periph_disable(dbg_periph_enum dbg_periph) +{ + DBG_CTL &= ~(uint32_t)dbg_periph; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c new file mode 100644 index 0000000..9cfa28e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c @@ -0,0 +1,731 @@ +/*! + \file gd32vf103_dma.c + \brief DMA driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_dma.h" + +#define DMA_WRONG_HANDLE while(1){} + +/* check whether peripheral matches channels or not */ +static ErrStatus dma_periph_and_channel_check(uint32_t dma_periph, dma_channel_enum channelx); + +/*! + \brief deinitialize DMA a channel registers + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel is deinitialized + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_deinit(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + /* disable DMA a channel */ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CHEN; + /* reset DMA channel registers */ + DMA_CHCTL(dma_periph, channelx) = DMA_CHCTL_RESET_VALUE; + DMA_CHCNT(dma_periph, channelx) = DMA_CHCNT_RESET_VALUE; + DMA_CHPADDR(dma_periph, channelx) = DMA_CHPADDR_RESET_VALUE; + DMA_CHMADDR(dma_periph, channelx) = DMA_CHMADDR_RESET_VALUE; + DMA_INTC(dma_periph) |= DMA_FLAG_ADD(DMA_CHINTF_RESET_VALUE, channelx); +} + +/*! + \brief initialize the parameters of DMA struct with the default values + \param[in] init_struct: the initialization data needed to initialize DMA channel + \param[out] none + \retval none +*/ +void dma_struct_para_init(dma_parameter_struct* init_struct) +{ + /* set the DMA struct with the default values */ + init_struct->periph_addr = 0U; + init_struct->periph_width = 0U; + init_struct->periph_inc = DMA_PERIPH_INCREASE_DISABLE; + init_struct->memory_addr = 0U; + init_struct->memory_width = 0U; + init_struct->memory_inc = DMA_MEMORY_INCREASE_DISABLE; + init_struct->number = 0U; + init_struct->direction = DMA_PERIPHERAL_TO_MEMORY; + init_struct->priority = DMA_PRIORITY_LOW; +} + +/*! + \brief initialize DMA channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel is initialized + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] init_struct: the data needed to initialize DMA channel + periph_addr: peripheral base address + periph_width: DMA_PERIPHERAL_WIDTH_8BIT, DMA_PERIPHERAL_WIDTH_16BIT, DMA_PERIPHERAL_WIDTH_32BIT + periph_inc: DMA_PERIPH_INCREASE_ENABLE, DMA_PERIPH_INCREASE_DISABLE + memory_addr: memory base address + memory_width: DMA_MEMORY_WIDTH_8BIT, DMA_MEMORY_WIDTH_16BIT, DMA_MEMORY_WIDTH_32BIT + memory_inc: DMA_MEMORY_INCREASE_ENABLE, DMA_MEMORY_INCREASE_DISABLE + direction: DMA_PERIPHERAL_TO_MEMORY, DMA_MEMORY_TO_PERIPHERAL + number: the number of remaining data to be transferred by the DMA + priority: DMA_PRIORITY_LOW, DMA_PRIORITY_MEDIUM, DMA_PRIORITY_HIGH, DMA_PRIORITY_ULTRA_HIGH + \param[out] none + \retval none +*/ +void dma_init(uint32_t dma_periph, dma_channel_enum channelx, dma_parameter_struct* init_struct) +{ + uint32_t ctl; + + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + /* configure peripheral base address */ + DMA_CHPADDR(dma_periph, channelx) = init_struct->periph_addr; + + /* configure memory base address */ + DMA_CHMADDR(dma_periph, channelx) = init_struct->memory_addr; + + /* configure the number of remaining data to be transferred */ + DMA_CHCNT(dma_periph, channelx) = (init_struct->number & DMA_CHANNEL_CNT_MASK); + + /* configure peripheral transfer width,memory transfer width and priority */ + ctl = DMA_CHCTL(dma_periph, channelx); + ctl &= ~(DMA_CHXCTL_PWIDTH | DMA_CHXCTL_MWIDTH | DMA_CHXCTL_PRIO); + ctl |= (init_struct->periph_width | init_struct->memory_width | init_struct->priority); + DMA_CHCTL(dma_periph, channelx) = ctl; + + /* configure peripheral increasing mode */ + if(DMA_PERIPH_INCREASE_ENABLE == init_struct->periph_inc){ + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PNAGA; + }else{ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_PNAGA; + } + + /* configure memory increasing mode */ + if(DMA_MEMORY_INCREASE_ENABLE == init_struct->memory_inc){ + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_MNAGA; + }else{ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_MNAGA; + } + + /* configure the direction of data transfer */ + if(DMA_PERIPHERAL_TO_MEMORY == init_struct->direction){ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_DIR; + }else{ + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_DIR; + } +} + +/*! + \brief enable DMA circulation mode + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_circulation_enable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_CMEN; +} + +/*! + \brief disable DMA circulation mode + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_circulation_disable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CMEN; +} + +/*! + \brief enable memory to memory mode + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_memory_to_memory_enable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_M2M; +} + +/*! + \brief disable memory to memory mode + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_memory_to_memory_disable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_M2M; +} + +/*! + \brief enable DMA channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_channel_enable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_CHEN; +} + +/*! + \brief disable DMA channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_channel_disable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_CHEN; +} + +/*! + \brief set DMA peripheral base address + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to set peripheral base address + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] address: peripheral base address + \param[out] none + \retval none +*/ +void dma_periph_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHPADDR(dma_periph, channelx) = address; +} + +/*! + \brief set DMA memory base address + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to set memory base address + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] address: memory base address + \param[out] none + \retval none +*/ +void dma_memory_address_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t address) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHMADDR(dma_periph, channelx) = address; +} + +/*! + \brief set the number of remaining data to be transferred by the DMA + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to set number + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] number: the number of remaining data to be transferred by the DMA + \param[out] none + \retval none +*/ +void dma_transfer_number_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t number) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCNT(dma_periph, channelx) = (number & DMA_CHANNEL_CNT_MASK); +} + +/*! + \brief get the number of remaining data to be transferred by the DMA + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to set number + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval uint32_t: the number of remaining data to be transferred by the DMA +*/ +uint32_t dma_transfer_number_get(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + return (uint32_t)DMA_CHCNT(dma_periph, channelx); +} + +/*! + \brief configure priority level of DMA channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] priority: priority Level of this channel + only one parameter can be selected which is shown as below: + \arg DMA_PRIORITY_LOW: low priority + \arg DMA_PRIORITY_MEDIUM: medium priority + \arg DMA_PRIORITY_HIGH: high priority + \arg DMA_PRIORITY_ULTRA_HIGH: ultra high priority + \param[out] none + \retval none +*/ +void dma_priority_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t priority) +{ + uint32_t ctl; + + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_PRIO; + ctl |= priority; + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief configure transfer data size of memory + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] mwidth: transfer data width of memory + only one parameter can be selected which is shown as below: + \arg DMA_MEMORY_WIDTH_8BIT: transfer data width of memory is 8-bit + \arg DMA_MEMORY_WIDTH_16BIT: transfer data width of memory is 16-bit + \arg DMA_MEMORY_WIDTH_32BIT: transfer data width of memory is 32-bit + \param[out] none + \retval none +*/ +void dma_memory_width_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t mwidth) +{ + uint32_t ctl; + + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_MWIDTH; + ctl |= mwidth; + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief configure transfer data size of peripheral + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] pwidth: transfer data width of peripheral + only one parameter can be selected which is shown as below: + \arg DMA_PERIPHERAL_WIDTH_8BIT: transfer data width of peripheral is 8-bit + \arg DMA_PERIPHERAL_WIDTH_16BIT: transfer data width of peripheral is 16-bit + \arg DMA_PERIPHERAL_WIDTH_32BIT: transfer data width of peripheral is 32-bit + \param[out] none + \retval none +*/ +void dma_periph_width_config (uint32_t dma_periph, dma_channel_enum channelx, uint32_t pwidth) +{ + uint32_t ctl; + + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + /* acquire DMA_CHxCTL register */ + ctl = DMA_CHCTL(dma_periph, channelx); + /* assign regiser */ + ctl &= ~DMA_CHXCTL_PWIDTH; + ctl |= pwidth; + DMA_CHCTL(dma_periph, channelx) = ctl; +} + +/*! + \brief enable next address increasement algorithm of memory + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_memory_increase_enable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_MNAGA; +} + +/*! + \brief disable next address increasement algorithm of memory + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_memory_increase_disable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_MNAGA; +} + +/*! + \brief enable next address increasement algorithm of peripheral + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_periph_increase_enable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_PNAGA; +} + +/*! + \brief disable next address increasement algorithm of peripheral + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[out] none + \retval none +*/ +void dma_periph_increase_disable(uint32_t dma_periph, dma_channel_enum channelx) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_PNAGA; +} + +/*! + \brief configure the direction of data transfer on the channel + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] direction: specify the direction of data transfer + only one parameter can be selected which is shown as below: + \arg DMA_PERIPHERAL_TO_MEMORY: read from peripheral and write to memory + \arg DMA_MEMORY_TO_PERIPHERAL: read from memory and write to peripheral + \param[out] none + \retval none +*/ +void dma_transfer_direction_config(uint32_t dma_periph, dma_channel_enum channelx, uint32_t direction) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + if(DMA_PERIPHERAL_TO_MEMORY == direction){ + DMA_CHCTL(dma_periph, channelx) &= ~DMA_CHXCTL_DIR; + } else { + DMA_CHCTL(dma_periph, channelx) |= DMA_CHXCTL_DIR; + } +} + +/*! + \brief check DMA flag is set or not + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to get flag + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] flag: specify get which flag + only one parameter can be selected which is shown as below: + \arg DMA_FLAG_G: global interrupt flag of channel + \arg DMA_FLAG_FTF: full transfer finish flag of channel + \arg DMA_FLAG_HTF: half transfer finish flag of channel + \arg DMA_FLAG_ERR: error flag of channel + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus dma_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) +{ + FlagStatus reval; + + if(RESET != (DMA_INTF(dma_periph) & DMA_FLAG_ADD(flag, channelx))){ + reval = SET; + }else{ + reval = RESET; + } + + return reval; +} + +/*! + \brief clear DMA a channel flag + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to clear flag + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] flag: specify get which flag + only one parameter can be selected which is shown as below: + \arg DMA_FLAG_G: global interrupt flag of channel + \arg DMA_FLAG_FTF: full transfer finish flag of channel + \arg DMA_FLAG_HTF: half transfer finish flag of channel + \arg DMA_FLAG_ERR: error flag of channel + \param[out] none + \retval none +*/ +void dma_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) +{ + DMA_INTC(dma_periph) |= DMA_FLAG_ADD(flag, channelx); +} + +/*! + \brief check DMA flag and interrupt enable bit is set or not + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to get flag + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] flag: specify get which flag + only one parameter can be selected which is shown as below: + \arg DMA_INT_FLAG_FTF: full transfer finish interrupt flag of channel + \arg DMA_INT_FLAG_HTF: half transfer finish interrupt flag of channel + \arg DMA_INT_FLAG_ERR: error interrupt flag of channel + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus dma_interrupt_flag_get(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) +{ + uint32_t interrupt_enable = 0U, interrupt_flag = 0U; + + switch(flag){ + case DMA_INT_FLAG_FTF: + /* check whether the full transfer finish interrupt flag is set and enabled */ + interrupt_flag = DMA_INTF(dma_periph) & DMA_FLAG_ADD(flag, channelx); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_FTFIE; + break; + case DMA_INT_FLAG_HTF: + /* check whether the half transfer finish interrupt flag is set and enabled */ + interrupt_flag = DMA_INTF(dma_periph) & DMA_FLAG_ADD(flag, channelx); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_HTFIE; + break; + case DMA_INT_FLAG_ERR: + /* check whether the error interrupt flag is set and enabled */ + interrupt_flag = DMA_INTF(dma_periph) & DMA_FLAG_ADD(flag, channelx); + interrupt_enable = DMA_CHCTL(dma_periph, channelx) & DMA_CHXCTL_ERRIE; + break; + default: + DMA_WRONG_HANDLE + } + + /* when the interrupt flag is set and enabled, return SET */ + if(interrupt_flag && interrupt_enable){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear DMA a channel flag + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel to clear flag + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] flag: specify get which flag + only one parameter can be selected which is shown as below: + \arg DMA_INT_FLAG_G: global interrupt flag of channel + \arg DMA_INT_FLAG_FTF: full transfer finish interrupt flag of channel + \arg DMA_INT_FLAG_HTF: half transfer finish interrupt flag of channel + \arg DMA_INT_FLAG_ERR: error interrupt flag of channel + \param[out] none + \retval none +*/ +void dma_interrupt_flag_clear(uint32_t dma_periph, dma_channel_enum channelx, uint32_t flag) +{ + DMA_INTC(dma_periph) |= DMA_FLAG_ADD(flag, channelx); +} + +/*! + \brief enable DMA interrupt + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] source: specify which interrupt to enbale + one or more parameters can be selected which are shown as below + \arg DMA_INT_FTF: channel full transfer finish interrupt + \arg DMA_INT_HTF: channel half transfer finish interrupt + \arg DMA_INT_ERR: channel error interrupt + \param[out] none + \retval none +*/ +void dma_interrupt_enable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) |= source; +} + +/*! + \brief disable DMA interrupt + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA0: DMA_CHx(x=0..6), DMA1: DMA_CHx(x=0..4) + \param[in] source: specify which interrupt to disbale + one or more parameters can be selected which are shown as below + \arg DMA_INT_FTF: channel full transfer finish interrupt + \arg DMA_INT_HTF: channel half transfer finish interrupt + \arg DMA_INT_ERR: channel error interrupt + \param[out] none + \retval none +*/ +void dma_interrupt_disable(uint32_t dma_periph, dma_channel_enum channelx, uint32_t source) +{ + if(ERROR == dma_periph_and_channel_check(dma_periph, channelx)){ + DMA_WRONG_HANDLE + } + + DMA_CHCTL(dma_periph, channelx) &= ~source; +} + +/*! + \brief check whether peripheral and channels match + \param[in] dma_periph: DMAx(x=0,1) + \arg DMAx(x=0,1) + \param[in] channelx: specify which DMA channel + only one parameter can be selected which is shown as below: + \arg DMA_CHx(x=0..6) + \param[out] none + \retval none +*/ +static ErrStatus dma_periph_and_channel_check(uint32_t dma_periph, dma_channel_enum channelx) +{ + ErrStatus val = SUCCESS; + + if(DMA1 == dma_periph){ + /* for DMA1, the channel is from DMA_CH0 to DMA_CH4 */ + if(channelx > DMA_CH4){ + val = ERROR; + } + } + + return val; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c new file mode 100644 index 0000000..ad11724 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c @@ -0,0 +1,128 @@ +/*! + \file gd32vf103_eclic.c + \brief ECLIC(Enhancement Core-Local Interrupt Controller) driver + + \version 2019-06-05, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_eclic.h" +#include "riscv_encoding.h" + +#define REG_DBGMCU2 ((uint32_t)0xE0042008) +#define REG_DBGMCU2EN ((uint32_t)0xE004200C) + +/*! + \brief enable the global interrupt + \param[in] none + \param[out] none + \retval none +*/ +void eclic_global_interrupt_enable(void) +{ + /* set machine interrupt enable bit */ + set_csr(mstatus, MSTATUS_MIE); +} + +/*! + \brief disable the global interrupt + \param[in] none + \param[out] none + \retval none +*/ +void eclic_global_interrupt_disable(void) +{ + /* clear machine interrupt enable bit */ + clear_csr(mstatus, MSTATUS_MIE); +} + +/*! + \brief set the priority group + \param[in] prigroup: specify the priority group + \arg ECLIC_PRIGROUP_LEVEL0_PRIO4 + \arg ECLIC_PRIGROUP_LEVEL1_PRIO3 + \arg ECLIC_PRIGROUP_LEVEL2_PRIO2 + \arg ECLIC_PRIGROUP_LEVEL3_PRIO1 + \arg ECLIC_PRIGROUP_LEVEL4_PRIO0 + \param[out] none + \retval none +*/ +void eclic_priority_group_set(uint32_t prigroup) +{ + eclic_set_nlbits(prigroup); +} + +/*! + \brief enable the interrupt request + \param[in] source: interrupt request, detailed in IRQn_Type + \param[in] level: the level needed to set (maximum is 15, refer to the priority group) + \param[in] priority: the priority needed to set (maximum is 15, refer to the priority group) + \param[out] none + \retval none +*/ +void eclic_irq_enable(uint32_t source, uint8_t level, uint8_t priority) +{ + eclic_enable_interrupt(source); + eclic_set_irq_lvl_abs(source, level); + eclic_set_irq_priority(source, priority); +} + +/*! + \brief disable the interrupt request + \param[in] source: interrupt request, detailed in IRQn_Type + \param[out] none + \retval none +*/ +void eclic_irq_disable(uint32_t source) +{ + eclic_disable_interrupt(source); +} + +/*! + \brief reset system + \param[in] none + \param[out] none + \retval none +*/ +void eclic_system_reset(void) +{ + REG32(REG_DBGMCU2EN) = 0x4b5a6978; + REG32(REG_DBGMCU2) = 0x1; +} + +/*! + \brief send event(SEV) + \param[in] none + \param[out] none + \retval none +*/ +void eclic_send_event(void) +{ + set_csr(0x812, 0x1); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c new file mode 100644 index 0000000..c578087 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c @@ -0,0 +1,164 @@ +/*! + \file gd32vf103_exmc.c + \brief EXMC driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_exmc.h" + +/* EXMC bank0 register reset value */ +#define BANK0_SNCTL0_REGION_RESET ((uint32_t)0x000030DAU) +#define BANK0_SNTCFG_RESET ((uint32_t)0x0FFFFFFFU) + +/* EXMC register bit offset */ +#define SNCTL_NRMUX_OFFSET ((uint32_t)1U) +#define SNCTL_WREN_OFFSET ((uint32_t)12U) +#define SNCTL_NRWTEN_OFFSET ((uint32_t)13U) +#define SNCTL_ASYNCWAIT_OFFSET ((uint32_t)15U) + +#define SNTCFG_AHLD_OFFSET ((uint32_t)4U) +#define SNTCFG_DSET_OFFSET ((uint32_t)8U) +#define SNTCFG_BUSLAT_OFFSET ((uint32_t)16U) + +/*! + \brief deinitialize EXMC NOR/SRAM region + \param[in] norsram_region: select the region of bank0 + \arg EXMC_BANK0_NORSRAM_REGIONx(x=0) + \param[out] none + \retval none +*/ +void exmc_norsram_deinit(uint32_t norsram_region) +{ + /* reset the registers */ + if(EXMC_BANK0_NORSRAM_REGION0 == norsram_region){ + EXMC_SNCTL(norsram_region) = BANK0_SNCTL0_REGION_RESET; + } + + EXMC_SNTCFG(norsram_region) = BANK0_SNTCFG_RESET; +} + +/*! + \brief initialize the structure exmc_norsram_parameter_struct + \param[in] none + \param[out] exmc_norsram_init_struct: the initialized structure exmc_norsram_parameter_struct pointer + \retval none +*/ +void exmc_norsram_struct_para_init(exmc_norsram_parameter_struct* exmc_norsram_init_struct) +{ + /* configure the structure with default value */ + exmc_norsram_init_struct->norsram_region = EXMC_BANK0_NORSRAM_REGION0; + exmc_norsram_init_struct->address_data_mux = ENABLE; + exmc_norsram_init_struct->memory_type = EXMC_MEMORY_TYPE_SRAM; + exmc_norsram_init_struct->databus_width = EXMC_NOR_DATABUS_WIDTH_16B; + exmc_norsram_init_struct->nwait_polarity = EXMC_NWAIT_POLARITY_LOW; + exmc_norsram_init_struct->memory_write = ENABLE; + exmc_norsram_init_struct->nwait_signal = ENABLE; + exmc_norsram_init_struct->asyn_wait = DISABLE; + + /* read/write timing configure */ + exmc_norsram_init_struct->read_write_timing->asyn_address_setuptime = 0xFU; + exmc_norsram_init_struct->read_write_timing->asyn_address_holdtime = 0xFU; + exmc_norsram_init_struct->read_write_timing->asyn_data_setuptime = 0xFFU; + exmc_norsram_init_struct->read_write_timing->bus_latency = 0xFU; +} + +/*! + \brief initialize EXMC NOR/SRAM region + \param[in] exmc_norsram_parameter_struct: configure the EXMC NOR/SRAM parameter + norsram_region: EXMC_BANK0_NORSRAM_REGIONx,x=0 + asyn_wait: ENABLE or DISABLE + nwait_signal: ENABLE or DISABLE + memory_write: ENABLE or DISABLE + nwait_polarity: EXMC_NWAIT_POLARITY_LOW,EXMC_NWAIT_POLARITY_HIGH + databus_width: EXMC_NOR_DATABUS_WIDTH_8B,EXMC_NOR_DATABUS_WIDTH_16B + memory_type: EXMC_MEMORY_TYPE_SRAM,EXMC_MEMORY_TYPE_PSRAM,EXMC_MEMORY_TYPE_NOR + address_data_mux: ENABLE + read_write_timing: structure exmc_norsram_timing_parameter_struct set the time + \param[out] none + \retval none +*/ +void exmc_norsram_init(exmc_norsram_parameter_struct* exmc_norsram_init_struct) +{ + uint32_t snctl = 0x00000000U, sntcfg = 0x00000000U; + + /* get the register value */ + snctl = EXMC_SNCTL(exmc_norsram_init_struct->norsram_region); + + /* clear relative bits */ + snctl &= ((uint32_t)~(EXMC_SNCTL_NREN | EXMC_SNCTL_NRTP | EXMC_SNCTL_NRW | EXMC_SNCTL_NRWTPOL | + EXMC_SNCTL_WREN | EXMC_SNCTL_NRWTEN | EXMC_SNCTL_ASYNCWAIT | EXMC_SNCTL_NRMUX)); + + snctl |= (uint32_t)(exmc_norsram_init_struct->address_data_mux << SNCTL_NRMUX_OFFSET) | + exmc_norsram_init_struct->memory_type | + exmc_norsram_init_struct->databus_width | + exmc_norsram_init_struct->nwait_polarity | + (exmc_norsram_init_struct->memory_write << SNCTL_WREN_OFFSET) | + (exmc_norsram_init_struct->nwait_signal << SNCTL_NRWTEN_OFFSET) | + (exmc_norsram_init_struct->asyn_wait << SNCTL_ASYNCWAIT_OFFSET); + + sntcfg = (uint32_t)((exmc_norsram_init_struct->read_write_timing->asyn_address_setuptime - 1U ) & EXMC_SNTCFG_ASET )| + (((exmc_norsram_init_struct->read_write_timing->asyn_address_holdtime - 1U ) << SNTCFG_AHLD_OFFSET ) & EXMC_SNTCFG_AHLD ) | + (((exmc_norsram_init_struct->read_write_timing->asyn_data_setuptime - 1U ) << SNTCFG_DSET_OFFSET ) & EXMC_SNTCFG_DSET ) | + (((exmc_norsram_init_struct->read_write_timing->bus_latency - 1U ) << SNTCFG_BUSLAT_OFFSET ) & EXMC_SNTCFG_BUSLAT ); + + /* nor flash access enable */ + if(EXMC_MEMORY_TYPE_NOR == exmc_norsram_init_struct->memory_type){ + snctl |= (uint32_t)EXMC_SNCTL_NREN; + } + + /* configure the registers */ + EXMC_SNCTL(exmc_norsram_init_struct->norsram_region) = snctl; + EXMC_SNTCFG(exmc_norsram_init_struct->norsram_region) = sntcfg; +} + +/*! + \brief enable EXMC NOR/PSRAM bank region + \param[in] norsram_region: specify the region of NOR/PSRAM bank + \arg EXMC_BANK0_NORSRAM_REGIONx(x=0) + \param[out] none + \retval none +*/ +void exmc_norsram_enable(uint32_t norsram_region) +{ + EXMC_SNCTL(norsram_region) |= (uint32_t)EXMC_SNCTL_NRBKEN; +} + +/*! + \brief disable EXMC NOR/PSRAM bank region + \param[in] norsram_region: specify the region of NOR/PSRAM bank + \arg EXMC_BANK0_NORSRAM_REGIONx(x=0) + \param[out] none + \retval none +*/ +void exmc_norsram_disable(uint32_t norsram_region) +{ + EXMC_SNCTL(norsram_region) &= ~(uint32_t)EXMC_SNCTL_NRBKEN; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c new file mode 100644 index 0000000..7190b23 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c @@ -0,0 +1,254 @@ +/*! + \file gd32vf103_exti.c + \brief EXTI driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_exti.h" + +#define EXTI_REG_RESET_VALUE ((uint32_t)0x00000000U) + +/*! + \brief deinitialize the EXTI + \param[in] none + \param[out] none + \retval none + */ +void exti_deinit(void) +{ + /* reset the value of all the EXTI registers */ + EXTI_INTEN = EXTI_REG_RESET_VALUE; + EXTI_EVEN = EXTI_REG_RESET_VALUE; + EXTI_RTEN = EXTI_REG_RESET_VALUE; + EXTI_FTEN = EXTI_REG_RESET_VALUE; + EXTI_SWIEV = EXTI_REG_RESET_VALUE; +} + +/*! + \brief initialize the EXTI + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..18): EXTI line x + \param[in] mode: interrupt or event mode, refer to exti_mode_enum + only one parameter can be selected which is shown as below: + \arg EXTI_INTERRUPT: interrupt mode + \arg EXTI_EVENT: event mode + \param[in] trig_type: trigger type, refer to exti_trig_type_enum + only one parameter can be selected which is shown as below: + \arg EXTI_TRIG_RISING: rising edge trigger + \arg EXTI_TRIG_FALLING: falling edge trigger + \arg EXTI_TRIG_BOTH: rising edge and falling edge trigger + \arg EXTI_TRIG_NONE: without rising edge or falling edge trigger + \param[out] none + \retval none + */ +void exti_init(exti_line_enum linex, exti_mode_enum mode, exti_trig_type_enum trig_type) +{ + /* reset the EXTI line x */ + EXTI_INTEN &= ~(uint32_t) linex; + EXTI_EVEN &= ~(uint32_t) linex; + EXTI_RTEN &= ~(uint32_t) linex; + EXTI_FTEN &= ~(uint32_t) linex; + + /* set the EXTI mode and enable the interrupts or events from EXTI line x */ + switch (mode) { + case EXTI_INTERRUPT: + EXTI_INTEN |= (uint32_t) linex; + break; + case EXTI_EVENT: + EXTI_EVEN |= (uint32_t) linex; + break; + default: + break; + } + + /* set the EXTI trigger type */ + switch (trig_type) { + case EXTI_TRIG_RISING: + EXTI_RTEN |= (uint32_t) linex; + EXTI_FTEN &= ~(uint32_t) linex; + break; + case EXTI_TRIG_FALLING: + EXTI_RTEN &= ~(uint32_t) linex; + EXTI_FTEN |= (uint32_t) linex; + break; + case EXTI_TRIG_BOTH: + EXTI_RTEN |= (uint32_t) linex; + EXTI_FTEN |= (uint32_t) linex; + break; + case EXTI_TRIG_NONE: + default: + break; + } +} + +/*! + \brief enable the interrupts from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..18): EXTI line x + \param[out] none + \retval none +*/ +void exti_interrupt_enable(exti_line_enum linex) +{ + EXTI_INTEN |= (uint32_t) linex; +} + +/*! + \brief enable the events from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..18): EXTI line x + \param[out] none + \retval none +*/ +void exti_event_enable(exti_line_enum linex) +{ + EXTI_EVEN |= (uint32_t) linex; +} + +/*! + \brief disable the interrupt from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..18): EXTI line x + \param[out] none + \retval none +*/ +void exti_interrupt_disable(exti_line_enum linex) +{ + EXTI_INTEN &= ~(uint32_t) linex; +} + +/*! + \brief disable the events from EXTI line x + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..18): EXTI line x + \param[out] none + \retval none +*/ +void exti_event_disable(exti_line_enum linex) +{ + EXTI_EVEN &= ~(uint32_t) linex; +} + +/*! + \brief get EXTI lines flag + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..18): EXTI line x + \param[out] none + \retval FlagStatus: status of flag (RESET or SET) +*/ +FlagStatus exti_flag_get(exti_line_enum linex) +{ + if (RESET != (EXTI_PD & (uint32_t) linex)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear EXTI lines pending flag + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..18): EXTI line x + \param[out] none + \retval none +*/ +void exti_flag_clear(exti_line_enum linex) +{ + EXTI_PD = (uint32_t) linex; +} + +/*! + \brief get EXTI lines flag when the interrupt flag is set + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..18): EXTI line x + \param[out] none + \retval FlagStatus: status of flag (RESET or SET) +*/ +FlagStatus exti_interrupt_flag_get(exti_line_enum linex) +{ + uint32_t flag_left, flag_right; + + flag_left = EXTI_PD & (uint32_t) linex; + flag_right = EXTI_INTEN & (uint32_t) linex; + + if ((RESET != flag_left) && (RESET != flag_right)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear EXTI lines pending flag + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..18): EXTI line x + \param[out] none + \retval none +*/ +void exti_interrupt_flag_clear(exti_line_enum linex) +{ + EXTI_PD = (uint32_t) linex; +} + +/*! + \brief enable EXTI software interrupt event + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..18): EXTI line x + \param[out] none + \retval none +*/ +void exti_software_interrupt_enable(exti_line_enum linex) +{ + EXTI_SWIEV |= (uint32_t) linex; +} + +/*! + \brief disable EXTI software interrupt event + \param[in] linex: EXTI line number, refer to exti_line_enum + only one parameter can be selected which is shown as below: + \arg EXTI_x (x=0..18): EXTI line x + \param[out] none + \retval none +*/ +void exti_software_interrupt_disable(exti_line_enum linex) +{ + EXTI_SWIEV &= ~(uint32_t) linex; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c new file mode 100644 index 0000000..7d6a1a6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c @@ -0,0 +1,651 @@ +/*! + \file gd32vf103_fmc.c + \brief FMC driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + \version 2019-09-18, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_fmc.h" + +/*! + \brief set the FMC wait state counter + \param[in] wscnt£ºwait state counter value + \arg WS_WSCNT_0: FMC 0 wait state + \arg WS_WSCNT_1: FMC 1 wait state + \arg WS_WSCNT_2: FMC 2 wait state + \param[out] none + \retval none + */ +void fmc_wscnt_set(uint32_t wscnt) +{ + uint32_t reg; + + reg = FMC_WS; + /* set the wait state counter value */ + reg &= ~FMC_WS_WSCNT; + FMC_WS = (reg | wscnt); +} + +/*! + \brief unlock the main FMC operation + \param[in] none + \param[out] none + \retval none + */ +void fmc_unlock(void) +{ + if((RESET != (FMC_CTL & FMC_CTL_LK))){ + /* write the FMC unlock key */ + FMC_KEY = UNLOCK_KEY0; + FMC_KEY = UNLOCK_KEY1; + } +} + +/*! + \brief lock the main FMC operation + \param[in] none + \param[out] none + \retval none + */ +void fmc_lock(void) +{ + /* set the LK bit */ + FMC_CTL |= FMC_CTL_LK; +} + + +/*! + \brief FMC erase page + \param[in] page_address: the page address to be erased. + \param[out] none + \retval state of FMC, refer to fmc_state_enum + */ +fmc_state_enum fmc_page_erase(uint32_t page_address) +{ + fmc_state_enum fmc_state; + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + /* if the last operation is completed, start page erase */ + if (FMC_READY == fmc_state) { + FMC_CTL |= FMC_CTL_PER; + FMC_ADDR = page_address; + FMC_CTL |= FMC_CTL_START; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PER bit */ + FMC_CTL &= ~FMC_CTL_PER; + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief FMC erase whole chip + \param[in] none + \param[out] none + \retval state of FMC, refer to fmc_state_enum + */ +fmc_state_enum fmc_mass_erase(void) +{ + fmc_state_enum fmc_state; + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* start whole chip erase */ + FMC_CTL |= FMC_CTL_MER; + FMC_CTL |= FMC_CTL_START; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the MER bit */ + FMC_CTL &= ~FMC_CTL_MER; + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief FMC program a word at the corresponding address + \param[in] address: address to program + \param[in] data: word to program + \param[out] none + \retval state of FMC, refer to fmc_state_enum + */ +fmc_state_enum fmc_word_program(uint32_t address, uint32_t data) +{ + fmc_state_enum fmc_state = FMC_READY; + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* set the PG bit to start program */ + FMC_CTL |= FMC_CTL_PG; + REG32(address) = data; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PG bit */ + FMC_CTL &= ~FMC_CTL_PG; + } + /* return the FMC state */ + return fmc_state; +} +/* + \brief FMC program a half word at the corresponding address + \param[in] address: address to program + \param[in] data: halfword to program + \param[out] none + \retval state of FMC, refer to fmc_state_enum +*/ +fmc_state_enum fmc_halfword_program(uint32_t address, uint16_t data) +{ + fmc_state_enum fmc_state = FMC_READY; + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* set the PG bit to start program */ + FMC_CTL |= FMC_CTL_PG; + REG16(address) = data; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + /* reset the PG bit */ + FMC_CTL &= ~FMC_CTL_PG; + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief unlock the option byte operation + \param[in] none + \param[out] none + \retval none + */ +void ob_unlock(void) +{ + if(RESET == (FMC_CTL & FMC_CTL_OBWEN)){ + /* write the FMC key */ + FMC_OBKEY = UNLOCK_KEY0; + FMC_OBKEY = UNLOCK_KEY1; + } + + /* wait until OBWEN bit is set by hardware */ + while (RESET == (FMC_CTL & FMC_CTL_OBWEN)){ + } +} + +/*! + \brief lock the option byte operation + \param[in] none + \param[out] none + \retval none + */ +void ob_lock(void) +{ + /* reset the OBWEN bit */ + FMC_CTL &= ~FMC_CTL_OBWEN; +} + +/*! + \brief erase the FMC option byte + unlock the FMC_CTL and option byte before calling this function + \param[in] none + \param[out] none + \retval state of FMC, refer to fmc_state_enum + */ +fmc_state_enum ob_erase(void) +{ + uint16_t temp_spc = FMC_NSPC; + + fmc_state_enum fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + /* check the option byte security protection value */ + if(RESET != ob_spc_get()){ + temp_spc = FMC_USPC; + } + + if(FMC_READY == fmc_state){ + + /* start erase the option byte */ + FMC_CTL |= FMC_CTL_OBER; + FMC_CTL |= FMC_CTL_START; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* reset the OBER bit */ + FMC_CTL &= ~FMC_CTL_OBER; + /* set the OBPG bit */ + FMC_CTL |= FMC_CTL_OBPG; + /* no security protection */ + OB_SPC = (uint16_t) temp_spc; + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + if (FMC_TOERR != fmc_state) { + /* reset the OBPG bit */ + FMC_CTL &= ~FMC_CTL_OBPG; + } + }else{ + if(FMC_TOERR != fmc_state){ + /* reset the OBPG bit */ + FMC_CTL &= ~FMC_CTL_OBPG; + } + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief enable write protection + \param[in] ob_wp: specify sector to be write protected, set the bit to 1 if + you want to protect the corresponding pages. meanwhile, sector + macro could used to set specific sector write protected. + one or more parameters can be selected which are shown as below: + \arg OB_WP_x(x = 0..31): write protect specify sector + \arg OB_WP_ALL: write protect all sector + \param[out] none + \retval state of FMC, refer to fmc_state_enum + */ +fmc_state_enum ob_write_protection_enable(uint32_t ob_wp) +{ + uint16_t temp_wp0, temp_wp1, temp_wp2, temp_wp3; + + fmc_state_enum fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + ob_wp = (uint32_t) (~ob_wp); + temp_wp0 = (uint16_t) (ob_wp & OB_WP0_WP0); + temp_wp1 = (uint16_t) ((ob_wp & OB_WP1_WP1) >> 8U); + temp_wp2 = (uint16_t) ((ob_wp & OB_WP2_WP2) >> 16U); + temp_wp3 = (uint16_t) ((ob_wp & OB_WP3_WP3) >> 24U); + + if(FMC_READY == fmc_state){ + + /* set the OBPG bit*/ + FMC_CTL |= FMC_CTL_OBPG; + + if(0xFFU != temp_wp0){ + OB_WP0 = temp_wp0; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + } + if((FMC_READY == fmc_state) && (0xFFU != temp_wp1)){ + OB_WP1 = temp_wp1; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + } + if((FMC_READY == fmc_state) && (0xFFU != temp_wp2)){ + OB_WP2 = temp_wp2; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + } + if((FMC_READY == fmc_state) && (0xFFU != temp_wp3)){ + OB_WP3 = temp_wp3; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + } + if(FMC_TOERR != fmc_state){ + /* reset the OBPG bit */ + FMC_CTL &= ~FMC_CTL_OBPG; + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief configure security protection + \param[in] ob_spc: specify security protection + only one parameter can be selected which is shown as below: + \arg FMC_NSPC: no security protection + \arg FMC_USPC: under security protection + \param[out] none + \retval state of FMC, refer to fmc_state_enum + */ +fmc_state_enum ob_security_protection_config(uint8_t ob_spc) +{ + fmc_state_enum fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + FMC_CTL |= FMC_CTL_OBER; + FMC_CTL |= FMC_CTL_START; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* reset the OBER bit */ + FMC_CTL &= ~FMC_CTL_OBER; + + /* start the option byte program */ + FMC_CTL |= FMC_CTL_OBPG; + + OB_SPC = (uint16_t) ob_spc; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if (FMC_TOERR != fmc_state) { + /* reset the OBPG bit */ + FMC_CTL &= ~FMC_CTL_OBPG; + } + }else{ + if (FMC_TOERR != fmc_state) { + /* reset the OBER bit */ + FMC_CTL &= ~FMC_CTL_OBER; + } + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief program the FMC user option byte + \param[in] ob_fwdgt: option byte watchdog value + \arg OB_FWDGT_SW: software free watchdog + \arg OB_FWDGT_HW: hardware free watchdog + \param[in] ob_deepsleep: option byte deepsleep reset value + \arg OB_DEEPSLEEP_NRST: no reset when entering deepsleep mode + \arg OB_DEEPSLEEP_RST: generate a reset instead of entering deepsleep mode + \param[in] ob_stdby:option byte standby reset value + \arg OB_STDBY_NRST: no reset when entering standby mode + \arg OB_STDBY_RST: generate a reset instead of entering standby mode + \param[in] ob_boot: specifies the option byte boot bank value + \arg OB_BOOT_B0: boot from bank0 + \param[out] none + \retval state of FMC, refer to fmc_state_enum + */ +fmc_state_enum ob_user_write(uint8_t ob_fwdgt, uint8_t ob_deepsleep, uint8_t ob_stdby, uint8_t ob_boot) +{ + fmc_state_enum fmc_state = FMC_READY; + uint8_t temp; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* set the OBPG bit*/ + FMC_CTL |= FMC_CTL_OBPG; + + temp = ((uint8_t)((uint8_t)((uint8_t)(ob_boot | ob_fwdgt) | ob_deepsleep) | ob_stdby) | OB_USER_MASK); + OB_USER = (uint16_t) temp; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_TOERR != fmc_state){ + /* reset the OBPG bit */ + FMC_CTL &= ~FMC_CTL_OBPG; + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief program the FMC data option byte + \param[in] address: the option bytes address to be programmed + \param[in] data: the byte to be programmed + \param[out] none + \retval state of FMC, refer to fmc_state_enum + */ +fmc_state_enum ob_data_program(uint32_t address, uint8_t data) +{ + fmc_state_enum fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_READY == fmc_state){ + /* set the OBPG bit */ + FMC_CTL |= FMC_CTL_OBPG; + REG16(address) = data; + + /* wait for the FMC ready */ + fmc_state = fmc_ready_wait(FMC_TIMEOUT_COUNT); + + if(FMC_TOERR != fmc_state){ + /* reset the OBPG bit */ + FMC_CTL &= ~FMC_CTL_OBPG; + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief get OB_USER in register FMC_OBSTAT + \param[in] none + \param[out] none + \retval the FMC user option byte values + */ +uint8_t ob_user_get(void) +{ + /* return the FMC user option byte value */ + return (uint8_t) (FMC_OBSTAT >> 2U); +} + +/*! + \brief get OB_DATA in register FMC_OBSTAT + \param[in] none + \param[out] none + \retval ob_data + */ +uint16_t ob_data_get(void) +{ + return (uint16_t) (FMC_OBSTAT >> 10U); +} + +/*! + \brief get the FMC option byte write protection + \param[in] none + \param[out] none + \retval the FMC write protection option byte value + */ +uint32_t ob_write_protection_get(void) +{ + /* return the FMC write protection option byte value */ + return FMC_WP; +} + +/*! + \brief get FMC option byte security protection state + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET + */ +FlagStatus ob_spc_get(void) +{ + FlagStatus spc_state = RESET; + + if(RESET != (FMC_OBSTAT & FMC_OBSTAT_SPC)){ + spc_state = SET; + }else{ + spc_state = RESET; + } + return spc_state; +} + +/*! + \brief enable FMC interrupt + \param[in] interrupt: the FMC interrupt source + only one parameter can be selected which is shown as below: + \arg FMC_INT_END: enable FMC end of program interrupt + \arg FMC_INT_ERR: enable FMC error interrupt + \param[out] none + \retval none + */ +void fmc_interrupt_enable(uint32_t interrupt) +{ + FMC_REG_VAL(interrupt) |= BIT(FMC_BIT_POS(interrupt)); +} + +/*! + \brief disable FMC interrupt + \param[in] interrupt: the FMC interrupt source + only one parameter can be selected which is shown as below: + \arg FMC_INT_END: enable FMC end of program interrupt + \arg FMC_INT_ERR: enable FMC error interrupt + \param[out] none + \retval none + */ +void fmc_interrupt_disable(uint32_t interrupt) +{ + FMC_REG_VAL(interrupt) &= ~BIT(FMC_BIT_POS(interrupt)); +} + +/*! + \brief check flag is set or not + \param[in] flag: check FMC flag + only one parameter can be selected which is shown as below: + \arg FMC_FLAG_BUSY: FMC busy flag bit + \arg FMC_FLAG_PGERR: FMC operation error flag bit + \arg FMC_FLAG_WPERR: FMC erase/program protection error flag bit + \arg FMC_FLAG_END: FMC end of operation flag bit + \arg FMC_FLAG_OBERR: FMC option byte read error flag bit + \param[out] none + \retval FlagStatus: SET or RESET + */ +FlagStatus fmc_flag_get(uint32_t flag) +{ + if(RESET != (FMC_REG_VAL(flag) & BIT(FMC_BIT_POS(flag)))){ + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear the FMC flag + \param[in] flag: clear FMC flag + only one parameter can be selected which is shown as below: + \arg FMC_FLAG_PGERR: FMC operation error flag bit + \arg FMC_FLAG_WPERR: FMC erase/program protection error flag bit + \arg FMC_FLAG_END: FMC end of operation flag bit + \param[out] none + \retval none + */ +void fmc_flag_clear(uint32_t flag) +{ + FMC_REG_VAL(flag) = (!FMC_REG_VAL(flag)) | BIT(FMC_BIT_POS(flag)); +} + +/*! + \brief get FMC interrupt flag state + \param[in] flag: FMC interrupt flags, refer to fmc_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg FMC_INT_FLAG_PGERR: FMC operation error interrupt flag bit + \arg FMC_INT_FLAG_WPERR: FMC erase/program protection error interrupt flag bit + \arg FMC_INT_FLAG_END: FMC end of operation interrupt flag bit + \param[out] none + \retval FlagStatus: SET or RESET + */ +FlagStatus fmc_interrupt_flag_get(fmc_interrupt_flag_enum flag) +{ + FlagStatus ret1 = RESET; + FlagStatus ret2 = RESET; + + if(FMC_STAT_REG_OFFSET == FMC_REG_OFFSET_GET(flag)){ + /* get the staus of interrupt flag */ + ret1 = (FlagStatus) (FMC_REG_VALS(flag) & BIT(FMC_BIT_POS0(flag))); + /* get the staus of interrupt enale bit */ + ret2 = (FlagStatus) (FMC_CTL & BIT(FMC_BIT_POS1(flag))); + } + + if(ret1 && ret2){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear FMC interrupt flag state + \param[in] flag: FMC interrupt flags, refer to can_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg FMC_INT_FLAG_PGERR: FMC operation error interrupt flag bit + \arg FMC_INT_FLAG_WPERR: FMC erase/program protection error interrupt flag bit + \arg FMC_INT_FLAG_END: FMC end of operation interrupt flag bit + \param[out] none + \retval none + */ +void fmc_interrupt_flag_clear(fmc_interrupt_flag_enum flag) +{ + FMC_REG_VALS(flag) |= BIT(FMC_BIT_POS0(flag)); +} + +/*! + \brief get the FMC state + \param[in] none + \param[out] none + \retval state of FMC, refer to fmc_state_enum + */ +fmc_state_enum fmc_state_get(void) +{ + fmc_state_enum fmc_state = FMC_READY; + + if((uint32_t) 0x00U != (FMC_STAT & FMC_STAT_BUSY)){ + fmc_state = FMC_BUSY; + }else{ + if((uint32_t) 0x00U != (FMC_STAT & FMC_STAT_WPERR)){ + fmc_state = FMC_WPERR; + }else{ + if((uint32_t) 0x00U != (FMC_STAT & (FMC_STAT_PGERR))){ + fmc_state = FMC_PGERR; + } + } + } + /* return the FMC state */ + return fmc_state; +} + +/*! + \brief check whether FMC is ready or not + \param[in] timeout: count of loop + \param[out] none + \retval state of FMC, refer to fmc_state_enum + */ +fmc_state_enum fmc_ready_wait(uint32_t timeout) +{ + fmc_state_enum fmc_state = FMC_BUSY; + + /* wait for FMC ready */ + do{ + /* get FMC state */ + fmc_state = fmc_state_get(); + timeout--; + }while((FMC_BUSY == fmc_state) && (0x00U != timeout)); + + if(FMC_BUSY == fmc_state){ + fmc_state = FMC_TOERR; + } + /* return the FMC state */ + return fmc_state; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c new file mode 100644 index 0000000..c49ca54 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c @@ -0,0 +1,151 @@ +/*! + \file gd32vf103_fwdgt.c + \brief FWDGT driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_fwdgt.h" + +/* write value to FWDGT_CTL_CMD bit field */ +#define CTL_CMD(regval) (BITS(0,15) & ((uint32_t)(regval) << 0)) +/* write value to FWDGT_RLD_RLD bit field */ +#define RLD_RLD(regval) (BITS(0,11) & ((uint32_t)(regval) << 0)) + +/*! + \brief enable write access to FWDGT_PSC and FWDGT_RLD + \param[in] none + \param[out] none + \retval none +*/ +void fwdgt_write_enable(void) +{ + FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; +} + +/*! + \brief disable write access to FWDGT_PSC and FWDGT_RLD + \param[in] none + \param[out] none + \retval none +*/ +void fwdgt_write_disable(void) +{ + FWDGT_CTL = FWDGT_WRITEACCESS_DISABLE; +} + +/*! + \brief start the free watchdog timer counter + \param[in] none + \param[out] none + \retval none +*/ +void fwdgt_enable(void) +{ + FWDGT_CTL = FWDGT_KEY_ENABLE; +} + +/*! + \brief reload the counter of FWDGT + \param[in] none + \param[out] none + \retval none +*/ +void fwdgt_counter_reload(void) +{ + FWDGT_CTL = FWDGT_KEY_RELOAD; +} + +/*! + \brief configure counter reload value, and prescaler divider value + \param[in] reload_value: specify reload value(0x0000 - 0x0FFF) + \param[in] prescaler_div: FWDGT prescaler value + only one parameter can be selected which is shown as below: + \arg FWDGT_PSC_DIV4: FWDGT prescaler set to 4 + \arg FWDGT_PSC_DIV8: FWDGT prescaler set to 8 + \arg FWDGT_PSC_DIV16: FWDGT prescaler set to 16 + \arg FWDGT_PSC_DIV32: FWDGT prescaler set to 32 + \arg FWDGT_PSC_DIV64: FWDGT prescaler set to 64 + \arg FWDGT_PSC_DIV128: FWDGT prescaler set to 128 + \arg FWDGT_PSC_DIV256: FWDGT prescaler set to 256 + \param[out] none + \retval ErrStatus: ERROR or SUCCESS +*/ +ErrStatus fwdgt_config(uint16_t reload_value, uint8_t prescaler_div) +{ + uint32_t timeout = FWDGT_PSC_TIMEOUT; + uint32_t flag_status = RESET; + + /* enable write access to FWDGT_PSC,and FWDGT_RLD */ + FWDGT_CTL = FWDGT_WRITEACCESS_ENABLE; + /* wait until the PUD flag to be reset */ + do{ + flag_status = FWDGT_STAT & FWDGT_STAT_PUD; + }while((--timeout > 0U) && ((uint32_t)RESET != flag_status)); + + if((uint32_t)RESET != flag_status){ + return ERROR; + } + /* configure FWDGT */ + FWDGT_PSC = (uint32_t)prescaler_div; + + timeout = FWDGT_RLD_TIMEOUT; + /* wait until the RUD flag to be reset */ + do{ + flag_status = FWDGT_STAT & FWDGT_STAT_RUD; + }while((--timeout > 0U) && ((uint32_t)RESET != flag_status)); + + if((uint32_t)RESET != flag_status){ + return ERROR; + } + FWDGT_RLD = RLD_RLD(reload_value); + /* reload the counter */ + FWDGT_CTL = FWDGT_KEY_RELOAD; + + return SUCCESS; +} + +/*! + \brief get flag state of FWDGT + \param[in] flag: flag to get + only one parameter can be selected which is shown as below: + \arg FWDGT_FLAG_PUD: a write operation to FWDGT_PSC register is on going + \arg FWDGT_FLAG_RUD: a write operation to FWDGT_RLD register is on going + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus fwdgt_flag_get(uint16_t flag) +{ + if(FWDGT_STAT & flag){ + return SET; + } + + return RESET; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c new file mode 100644 index 0000000..9b1f5a6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c @@ -0,0 +1,502 @@ +/*! + \file gd32vf103_gpio.c + \brief GPIO driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_gpio.h" + +#define AFIO_EXTI_SOURCE_MASK ((uint8_t)0x03U) /*!< AFIO exti source selection mask*/ +#define AFIO_EXTI_SOURCE_FIELDS ((uint8_t)0x04U) /*!< select AFIO exti source registers */ +#define LSB_16BIT_MASK ((uint16_t)0xFFFFU) /*!< LSB 16-bit mask */ +#define PCF_POSITION_MASK ((uint32_t)0x000F0000U) /*!< AFIO_PCF register position mask */ +#define PCF_SWJCFG_MASK ((uint32_t)0xF0FFFFFFU) /*!< AFIO_PCF register SWJCFG mask */ +#define PCF_LOCATION1_MASK ((uint32_t)0x00200000U) /*!< AFIO_PCF register location1 mask */ +#define PCF_LOCATION2_MASK ((uint32_t)0x00100000U) /*!< AFIO_PCF register location2 mask */ +#define AFIO_PCF1_FIELDS ((uint32_t)0x80000000U) /*!< select AFIO_PCF1 register */ +#define GPIO_OUTPUT_PORT_OFFSET ((uint32_t)4U) /*!< GPIO event output port offset*/ + +/*! + \brief reset GPIO port + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[out] none + \retval none +*/ +void gpio_deinit(uint32_t gpio_periph) +{ + switch (gpio_periph) { + case GPIOA: + /* reset GPIOA */ + rcu_periph_reset_enable(RCU_GPIOARST); + rcu_periph_reset_disable(RCU_GPIOARST); + break; + case GPIOB: + /* reset GPIOB */ + rcu_periph_reset_enable(RCU_GPIOBRST); + rcu_periph_reset_disable(RCU_GPIOBRST); + break; + case GPIOC: + /* reset GPIOC */ + rcu_periph_reset_enable(RCU_GPIOCRST); + rcu_periph_reset_disable(RCU_GPIOCRST); + break; + case GPIOD: + /* reset GPIOD */ + rcu_periph_reset_enable(RCU_GPIODRST); + rcu_periph_reset_disable(RCU_GPIODRST); + break; + case GPIOE: + /* reset GPIOE */ + rcu_periph_reset_enable(RCU_GPIOERST); + rcu_periph_reset_disable(RCU_GPIOERST); + break; + default: + break; + } +} + +/*! + \brief reset alternate function I/O(AFIO) + \param[in] none + \param[out] none + \retval none +*/ +void gpio_afio_deinit(void) +{ + rcu_periph_reset_enable(RCU_AFRST); + rcu_periph_reset_disable(RCU_AFRST); +} + +/*! + \brief GPIO parameter initialization + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] mode: gpio pin mode + only one parameter can be selected which is shown as below: + \arg GPIO_MODE_AIN: analog input mode + \arg GPIO_MODE_IN_FLOATING: floating input mode + \arg GPIO_MODE_IPD: pull-down input mode + \arg GPIO_MODE_IPU: pull-up input mode + \arg GPIO_MODE_OUT_OD: GPIO output with open-drain + \arg GPIO_MODE_OUT_PP: GPIO output with push-pull + \arg GPIO_MODE_AF_OD: AFIO output with open-drain + \arg GPIO_MODE_AF_PP: AFIO output with push-pull + \param[in] speed: gpio output max speed value + only one parameter can be selected which is shown as below: + \arg GPIO_OSPEED_10MHZ: output max speed 10MHz + \arg GPIO_OSPEED_2MHZ: output max speed 2MHz + \arg GPIO_OSPEED_50MHZ: output max speed 50MHz + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + + \param[out] none + \retval none +*/ +void gpio_init(uint32_t gpio_periph, uint32_t mode, uint32_t speed, + uint32_t pin) +{ + uint16_t i; + uint32_t temp_mode = 0U; + uint32_t reg = 0U; + + /* GPIO mode configuration */ + temp_mode = (uint32_t) (mode & ((uint32_t) 0x0FU)); + + /* GPIO speed configuration */ + if (((uint32_t) 0x00U) != ((uint32_t) mode & ((uint32_t) 0x10U))) { + /* output mode max speed:10MHz,2MHz,50MHz */ + temp_mode |= (uint32_t) speed; + } + + /* configure the eight low port pins with GPIO_CTL0 */ + for (i = 0U; i < 8U; i++) { + if ((1U << i) & pin) { + reg = GPIO_CTL0(gpio_periph); + + /* clear the specified pin mode bits */ + reg &= ~GPIO_MODE_MASK(i); + /* set the specified pin mode bits */ + reg |= GPIO_MODE_SET(i, temp_mode); + + /* set IPD or IPU */ + if (GPIO_MODE_IPD == mode) { + /* reset the corresponding OCTL bit */ + GPIO_BC(gpio_periph) = (uint32_t) ((1U << i) & pin); + } else { + /* set the corresponding OCTL bit */ + if (GPIO_MODE_IPU == mode) { + GPIO_BOP(gpio_periph) = (uint32_t) ((1U << i) & pin); + } + } + /* set GPIO_CTL0 register */ + GPIO_CTL0(gpio_periph) = reg; + } + } + /* configure the eight high port pins with GPIO_CTL1 */ + for (i = 8U; i < 16U; i++) { + if ((1U << i) & pin) { + reg = GPIO_CTL1(gpio_periph); + + /* clear the specified pin mode bits */ + reg &= ~GPIO_MODE_MASK(i - 8U); + /* set the specified pin mode bits */ + reg |= GPIO_MODE_SET(i - 8U, temp_mode); + + /* set IPD or IPU */ + if (GPIO_MODE_IPD == mode) { + /* reset the corresponding OCTL bit */ + GPIO_BC(gpio_periph) = (uint32_t) ((1U << i) & pin); + } else { + /* set the corresponding OCTL bit */ + if (GPIO_MODE_IPU == mode) { + GPIO_BOP(gpio_periph) = (uint32_t) ((1U << i) & pin); + } + } + /* set GPIO_CTL1 register */ + GPIO_CTL1(gpio_periph) = reg; + } + } +} + +/*! + \brief set GPIO pin + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_bit_set(uint32_t gpio_periph, uint32_t pin) +{ + GPIO_BOP(gpio_periph) = (uint32_t) pin; +} + +/*! + \brief reset GPIO pin + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_bit_reset(uint32_t gpio_periph, uint32_t pin) +{ + GPIO_BC(gpio_periph) = (uint32_t) pin; +} + +/*! + \brief write data to the specified GPIO pin + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[in] bit_value: SET or RESET + only one parameter can be selected which is shown as below: + \arg RESET: clear the port pin + \arg SET: set the port pin + \param[out] none + \retval none +*/ +void gpio_bit_write(uint32_t gpio_periph, uint32_t pin, bit_status bit_value) +{ + if (RESET != bit_value) { + GPIO_BOP(gpio_periph) = (uint32_t) pin; + } else { + GPIO_BC(gpio_periph) = (uint32_t) pin; + } +} + +/*! + \brief write data to the specified GPIO port + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] data: specify the value to be written to the port output data register + \param[out] none + \retval none +*/ +void gpio_port_write(uint32_t gpio_periph, uint16_t data) +{ + GPIO_OCTL(gpio_periph) = (uint32_t) data; +} + +/*! + \brief get GPIO pin input status + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] pin: GPIO pin + only one parameter can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval input status of gpio pin: SET or RESET +*/ +FlagStatus gpio_input_bit_get(uint32_t gpio_periph, uint32_t pin) +{ + if ((uint32_t) RESET != (GPIO_ISTAT(gpio_periph) & (pin))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief get GPIO port input status + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[out] none + \retval input status of gpio all pins +*/ +uint16_t gpio_input_port_get(uint32_t gpio_periph) +{ + return (uint16_t) (GPIO_ISTAT(gpio_periph)); +} + +/*! + \brief get GPIO pin output status + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] pin: GPIO pin + only one parameter can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval output status of gpio pin: SET or RESET +*/ +FlagStatus gpio_output_bit_get(uint32_t gpio_periph, uint32_t pin) +{ + if ((uint32_t) RESET != (GPIO_OCTL(gpio_periph) & (pin))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief get GPIO port output status + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[out] none + \retval output status of gpio all pins +*/ +uint16_t gpio_output_port_get(uint32_t gpio_periph) +{ + return ((uint16_t) GPIO_OCTL(gpio_periph)); +} + +/*! + \brief configure GPIO pin remap + \param[in] gpio_remap: select the pin to remap + only one parameter can be selected which are shown as below: + \arg GPIO_SPI0_REMAP: SPI0 remapping + \arg GPIO_I2C0_REMAP: I2C0 remapping + \arg GPIO_USART0_REMAP: USART0 remapping + \arg GPIO_USART1_REMAP: USART1 remapping + \arg GPIO_USART2_PARTIAL_REMAP: USART2 partial remapping + \arg GPIO_USART2_FULL_REMAP: USART2 full remapping + \arg GPIO_TIMER0_PARTIAL_REMAP: TIMER0 partial remapping + \arg GPIO_TIMER0_FULL_REMAP: TIMER0 full remapping + \arg GPIO_TIMER1_PARTIAL_REMAP0: TIMER1 partial remapping + \arg GPIO_TIMER1_PARTIAL_REMAP1: TIMER1 partial remapping + \arg GPIO_TIMER1_FULL_REMAP: TIMER1 full remapping + \arg GPIO_TIMER2_PARTIAL_REMAP: TIMER2 partial remapping + \arg GPIO_TIMER2_FULL_REMAP: TIMER2 full remapping + \arg GPIO_TIMER3_REMAP: TIMER3 remapping + \arg GPIO_CAN0_PARTIAL_REMAP: CAN0 partial remapping + \arg GPIO_CAN0_FULL_REMAP: CAN0 full remapping + \arg GPIO_PD01_REMAP: PD01 remapping + \arg GPIO_TIMER4CH3_IREMAP: TIMER4 channel3 internal remapping + \arg GPIO_CAN1_REMAP: CAN1 remapping + \arg GPIO_SWJ_NONJTRST_REMAP: JTAG-DP,but without NJTRST + \arg GPIO_SWJ_DISABLE_REMAP: JTAG-DP disabled + \arg GPIO_SPI2_REMAP: SPI2 remapping + \arg GPIO_TIMER1ITI1_REMAP: TIMER1 internal trigger 1 remapping + \arg GPIO_EXMC_NADV_REMAP: EXMC_NADV connect/disconnect + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void gpio_pin_remap_config(uint32_t remap, ControlStatus newvalue) +{ + uint32_t remap1 = 0U, remap2 = 0U, temp_reg = 0U, temp_mask = 0U; + + if (AFIO_PCF1_FIELDS == (remap & AFIO_PCF1_FIELDS)) { + /* get AFIO_PCF1 regiter value */ + temp_reg = AFIO_PCF1; + } else { + /* get AFIO_PCF0 regiter value */ + temp_reg = AFIO_PCF0; + } + + temp_mask = (remap & PCF_POSITION_MASK) >> 0x10U; + remap1 = remap & LSB_16BIT_MASK; + + /* judge pin remap type */ + if ((PCF_LOCATION1_MASK | PCF_LOCATION2_MASK) + == (remap & (PCF_LOCATION1_MASK | PCF_LOCATION2_MASK))) { + temp_reg &= PCF_SWJCFG_MASK; + AFIO_PCF0 &= PCF_SWJCFG_MASK; + } else if (PCF_LOCATION2_MASK == (remap & PCF_LOCATION2_MASK)) { + remap2 = ((uint32_t) 0x03U) << temp_mask; + temp_reg &= ~remap2; + temp_reg |= ~PCF_SWJCFG_MASK; + } else { + temp_reg &= ~(remap1 << ((remap >> 0x15U) * 0x10U)); + temp_reg |= ~PCF_SWJCFG_MASK; + } + + /* set pin remap value */ + if (DISABLE != newvalue) { + temp_reg |= (remap1 << ((remap >> 0x15U) * 0x10U)); + } + + if (AFIO_PCF1_FIELDS == (remap & AFIO_PCF1_FIELDS)) { + /* set AFIO_PCF1 regiter value */ + AFIO_PCF1 = temp_reg; + } else { + /* set AFIO_PCF0 regiter value */ + AFIO_PCF0 = temp_reg; + } +} + +/*! + \brief select GPIO pin exti sources + \param[in] gpio_outputport: gpio event output port + only one parameter can be selected which are shown as below: + \arg GPIO_PORT_SOURCE_GPIOA: output port source A + \arg GPIO_PORT_SOURCE_GPIOB: output port source B + \arg GPIO_PORT_SOURCE_GPIOC: output port source C + \arg GPIO_PORT_SOURCE_GPIOD: output port source D + \arg GPIO_PORT_SOURCE_GPIOE: output port source E + \param[in] gpio_outputpin: GPIO_PIN_SOURCE_x(x=0..15) + \param[out] none + \retval none +*/ +void gpio_exti_source_select(uint8_t output_port, uint8_t output_pin) +{ + uint32_t source = 0U; + source = ((uint32_t) 0x0FU) + << (AFIO_EXTI_SOURCE_FIELDS * (output_pin & AFIO_EXTI_SOURCE_MASK)); + + /* select EXTI sources */ + if (GPIO_PIN_SOURCE_4 > output_pin) { + /* select EXTI0/EXTI1/EXTI2/EXTI3 */ + AFIO_EXTISS0 &= ~source; + AFIO_EXTISS0 |= (((uint32_t) output_port) + << (AFIO_EXTI_SOURCE_FIELDS + * (output_pin & AFIO_EXTI_SOURCE_MASK))); + } else if (GPIO_PIN_SOURCE_8 > output_pin) { + /* select EXTI4/EXTI5/EXTI6/EXTI7 */ + AFIO_EXTISS1 &= ~source; + AFIO_EXTISS1 |= (((uint32_t) output_port) + << (AFIO_EXTI_SOURCE_FIELDS + * (output_pin & AFIO_EXTI_SOURCE_MASK))); + } else if (GPIO_PIN_SOURCE_12 > output_pin) { + /* select EXTI8/EXTI9/EXTI10/EXTI11 */ + AFIO_EXTISS2 &= ~source; + AFIO_EXTISS2 |= (((uint32_t) output_port) + << (AFIO_EXTI_SOURCE_FIELDS + * (output_pin & AFIO_EXTI_SOURCE_MASK))); + } else { + /* select EXTI12/EXTI13/EXTI14/EXTI15 */ + AFIO_EXTISS3 &= ~source; + AFIO_EXTISS3 |= (((uint32_t) output_port) + << (AFIO_EXTI_SOURCE_FIELDS + * (output_pin & AFIO_EXTI_SOURCE_MASK))); + } +} + +/*! + \brief configure GPIO pin event output + \param[in] output_port: gpio event output port + only one parameter can be selected which are shown as below: + \arg GPIO_EVENT_PORT_GPIOA: event output port A + \arg GPIO_EVENT_PORT_GPIOB: event output port B + \arg GPIO_EVENT_PORT_GPIOC: event output port C + \arg GPIO_EVENT_PORT_GPIOD: event output port D + \arg GPIO_EVENT_PORT_GPIOE: event output port E + \param[in] output_pin: + only one parameter can be selected which are shown as below: + \arg GPIO_EVENT_PIN_x(x=0..15) + \param[out] none + \retval none +*/ +void gpio_event_output_config(uint8_t output_port, uint8_t output_pin) +{ + uint32_t reg = 0U; + reg = AFIO_EC; + + /* clear AFIO_EC_PORT and AFIO_EC_PIN bits */ + reg &= (uint32_t) (~(AFIO_EC_PORT | AFIO_EC_PIN)); + + reg |= (uint32_t) ((uint32_t) output_port << GPIO_OUTPUT_PORT_OFFSET); + reg |= (uint32_t) output_pin; + + AFIO_EC = reg; +} + +/*! + \brief enable GPIO pin event output + \param[in] none + \param[out] none + \retval none +*/ +void gpio_event_output_enable(void) +{ + AFIO_EC |= AFIO_EC_EOE; +} + +/*! + \brief disable GPIO pin event output + \param[in] none + \param[out] none + \retval none +*/ +void gpio_event_output_disable(void) +{ + AFIO_EC &= (uint32_t) (~AFIO_EC_EOE); +} + +/*! + \brief lock GPIO pin + \param[in] gpio_periph: GPIOx(x = A,B,C,D,E) + \param[in] pin: GPIO pin + one or more parameters can be selected which are shown as below: + \arg GPIO_PIN_x(x=0..15), GPIO_PIN_ALL + \param[out] none + \retval none +*/ +void gpio_pin_lock(uint32_t gpio_periph, uint32_t pin) +{ + uint32_t lock = 0x00010000U; + lock |= pin; + + /* lock key writing sequence: write 1 -> write 0 -> write 1 -> read 0 -> read 1 */ + GPIO_LOCK(gpio_periph) = (uint32_t) lock; + GPIO_LOCK(gpio_periph) = (uint32_t) pin; + GPIO_LOCK(gpio_periph) = (uint32_t) lock; + lock = GPIO_LOCK(gpio_periph); + lock = GPIO_LOCK(gpio_periph); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c new file mode 100644 index 0000000..5a4591e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c @@ -0,0 +1,730 @@ +/*! + \file gd32vf103_i2c.c + \brief I2C driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + \version 2019-09-18, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_i2c.h" + +/* I2C register bit mask */ +#define I2CCLK_MAX ((uint32_t)0x00000036U) /*!< i2cclk maximum value */ +#define I2CCLK_MIN ((uint32_t)0x00000002U) /*!< i2cclk minimum value */ +#define I2C_FLAG_MASK ((uint32_t)0x0000FFFFU) /*!< i2c flag mask */ +#define I2C_ADDRESS_MASK ((uint32_t)0x000003FFU) /*!< i2c address mask */ +#define I2C_ADDRESS2_MASK ((uint32_t)0x000000FEU) /*!< the second i2c address mask */ + +/* I2C register bit offset */ +#define STAT1_PECV_OFFSET ((uint32_t)8U) /* bit offset of PECV in I2C_STAT1 */ + +/*! + \brief reset I2C + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval none + */ +void i2c_deinit(uint32_t i2c_periph) +{ + switch (i2c_periph) { + case I2C0: + /* reset I2C0 */ + rcu_periph_reset_enable(RCU_I2C0RST); + rcu_periph_reset_disable(RCU_I2C0RST); + break; + case I2C1: + /* reset I2C1 */ + rcu_periph_reset_enable(RCU_I2C1RST); + rcu_periph_reset_disable(RCU_I2C1RST); + break; + default: + break; + } +} + +/*! + \brief configure I2C clock + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] clkspeed: I2C clock speed, supports standard mode (up to 100 kHz), fast mode (up to 400 kHz) + and fast mode plus (up to 1MHz) + \param[in] dutycyc: duty cycle in fast mode or fast mode plus + only one parameter can be selected which is shown as below: + \arg I2C_DTCY_2: T_low/T_high=2 + \arg I2C_DTCY_16_9: T_low/T_high=16/9 + \param[out] none + \retval none + */ +void i2c_clock_config(uint32_t i2c_periph, uint32_t clkspeed, uint32_t dutycyc) +{ + uint32_t pclk1, clkc, freq, risetime; + uint32_t temp; + + pclk1 = rcu_clock_freq_get(CK_APB1); + /* I2C peripheral clock frequency */ + freq = (uint32_t) (pclk1 / 1000000U); + if (freq >= I2CCLK_MAX) { + freq = I2CCLK_MAX; + } + temp = I2C_CTL1(i2c_periph); + temp &= ~I2C_CTL1_I2CCLK; + temp |= freq; + + I2C_CTL1(i2c_periph) = temp; + + if (100000U >= clkspeed) { + /* the maximum SCL rise time is 1000ns in standard mode */ + risetime = (uint32_t) ((pclk1 / 1000000U) + 1U); + if (risetime >= I2CCLK_MAX) { + I2C_RT(i2c_periph) = I2CCLK_MAX; + } else if (risetime <= I2CCLK_MIN) { + I2C_RT(i2c_periph) = I2CCLK_MIN; + } else { + I2C_RT(i2c_periph) = risetime; + } + clkc = (uint32_t) (pclk1 / (clkspeed * 2U)); + if (clkc < 0x04U) { + /* the CLKC in standard mode minmum value is 4 */ + clkc = 0x04U; + } + I2C_CKCFG(i2c_periph) |= (I2C_CKCFG_CLKC & clkc); + + } else if (400000U >= clkspeed) { + /* the maximum SCL rise time is 300ns in fast mode */ + I2C_RT(i2c_periph) = (uint32_t) (((freq * (uint32_t) 300U)/(uint32_t)1000U)+(uint32_t)1U); + if (I2C_DTCY_2 == dutycyc){ + /* I2C duty cycle is 2 */ + clkc = (uint32_t) (pclk1 / (clkspeed * 3U)); + I2C_CKCFG(i2c_periph) &= ~I2C_CKCFG_DTCY; + } else { + /* I2C duty cycle is 16/9 */ + clkc = (uint32_t) (pclk1 / (clkspeed * 25U)); + I2C_CKCFG(i2c_periph) |= I2C_CKCFG_DTCY; + } + if (0U == (clkc & I2C_CKCFG_CLKC)) { + /* the CLKC in fast mode minmum value is 1 */ + clkc |= 0x0001U; + } + I2C_CKCFG(i2c_periph) |= I2C_CKCFG_FAST; + I2C_CKCFG(i2c_periph) |= clkc; + } else { + /* fast mode plus, the maximum SCL rise time is 120ns */ + I2C_RT (i2c_periph) = (uint32_t) (((freq * (uint32_t) 120U) / (uint32_t) 1000U)+(uint32_t) 1U); + if (I2C_DTCY_2 == dutycyc) { + /* I2C duty cycle is 2 */ + clkc = (uint32_t) (pclk1 / (clkspeed * 3U)); + I2C_CKCFG(i2c_periph) &= ~I2C_CKCFG_DTCY; + } else { + /* I2C duty cycle is 16/9 */ + clkc = (uint32_t) (pclk1 / (clkspeed * 25U)); + I2C_CKCFG(i2c_periph) |= I2C_CKCFG_DTCY; + } + /* enable fast mode */ + I2C_CKCFG(i2c_periph) |= I2C_CKCFG_FAST; + I2C_CKCFG(i2c_periph) |= clkc; + /* enable I2C fast mode plus */ + I2C_FMPCFG(i2c_periph) |= I2C_FMPCFG_FMPEN; + } +} + +/*! + \brief configure I2C address + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] mode: + only one parameter can be selected which is shown as below: + \arg I2C_I2CMODE_ENABLE: I2C mode + \arg I2C_SMBUSMODE_ENABLE: SMBus mode + \param[in] addformat: 7bits or 10bits + only one parameter can be selected which is shown as below: + \arg I2C_ADDFORMAT_7BITS: 7bits + \arg I2C_ADDFORMAT_10BITS: 10bits + \param[in] addr: I2C address + \param[out] none + \retval none + */ +void i2c_mode_addr_config(uint32_t i2c_periph, uint32_t mode,uint32_t addformat, uint32_t addr) +{ + /* SMBus/I2C mode selected */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_SMBEN); + ctl |= mode; + I2C_CTL0(i2c_periph) = ctl; + /* configure address */ + addr = addr & I2C_ADDRESS_MASK; + I2C_SADDR0(i2c_periph) = (addformat | addr); +} + +/*! + \brief SMBus type selection + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] type: + only one parameter can be selected which is shown as below: + \arg I2C_SMBUS_DEVICE: device + \arg I2C_SMBUS_HOST: host + \param[out] none + \retval none + */ +void i2c_smbus_type_config(uint32_t i2c_periph, uint32_t type) +{ + if (I2C_SMBUS_HOST == type) { + I2C_CTL0(i2c_periph) |= I2C_CTL0_SMBSEL; + } else { + I2C_CTL0(i2c_periph) &= ~(I2C_CTL0_SMBSEL); + } +} + +/*! + \brief whether or not to send an ACK + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] ack: + only one parameter can be selected which is shown as below: + \arg I2C_ACK_ENABLE: ACK will be sent + \arg I2C_ACK_DISABLE: ACK will not be sent + \param[out] none + \retval none + */ +void i2c_ack_config(uint32_t i2c_periph, uint32_t ack) +{ + if (I2C_ACK_ENABLE == ack) { + I2C_CTL0(i2c_periph) |= I2C_CTL0_ACKEN; + } else { + I2C_CTL0(i2c_periph) &= ~(I2C_CTL0_ACKEN); + } +} + +/*! + \brief configure I2C POAP position + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] pos: + only one parameter can be selected which is shown as below: + \arg I2C_ACKPOS_CURRENT: whether to send ACK or not for the current + \arg I2C_ACKPOS_NEXT: whether to send ACK or not for the next byte + \param[out] none + \retval none + */ +void i2c_ackpos_config(uint32_t i2c_periph, uint32_t pos) +{ + /* configure I2C POAP position */ + if (I2C_ACKPOS_NEXT == pos) { + I2C_CTL0(i2c_periph) |= I2C_CTL0_POAP; + } else { + I2C_CTL0(i2c_periph) &= ~(I2C_CTL0_POAP); + } +} + +/*! + \brief master sends slave address + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] addr: slave address + \param[in] trandirection: transmitter or receiver + only one parameter can be selected which is shown as below: + \arg I2C_TRANSMITTER: transmitter + \arg I2C_RECEIVER: receiver + \param[out] none + \retval none + */ +void i2c_master_addressing(uint32_t i2c_periph, uint32_t addr,uint32_t trandirection) +{ + /* master is a transmitter or a receiver */ + if (I2C_TRANSMITTER == trandirection) { + addr = addr & I2C_TRANSMITTER; + } else { + addr = addr | I2C_RECEIVER; + } + /* send slave address */ + I2C_DATA(i2c_periph) = addr; +} + +/*! + \brief enable dual-address mode + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] addr: the second address in dual-address mode + \param[out] none + \retval none +*/ +void i2c_dualaddr_enable(uint32_t i2c_periph, uint32_t addr) +{ + /* configure address */ + addr = addr & I2C_ADDRESS2_MASK; + I2C_SADDR1(i2c_periph) = (I2C_SADDR1_DUADEN | addr); +} + +/*! + \brief disable dual-address mode + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval none +*/ +void i2c_dualaddr_disable(uint32_t i2c_periph) +{ + I2C_SADDR1(i2c_periph) &= ~(I2C_SADDR1_DUADEN); +} + +/*! + \brief enable I2C + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval none + */ +void i2c_enable(uint32_t i2c_periph) +{ + I2C_CTL0(i2c_periph) |= I2C_CTL0_I2CEN; +} + +/*! + \brief disable I2C + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval none + */ +void i2c_disable(uint32_t i2c_periph) +{ + I2C_CTL0(i2c_periph) &= ~(I2C_CTL0_I2CEN); +} + +/*! + \brief generate a START condition on I2C bus + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval none + */ +void i2c_start_on_bus(uint32_t i2c_periph) +{ + I2C_CTL0(i2c_periph) |= I2C_CTL0_START; +} + +/*! + \brief generate a STOP condition on I2C bus + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval none + */ +void i2c_stop_on_bus(uint32_t i2c_periph) +{ + I2C_CTL0(i2c_periph) |= I2C_CTL0_STOP; +} + +/*! + \brief I2C transmit data function + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] data: data of transmission + \param[out] none + \retval none + */ +void i2c_data_transmit(uint32_t i2c_periph, uint8_t data) +{ + I2C_DATA(i2c_periph) = DATA_TRANS(data); +} + +/*! + \brief I2C receive data function + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval data of received + */ +uint8_t i2c_data_receive(uint32_t i2c_periph) +{ + return (uint8_t) DATA_RECV(I2C_DATA(i2c_periph)); +} + +/*! + \brief enable I2C DMA mode + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] dmastate: + only one parameter can be selected which is shown as below: + \arg I2C_DMA_ON: DMA mode enable + \arg I2C_DMA_OFF: DMA mode disable + \param[out] none + \retval none + */ +void i2c_dma_enable(uint32_t i2c_periph, uint32_t dmastate) +{ + /* configure I2C DMA function */ + uint32_t ctl = 0U; + + ctl = I2C_CTL1(i2c_periph); + ctl &= ~(I2C_CTL1_DMAON); + ctl |= dmastate; + I2C_CTL1(i2c_periph) = ctl; +} + +/*! + \brief configure whether next DMA EOT is DMA last transfer or not + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] dmalast: + only one parameter can be selected which is shown as below: + \arg I2C_DMALST_ON: next DMA EOT is the last transfer + \arg I2C_DMALST_OFF: next DMA EOT is not the last transfer + \param[out] none + \retval none + */ +void i2c_dma_last_transfer_config(uint32_t i2c_periph, uint32_t dmalast) +{ + /* configure DMA last transfer */ + uint32_t ctl = 0U; + + ctl = I2C_CTL1(i2c_periph); + ctl &= ~(I2C_CTL1_DMALST); + ctl |= dmalast; + I2C_CTL1(i2c_periph) = ctl; +} + +/*! + \brief whether to stretch SCL low when data is not ready in slave mode + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] stretchpara: + only one parameter can be selected which is shown as below: + \arg I2C_SCLSTRETCH_ENABLE: SCL stretching is enabled + \arg I2C_SCLSTRETCH_DISABLE: SCL stretching is disabled + \param[out] none + \retval none + */ +void i2c_stretch_scl_low_config(uint32_t i2c_periph, uint32_t stretchpara) +{ + /* configure I2C SCL strerching enable or disable */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_SS); + ctl |= stretchpara; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief whether or not to response to a general call + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] gcallpara: + only one parameter can be selected which is shown as below: + \arg I2C_GCEN_ENABLE: slave will response to a general call + \arg I2C_GCEN_DISABLE: slave will not response to a general call + \param[out] none + \retval none + */ +void i2c_slave_response_to_gcall_config(uint32_t i2c_periph, uint32_t gcallpara) +{ + /* configure slave response to a general call enable or disable */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_GCEN); + ctl |= gcallpara; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief software reset I2C + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] sreset: + only one parameter can be selected which is shown as below: + \arg I2C_SRESET_SET: I2C is under reset + \arg I2C_SRESET_RESET: I2C is not under reset + \param[out] none + \retval none + */ +void i2c_software_reset_config(uint32_t i2c_periph, uint32_t sreset) +{ + /* modify CTL0 and configure software reset I2C state */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_SRESET); + ctl |= sreset; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief I2C PEC calculation on or off + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] pecpara: + only one parameter can be selected which is shown as below: + \arg I2C_PEC_ENABLE: PEC calculation on + \arg I2C_PEC_DISABLE: PEC calculation off + \param[out] none + \retval none + */ +void i2c_pec_enable(uint32_t i2c_periph, uint32_t pecstate) +{ + /* on/off PEC calculation */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_PECEN); + ctl |= pecstate; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief I2C whether to transfer PEC value + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] pecpara: + only one parameter can be selected which is shown as below: + \arg I2C_PECTRANS_ENABLE: transfer PEC + \arg I2C_PECTRANS_DISABLE: not transfer PEC + \param[out] none + \retval none + */ +void i2c_pec_transfer_enable(uint32_t i2c_periph, uint32_t pecpara) +{ + /* whether to transfer PEC */ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_PECTRANS); + ctl |= pecpara; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief get packet error checking value + \param[in] i2c_periph: I2Cx(x=0,1) + \param[out] none + \retval PEC value + */ +uint8_t i2c_pec_value_get(uint32_t i2c_periph) +{ + return (uint8_t) ((I2C_STAT1(i2c_periph) & I2C_STAT1_PECV)>> STAT1_PECV_OFFSET); +} + +/*! + \brief I2C issue alert through SMBA pin + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] smbuspara: + only one parameter can be selected which is shown as below: + \arg I2C_SALTSEND_ENABLE: issue alert through SMBA pin + \arg I2C_SALTSEND_DISABLE: not issue alert through SMBA pin + \param[out] none + \retval none + */ +void i2c_smbus_issue_alert(uint32_t i2c_periph, uint32_t smbuspara) +{ + /* issue alert through SMBA pin configure*/ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_SALT); + ctl |= smbuspara; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief enable or disable I2C ARP protocol in SMBus switch + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] arpstate: + only one parameter can be selected which is shown as below: + \arg I2C_ARP_ENABLE: enable ARP + \arg I2C_ARP_DISABLE: disable ARP + \param[out] none + \retval none + */ +void i2c_smbus_arp_enable(uint32_t i2c_periph, uint32_t arpstate) +{ + /* enable or disable I2C ARP protocol*/ + uint32_t ctl = 0U; + + ctl = I2C_CTL0(i2c_periph); + ctl &= ~(I2C_CTL0_ARPEN); + ctl |= arpstate; + I2C_CTL0(i2c_periph) = ctl; +} + +/*! + \brief check I2C flag is set or not + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] flag: I2C flags, refer to i2c_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_FLAG_SBSEND: start condition send out + \arg I2C_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode + \arg I2C_FLAG_BTC: byte transmission finishes + \arg I2C_FLAG_ADD10SEND: header of 10-bit address is sent in master mode + \arg I2C_FLAG_STPDET: stop condition detected in slave mode + \arg I2C_FLAG_RBNE: I2C_DATA is not Empty during receiving + \arg I2C_FLAG_TBE: I2C_DATA is empty during transmitting + \arg I2C_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus + \arg I2C_FLAG_LOSTARB: arbitration lost in master mode + \arg I2C_FLAG_AERR: acknowledge error + \arg I2C_FLAG_OUERR: overrun or underrun situation occurs in slave mode + \arg I2C_FLAG_PECERR: PEC error when receiving data + \arg I2C_FLAG_SMBTO: timeout signal in SMBus mode + \arg I2C_FLAG_SMBALT: SMBus alert status + \arg I2C_FLAG_MASTER: a flag indicating whether I2C block is in master or slave mode + \arg I2C_FLAG_I2CBSY: busy flag + \arg I2C_FLAG_TR: whether the I2C is a transmitter or a receiver + \arg I2C_FLAG_RXGC: general call address (00h) received + \arg I2C_FLAG_DEFSMB: default address of SMBus device + \arg I2C_FLAG_HSTSMB: SMBus host header detected in slave mode + \arg I2C_FLAG_DUMODF: dual flag in slave mode indicating which address is matched in dual-address mode + \param[out] none + \retval FlagStatus: SET or RESET + */ +FlagStatus i2c_flag_get(uint32_t i2c_periph, i2c_flag_enum flag) +{ + if (RESET != (I2C_REG_VAL(i2c_periph, flag) & BIT(I2C_BIT_POS(flag)))) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear I2C flag + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] flag: I2C flags, refer to i2c_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_FLAG_SMBALT: SMBus Alert status + \arg I2C_FLAG_SMBTO: timeout signal in SMBus mode + \arg I2C_FLAG_PECERR: PEC error when receiving data + \arg I2C_FLAG_OUERR: over-run or under-run situation occurs in slave mode + \arg I2C_FLAG_AERR: acknowledge error + \arg I2C_FLAG_LOSTARB: arbitration lost in master mode + \arg I2C_FLAG_BERR: a bus error + \arg I2C_FLAG_ADDSEND: cleared by reading I2C_STAT0 and reading I2C_STAT1 + \param[out] none + \retval none + */ +void i2c_flag_clear(uint32_t i2c_periph, i2c_flag_enum flag) +{ + uint32_t temp; + if (I2C_FLAG_ADDSEND == flag) { + /* read I2C_STAT0 and then read I2C_STAT1 to clear ADDSEND */ + temp = I2C_STAT0(i2c_periph); + temp = I2C_STAT1(i2c_periph); + } else { + I2C_REG_VAL(i2c_periph, flag) &= ~BIT(I2C_BIT_POS(flag)); + } +} + +/*! + \brief enable I2C interrupt + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] interrupt: I2C interrupts, refer to i2c_interrupt_enum + only one parameter can be selected which is shown as below: + \arg I2C_INT_ERR: error interrupt enable + \arg I2C_INT_EV: event interrupt enable + \arg I2C_INT_BUF: buffer interrupt enable + \param[out] none + \retval none + */ +void i2c_interrupt_enable(uint32_t i2c_periph, i2c_interrupt_enum interrupt) +{ + I2C_REG_VAL(i2c_periph, interrupt) |= BIT(I2C_BIT_POS(interrupt)); +} + +/*! + \brief disable I2C interrupt + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] interrupt: I2C interrupts, refer to i2c_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_INT_ERR: error interrupt enable + \arg I2C_INT_EV: event interrupt enable + \arg I2C_INT_BUF: buffer interrupt enable + \param[out] none + \retval none + */ +void i2c_interrupt_disable(uint32_t i2c_periph, i2c_interrupt_enum interrupt) +{ + I2C_REG_VAL(i2c_periph, interrupt) &= ~BIT(I2C_BIT_POS(interrupt)); +} + +/*! + \brief check I2C interrupt flag + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] int_flag: I2C interrupt flags, refer to i2c_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_INT_FLAG_SBSEND: start condition sent out in master mode interrupt flag + \arg I2C_INT_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode interrupt flag + \arg I2C_INT_FLAG_BTC: byte transmission finishes + \arg I2C_INT_FLAG_ADD10SEND: header of 10-bit address is sent in master mode interrupt flag + \arg I2C_INT_FLAG_STPDET: etop condition detected in slave mode interrupt flag + \arg I2C_INT_FLAG_RBNE: I2C_DATA is not Empty during receiving interrupt flag + \arg I2C_INT_FLAG_TBE: I2C_DATA is empty during transmitting interrupt flag + \arg I2C_INT_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag + \arg I2C_INT_FLAG_LOSTARB: arbitration lost in master mode interrupt flag + \arg I2C_INT_FLAG_AERR: acknowledge error interrupt flag + \arg I2C_INT_FLAG_OUERR: over-run or under-run situation occurs in slave mode interrupt flag + \arg I2C_INT_FLAG_PECERR: PEC error when receiving data interrupt flag + \arg I2C_INT_FLAG_SMBTO: timeout signal in SMBus mode interrupt flag + \arg I2C_INT_FLAG_SMBALT: SMBus Alert status interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET + */ +FlagStatus i2c_interrupt_flag_get(uint32_t i2c_periph,i2c_interrupt_flag_enum int_flag) +{ + uint32_t intenable = 0U, flagstatus = 0U, bufie; + + /* check BUFIE */ + bufie = I2C_CTL1(i2c_periph) & I2C_CTL1_BUFIE; + + /* get the interrupt enable bit status */ + intenable = (I2C_REG_VAL(i2c_periph, int_flag) & BIT(I2C_BIT_POS(int_flag))); + /* get the corresponding flag bit status */ + flagstatus = (I2C_REG_VAL2(i2c_periph, int_flag)& BIT(I2C_BIT_POS2(int_flag))); + + if ((I2C_INT_FLAG_RBNE == int_flag) || (I2C_INT_FLAG_TBE == int_flag)) { + if (intenable && bufie) { + intenable = 1U; + } else { + intenable = 0U; + } + } + if ((0U != flagstatus) && (0U != intenable)) { + return SET; + } else { + return RESET; + } +} + +/*! + \brief clear I2C interrupt flag + \param[in] i2c_periph: I2Cx(x=0,1) + \param[in] int_flag: I2C interrupt flags, refer to i2c_interrupt_flag_enum + only one parameter can be selected which is shown as below: + \arg I2C_INT_FLAG_ADDSEND: address is sent in master mode or received and matches in slave mode interrupt flag + \arg I2C_INT_FLAG_BERR: a bus error occurs indication a unexpected start or stop condition on I2C bus interrupt flag + \arg I2C_INT_FLAG_LOSTARB: arbitration lost in master mode interrupt flag + \arg I2C_INT_FLAG_AERR: acknowledge error interrupt flag + \arg I2C_INT_FLAG_OUERR: over-run or under-run situation occurs in slave mode interrupt flag + \arg I2C_INT_FLAG_PECERR: PEC error when receiving data interrupt flag + \arg I2C_INT_FLAG_SMBTO: timeout signal in SMBus mode interrupt flag + \arg I2C_INT_FLAG_SMBALT: SMBus Alert status interrupt flag + \param[out] none + \retval none + */ +void i2c_interrupt_flag_clear(uint32_t i2c_periph,i2c_interrupt_flag_enum int_flag) +{ + uint32_t temp; + if (I2C_INT_FLAG_ADDSEND == int_flag) { + /* read I2C_STAT0 and then read I2C_STAT1 to clear ADDSEND */ + temp = I2C_STAT0(i2c_periph); + temp = I2C_STAT1(i2c_periph); + } else { + I2C_REG_VAL2(i2c_periph, int_flag) &= ~BIT(I2C_BIT_POS2(int_flag)); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c new file mode 100644 index 0000000..ed2bb65 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c @@ -0,0 +1,270 @@ +/*! + \file gd32vf103_pmu.c + \brief PMU driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_pmu.h" +#include "riscv_encoding.h" + +/*! + \brief reset PMU register + \param[in] none + \param[out] none + \retval none +*/ +void pmu_deinit(void) +{ + /* reset PMU */ + rcu_periph_reset_enable(RCU_PMURST); + rcu_periph_reset_disable(RCU_PMURST); +} + +/*! + \brief select low voltage detector threshold + \param[in] lvdt_n: + only one parameter can be selected which is shown as below: + \arg PMU_LVDT_0: voltage threshold is 2.2V + \arg PMU_LVDT_1: voltage threshold is 2.3V + \arg PMU_LVDT_2: voltage threshold is 2.4V + \arg PMU_LVDT_3: voltage threshold is 2.5V + \arg PMU_LVDT_4: voltage threshold is 2.6V + \arg PMU_LVDT_5: voltage threshold is 2.7V + \arg PMU_LVDT_6: voltage threshold is 2.8V + \arg PMU_LVDT_7: voltage threshold is 2.9V + \param[out] none + \retval none +*/ +void pmu_lvd_select(uint32_t lvdt_n) +{ + /* disable LVD */ + PMU_CTL &= ~PMU_CTL_LVDEN; + /* clear LVDT bits */ + PMU_CTL &= ~PMU_CTL_LVDT; + /* set LVDT bits according to lvdt_n */ + PMU_CTL |= lvdt_n; + /* enable LVD */ + PMU_CTL |= PMU_CTL_LVDEN; +} + +/*! + \brief disable PMU lvd + \param[in] none + \param[out] none + \retval none +*/ +void pmu_lvd_disable(void) +{ + /* disable LVD */ + PMU_CTL &= ~PMU_CTL_LVDEN; +} + +/*! + \brief PMU work at sleep mode + \param[in] sleepmodecmd: + only one parameter can be selected which is shown as below: + \arg WFI_CMD: use WFI command + \arg WFE_CMD: use WFE command + \param[out] none + \retval none +*/ +void pmu_to_sleepmode(uint8_t sleepmodecmd) +{ + /* clear sleepdeep bit of RISC-V system control register */ + clear_csr(0x811, 0x1); + + /* select WFI or WFE command to enter sleep mode */ + if(WFI_CMD == sleepmodecmd){ + __WFI(); + }else{ + clear_csr(mstatus, MSTATUS_MIE); + set_csr(0x810, 0x1); + __WFI(); + clear_csr(0x810, 0x1); + set_csr(mstatus, MSTATUS_MIE); + } +} + +/*! + \brief PMU work at deepsleep mode + \param[in] ldo: + only one parameter can be selected which is shown as below: + \arg PMU_LDO_NORMAL: LDO work at normal power mode when pmu enter deepsleep mode + \arg PMU_LDO_LOWPOWER: LDO work at low power mode when pmu enter deepsleep mode + \param[in] deepsleepmodecmd: + only one parameter can be selected which is shown as below: + \arg WFI_CMD: use WFI command + \arg WFE_CMD: use WFE command + \param[out] none + \retval none +*/ +void pmu_to_deepsleepmode(uint32_t ldo,uint8_t deepsleepmodecmd) +{ + /* clear stbmod and ldolp bits */ + PMU_CTL &= ~((uint32_t)(PMU_CTL_STBMOD | PMU_CTL_LDOLP)); + /* set ldolp bit according to pmu_ldo */ + PMU_CTL |= ldo; + /* set CSR_SLEEPVALUE bit of RISC-V system control register */ + set_csr(0x811, 0x1); + /* select WFI or WFE command to enter deepsleep mode */ + if(WFI_CMD == deepsleepmodecmd){ + __WFI(); + }else{ + clear_csr(mstatus, MSTATUS_MIE); + set_csr(0x810, 0x1); + __WFI(); + clear_csr(0x810, 0x1); + set_csr(mstatus, MSTATUS_MIE); + } + /* reset sleepdeep bit of RISC-V system control register */ + clear_csr(0x811, 0x1); +} + +/*! + \brief pmu work at standby mode + \param[in] standbymodecmd: + only one parameter can be selected which is shown as below: + \arg WFI_CMD: use WFI command + \arg WFE_CMD: use WFE command + \param[out] none + \retval none +*/ +void pmu_to_standbymode(uint8_t standbymodecmd) +{ + /* set CSR_SLEEPVALUE bit of RISC-V system control register */ + set_csr(0x811, 0x1); + + /* set stbmod bit */ + PMU_CTL |= PMU_CTL_STBMOD; + + /* reset wakeup flag */ + PMU_CTL |= PMU_CTL_WURST; + + /* select WFI or WFE command to enter standby mode */ + if(WFI_CMD == standbymodecmd){ + __WFI(); + }else{ + clear_csr(mstatus, MSTATUS_MIE); + set_csr(0x810, 0x1); + __WFI(); + clear_csr(0x810, 0x1); + set_csr(mstatus, MSTATUS_MIE); + } + clear_csr(0x811, 0x1); +} + +/*! + \brief enable wakeup pin + \param[in] none + \param[out] none + \retval none +*/ +void pmu_wakeup_pin_enable(void) +{ + PMU_CS |= PMU_CS_WUPEN; +} + +/*! + \brief disable wakeup pin + \param[in] none + \param[out] none + \retval none +*/ +void pmu_wakeup_pin_disable(void) +{ + PMU_CS &= ~PMU_CS_WUPEN; +} + +/*! + \brief enable write access to the registers in backup domain + \param[in] none + \param[out] none + \retval none +*/ +void pmu_backup_write_enable(void) +{ + PMU_CTL |= PMU_CTL_BKPWEN; +} + +/*! + \brief disable write access to the registers in backup domain + \param[in] none + \param[out] none + \retval none +*/ +void pmu_backup_write_disable(void) +{ + PMU_CTL &= ~PMU_CTL_BKPWEN; +} + +/*! + \brief get flag state + \param[in] flag: + only one parameter can be selected which is shown as below: + \arg PMU_FLAG_WAKEUP: wakeup flag + \arg PMU_FLAG_STANDBY: standby flag + \arg PMU_FLAG_LVD: lvd flag + \param[out] none + \retval FlagStatus SET or RESET +*/ +FlagStatus pmu_flag_get(uint32_t flag) +{ + if(PMU_CS & flag){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear flag bit + \param[in] flag_reset: + only one parameter can be selected which is shown as below: + \arg PMU_FLAG_RESET_WAKEUP: reset wakeup flag + \arg PMU_FLAG_RESET_STANDBY: reset standby flag + \param[out] none + \retval none +*/ +void pmu_flag_clear(uint32_t flag_reset) +{ + switch(flag_reset){ + case PMU_FLAG_RESET_WAKEUP: + /* reset wakeup flag */ + PMU_CTL |= PMU_CTL_WURST; + break; + case PMU_FLAG_RESET_STANDBY: + /* reset standby flag */ + PMU_CTL |= PMU_CTL_STBRST; + break; + default : + break; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c new file mode 100644 index 0000000..4cdac29 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c @@ -0,0 +1,1111 @@ +/*! + \file gd32vf103_rcu.c + \brief RCU driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_rcu.h" + +/* define clock source */ +#define SEL_IRC8M ((uint16_t)0U) +#define SEL_HXTAL ((uint16_t)1U) +#define SEL_PLL ((uint16_t)2U) + +/* define startup timeout count */ +#define OSC_STARTUP_TIMEOUT ((uint32_t)0xFFFFFU) +#define LXTAL_STARTUP_TIMEOUT ((uint32_t)0x3FFFFFFU) + +/*! + \brief deinitialize the RCU + \param[in] none + \param[out] none + \retval none +*/ +void rcu_deinit(void) +{ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + rcu_osci_stab_wait(RCU_IRC8M); + + /* reset CFG0 register */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_CKOUT0SEL | RCU_CFG0_ADCPSC_2 | RCU_CFG0_PLLMF_4); + /* reset CTL register */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + RCU_CTL &= ~RCU_CTL_HXTALBPS; + RCU_CTL &= ~(RCU_CTL_PLL1EN | RCU_CTL_PLL2EN); + /* reset INT and CFG1 register */ + RCU_INT = 0x00ff0000U; + RCU_CFG1 &= ~(RCU_CFG1_PREDV0 | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PLL2MF | + RCU_CFG1_PREDV0SEL | RCU_CFG1_I2S1SEL | RCU_CFG1_I2S2SEL); +} + +/*! + \brief enable the peripherals clock + \param[in] periph: RCU peripherals, refer to rcu_periph_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOx (x=A,B,C,D,E): GPIO ports clock + \arg RCU_AF : alternate function clock + \arg RCU_CRC: CRC clock + \arg RCU_DMAx (x=0,1): DMA clock + \arg RCU_USBFS: USBFS clock + \arg RCU_EXMC: EXMC clock + \arg RCU_TIMERx (x=0,1,2,3,4,5,6): TIMER clock + \arg RCU_WWDGT: WWDGT clock + \arg RCU_SPIx (x=0,1,2): SPI clock + \arg RCU_USARTx (x=0,1,2): USART clock + \arg RCU_UARTx (x=3,4): UART clock + \arg RCU_I2Cx (x=0,1): I2C clock + \arg RCU_CANx (x=0,1): CAN clock + \arg RCU_PMU: PMU clock + \arg RCU_DAC: DAC clock + \arg RCU_RTC: RTC clock + \arg RCU_ADCx (x=0,1): ADC clock + \arg RCU_BKPI: BKP interface clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_enable(rcu_periph_enum periph) +{ + RCU_REG_VAL(periph) |= BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief disable the peripherals clock + \param[in] periph: RCU peripherals, refer to rcu_periph_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOx (x=A,B,C,D,E): GPIO ports clock + \arg RCU_AF: alternate function clock + \arg RCU_CRC: CRC clock + \arg RCU_DMAx (x=0,1): DMA clock + \arg RCU_USBFS: USBFS clock + \arg RCU_EXMC: EXMC clock + \arg RCU_TIMERx (x=0,1,2,3,4,5,6): TIMER clock + \arg RCU_WWDGT: WWDGT clock + \arg RCU_SPIx (x=0,1,2): SPI clock + \arg RCU_USARTx (x=0,1,2): USART clock + \arg RCU_UARTx (x=3,4): UART clock + \arg RCU_I2Cx (x=0,1): I2C clock + \arg RCU_CANx (x=0,1): CAN clock + \arg RCU_PMU: PMU clock + \arg RCU_DAC: DAC clock + \arg RCU_RTC: RTC clock + \arg RCU_ADCx (x=0,1): ADC clock + \arg RCU_BKPI: BKP interface clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_disable(rcu_periph_enum periph) +{ + RCU_REG_VAL(periph) &= ~BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief enable the peripherals clock when sleep mode + \param[in] periph: RCU peripherals, refer to rcu_periph_sleep_enum + only one parameter can be selected which is shown as below: + \arg RCU_FMC_SLP: FMC clock + \arg RCU_SRAM_SLP: SRAM clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_sleep_enable(rcu_periph_sleep_enum periph) +{ + RCU_REG_VAL(periph) |= BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief disable the peripherals clock when sleep mode + \param[in] periph: RCU peripherals, refer to rcu_periph_sleep_enum + only one parameter can be selected which is shown as below: + \arg RCU_FMC_SLP: FMC clock + \arg RCU_SRAM_SLP: SRAM clock + \param[out] none + \retval none +*/ +void rcu_periph_clock_sleep_disable(rcu_periph_sleep_enum periph) +{ + RCU_REG_VAL(periph) &= ~BIT(RCU_BIT_POS(periph)); +} + +/*! + \brief reset the peripherals + \param[in] periph_reset: RCU peripherals reset, refer to rcu_periph_reset_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOxRST (x=A,B,C,D,E): reset GPIO ports + \arg RCU_AFRST : reset alternate function clock + \arg RCU_USBFSRST: reset USBFS + \arg RCU_TIMERxRST (x=0,1,2,3,4,5,6): reset TIMER + \arg RCU_WWDGTRST: reset WWDGT + \arg RCU_SPIxRST (x=0,1,2): reset SPI + \arg RCU_USARTxRST (x=0,1,2): reset USART + \arg RCU_UARTxRST (x=3,4): reset UART + \arg RCU_I2CxRST (x=0,1): reset I2C + \arg RCU_CANxRST (x=0,1): reset CAN + \arg RCU_PMURST: reset PMU + \arg RCU_DACRST: reset DAC + \arg RCU_ADCxRST (x=0,1): reset ADC + \arg RCU_BKPIRST: reset BKPI + \param[out] none + \retval none +*/ +void rcu_periph_reset_enable(rcu_periph_reset_enum periph_reset) +{ + RCU_REG_VAL(periph_reset) |= BIT(RCU_BIT_POS(periph_reset)); +} + +/*! + \brief disable reset the peripheral + \param[in] periph_reset: RCU peripherals reset, refer to rcu_periph_reset_enum + only one parameter can be selected which is shown as below: + \arg RCU_GPIOxRST (x=A,B,C,D,E): reset GPIO ports + \arg RCU_AFRST : reset alternate function clock + \arg RCU_USBFSRST: reset USBFS + \arg RCU_TIMERxRST (x=0,1,2,3,4,5,6): reset TIMER + \arg RCU_WWDGTRST: reset WWDGT + \arg RCU_SPIxRST (x=0,1,2): reset SPI + \arg RCU_USARTxRST (x=0,1,2): reset USART + \arg RCU_UARTxRST (x=3,4): reset UART + \arg RCU_I2CxRST (x=0,1): reset I2C + \arg RCU_CANxRST (x=0,1): reset CAN + \arg RCU_PMURST: reset PMU + \arg RCU_DACRST: reset DAC + \arg RCU_ADCxRST (x=0,1): reset ADC + \arg RCU_BKPIRST: reset BKPI + \param[out] none + \retval none +*/ +void rcu_periph_reset_disable(rcu_periph_reset_enum periph_reset) +{ + RCU_REG_VAL(periph_reset) &= ~BIT(RCU_BIT_POS(periph_reset)); +} + +/*! + \brief reset the BKP domain + \param[in] none + \param[out] none + \retval none +*/ +void rcu_bkp_reset_enable(void) +{ + RCU_BDCTL |= RCU_BDCTL_BKPRST; +} + +/*! + \brief disable the BKP domain reset + \param[in] none + \param[out] none + \retval none +*/ +void rcu_bkp_reset_disable(void) +{ + RCU_BDCTL &= ~RCU_BDCTL_BKPRST; +} + +/*! + \brief configure the system clock source + \param[in] ck_sys: system clock source select + only one parameter can be selected which is shown as below: + \arg RCU_CKSYSSRC_IRC8M: select CK_IRC8M as the CK_SYS source + \arg RCU_CKSYSSRC_HXTAL: select CK_HXTAL as the CK_SYS source + \arg RCU_CKSYSSRC_PLL: select CK_PLL as the CK_SYS source + \param[out] none + \retval none +*/ +void rcu_system_clock_source_config(uint32_t ck_sys) +{ + uint32_t reg; + + reg = RCU_CFG0; + /* reset the SCS bits and set according to ck_sys */ + reg &= ~RCU_CFG0_SCS; + RCU_CFG0 = (reg | ck_sys); +} + +/*! + \brief get the system clock source + \param[in] none + \param[out] none + \retval which clock is selected as CK_SYS source + \arg RCU_SCSS_IRC8M: CK_IRC8M is selected as the CK_SYS source + \arg RCU_SCSS_HXTAL: CK_HXTAL is selected as the CK_SYS source + \arg RCU_SCSS_PLL: CK_PLL is selected as the CK_SYS source +*/ +uint32_t rcu_system_clock_source_get(void) +{ + return (RCU_CFG0 & RCU_CFG0_SCSS); +} + +/*! + \brief configure the AHB clock prescaler selection + \param[in] ck_ahb: AHB clock prescaler selection + only one parameter can be selected which is shown as below: + \arg RCU_AHB_CKSYS_DIVx, x=1, 2, 4, 8, 16, 64, 128, 256, 512 + \param[out] none + \retval none +*/ +void rcu_ahb_clock_config(uint32_t ck_ahb) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* reset the AHBPSC bits and set according to ck_ahb */ + reg &= ~RCU_CFG0_AHBPSC; + RCU_CFG0 = (reg | ck_ahb); +} + +/*! + \brief configure the APB1 clock prescaler selection + \param[in] ck_apb1: APB1 clock prescaler selection + only one parameter can be selected which is shown as below: + \arg RCU_APB1_CKAHB_DIV1: select CK_AHB as CK_APB1 + \arg RCU_APB1_CKAHB_DIV2: select CK_AHB/2 as CK_APB1 + \arg RCU_APB1_CKAHB_DIV4: select CK_AHB/4 as CK_APB1 + \arg RCU_APB1_CKAHB_DIV8: select CK_AHB/8 as CK_APB1 + \arg RCU_APB1_CKAHB_DIV16: select CK_AHB/16 as CK_APB1 + \param[out] none + \retval none +*/ +void rcu_apb1_clock_config(uint32_t ck_apb1) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* reset the APB1PSC and set according to ck_apb1 */ + reg &= ~RCU_CFG0_APB1PSC; + RCU_CFG0 = (reg | ck_apb1); +} + +/*! + \brief configure the APB2 clock prescaler selection + \param[in] ck_apb2: APB2 clock prescaler selection + only one parameter can be selected which is shown as below: + \arg RCU_APB2_CKAHB_DIV1: select CK_AHB as CK_APB2 + \arg RCU_APB2_CKAHB_DIV2: select CK_AHB/2 as CK_APB2 + \arg RCU_APB2_CKAHB_DIV4: select CK_AHB/4 as CK_APB2 + \arg RCU_APB2_CKAHB_DIV8: select CK_AHB/8 as CK_APB2 + \arg RCU_APB2_CKAHB_DIV16: select CK_AHB/16 as CK_APB2 + \param[out] none + \retval none +*/ +void rcu_apb2_clock_config(uint32_t ck_apb2) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* reset the APB2PSC and set according to ck_apb2 */ + reg &= ~RCU_CFG0_APB2PSC; + RCU_CFG0 = (reg | ck_apb2); +} + +/*! + \brief configure the CK_OUT0 clock source + \param[in] ckout0_src: CK_OUT0 clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_CKOUT0SRC_NONE: no clock selected + \arg RCU_CKOUT0SRC_CKSYS: system clock selected + \arg RCU_CKOUT0SRC_IRC8M: high speed 8M internal oscillator clock selected + \arg RCU_CKOUT0SRC_HXTAL: HXTAL selected + \arg RCU_CKOUT0SRC_CKPLL_DIV2: CK_PLL/2 selected + \arg RCU_CKOUT0SRC_CKPLL1: CK_PLL1 selected + \arg RCU_CKOUT0SRC_CKPLL2_DIV2: CK_PLL2/2 selected + \arg RCU_CKOUT0SRC_EXT1: EXT1 selected + \arg RCU_CKOUT0SRC_CKPLL2: PLL2 selected + \param[out] none + \retval none +*/ +void rcu_ckout0_config(uint32_t ckout0_src) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* reset the CKOUT0SRC, set according to ckout0_src */ + reg &= ~RCU_CFG0_CKOUT0SEL; + RCU_CFG0 = (reg | ckout0_src); +} + +/*! + \brief configure the main PLL clock + \param[in] pll_src: PLL clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_PLLSRC_IRC8M_DIV2: IRC8M/2 clock selected as source clock of PLL + \arg RCU_PLLSRC_HXTAL: HXTAL selected as source clock of PLL + \param[in] pll_mul: PLL clock multiplication factor + only one parameter can be selected which is shown as below: + \arg RCU_PLL_MULx (x = 2..14, 6.5, 16..32) + \param[out] none + \retval none +*/ +void rcu_pll_config(uint32_t pll_src, uint32_t pll_mul) +{ + uint32_t reg = 0U; + + reg = RCU_CFG0; + + /* PLL clock source and multiplication factor configuration */ + reg &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + reg |= (pll_src | pll_mul); + + RCU_CFG0 = reg; +} + +/*! + \brief configure the PREDV0 division factor and clock source + \param[in] predv0_source: PREDV0 input clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_PREDV0SRC_HXTAL: HXTAL selected as PREDV0 input source clock + \arg RCU_PREDV0SRC_CKPLL1: CK_PLL1 selected as PREDV0 input source clock + \param[in] predv0_div: PREDV0 division factor + only one parameter can be selected which is shown as below: + \arg RCU_PREDV0_DIVx, x = 1..16 + \param[out] none + \retval none +*/ +void rcu_predv0_config(uint32_t predv0_source, uint32_t predv0_div) +{ + uint32_t reg = 0U; + + reg = RCU_CFG1; + /* reset PREDV0SEL and PREDV0 bits */ + reg &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV0); + /* set the PREDV0SEL and PREDV0 division factor */ + reg |= (predv0_source | predv0_div); + + RCU_CFG1 = reg; +} + +/*! + \brief configure the PREDV1 division factor + \param[in] predv1_div: PREDV1 division factor + only one parameter can be selected which is shown as below: + \arg RCU_PREDV1_DIVx, x = 1..16 + \param[out] none + \retval none +*/ +void rcu_predv1_config(uint32_t predv1_div) +{ + uint32_t reg = 0U; + + reg = RCU_CFG1; + /* reset the PREDV1 bits */ + reg &= ~RCU_CFG1_PREDV1; + /* set the PREDV1 division factor */ + reg |= predv1_div; + + RCU_CFG1 = reg; +} + +/*! + \brief configure the PLL1 clock + \param[in] pll_mul: PLL clock multiplication factor + only one parameter can be selected which is shown as below: + \arg RCU_PLL1_MULx (x = 8..16, 20) + \param[out] none + \retval none +*/ +void rcu_pll1_config(uint32_t pll_mul) +{ + RCU_CFG1 &= ~RCU_CFG1_PLL1MF; + RCU_CFG1 |= pll_mul; +} + +/*! + \brief configure the PLL2 clock + \param[in] pll_mul: PLL clock multiplication factor + only one parameter can be selected which is shown as below: + \arg RCU_PLL2_MULx (x = 8..16, 20) + \param[out] none + \retval none +*/ +void rcu_pll2_config(uint32_t pll_mul) +{ + RCU_CFG1 &= ~RCU_CFG1_PLL2MF; + RCU_CFG1 |= pll_mul; +} + +/*! + \brief configure the ADC prescaler factor + \param[in] adc_psc: ADC prescaler factor + only one parameter can be selected which is shown as below: + \arg RCU_CKADC_CKAPB2_DIV2: ADC prescaler select CK_APB2/2 + \arg RCU_CKADC_CKAPB2_DIV4: ADC prescaler select CK_APB2/4 + \arg RCU_CKADC_CKAPB2_DIV6: ADC prescaler select CK_APB2/6 + \arg RCU_CKADC_CKAPB2_DIV8: ADC prescaler select CK_APB2/8 + \arg RCU_CKADC_CKAPB2_DIV12: ADC prescaler select CK_APB2/12 + \arg RCU_CKADC_CKAPB2_DIV16: ADC prescaler select CK_APB2/16 + \param[out] none + \retval none +*/ +void rcu_adc_clock_config(uint32_t adc_psc) +{ + uint32_t reg0; + + /* reset the ADCPSC bits */ + reg0 = RCU_CFG0; + reg0 &= ~(RCU_CFG0_ADCPSC_2 | RCU_CFG0_ADCPSC); + + /* set the ADC prescaler factor */ + switch(adc_psc){ + case RCU_CKADC_CKAPB2_DIV2: + case RCU_CKADC_CKAPB2_DIV4: + case RCU_CKADC_CKAPB2_DIV6: + case RCU_CKADC_CKAPB2_DIV8: + reg0 |= (adc_psc << 14); + break; + + case RCU_CKADC_CKAPB2_DIV12: + case RCU_CKADC_CKAPB2_DIV16: + adc_psc &= ~BIT(2); + reg0 |= (adc_psc << 14 | RCU_CFG0_ADCPSC_2); + break; + + default: + break; + } + + /* set the register */ + RCU_CFG0 = reg0; +} + +/*! + \brief configure the USBFS prescaler factor + \param[in] usb_psc: USB prescaler factor + only one parameter can be selected which is shown as below: + \arg RCU_CKUSB_CKPLL_DIV1_5: USBFS prescaler select CK_PLL/1.5 + \arg RCU_CKUSB_CKPLL_DIV1: USBFS prescaler select CK_PLL/1 + \arg RCU_CKUSB_CKPLL_DIV2_5: USBFS prescaler select CK_PLL/2.5 + \arg RCU_CKUSB_CKPLL_DIV2: USBFS prescaler select CK_PLL/2 + \param[out] none + \retval none +*/ +void rcu_usb_clock_config(uint32_t usb_psc) +{ + uint32_t reg; + + reg = RCU_CFG0; + + /* configure the USBFS prescaler factor */ + reg &= ~RCU_CFG0_USBFSPSC; + RCU_CFG0 = (reg | usb_psc); +} + +/*! + \brief configure the RTC clock source selection + \param[in] rtc_clock_source: RTC clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_RTCSRC_NONE: no clock selected + \arg RCU_RTCSRC_LXTAL: CK_LXTAL selected as RTC source clock + \arg RCU_RTCSRC_IRC40K: CK_IRC40K selected as RTC source clock + \arg RCU_RTCSRC_HXTAL_DIV_128: CK_HXTAL/128 selected as RTC source clock + \param[out] none + \retval none +*/ +void rcu_rtc_clock_config(uint32_t rtc_clock_source) +{ + uint32_t reg; + + reg = RCU_BDCTL; + /* reset the RTCSRC bits and set according to rtc_clock_source */ + reg &= ~RCU_BDCTL_RTCSRC; + RCU_BDCTL = (reg | rtc_clock_source); +} + +/*! + \brief configure the I2S1 clock source selection + \param[in] i2s_clock_source: I2S1 clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_I2S1SRC_CKSYS: System clock selected as I2S1 source clock + \arg RCU_I2S1SRC_CKPLL2_MUL2: CK_PLL2x2 selected as I2S1 source clock + \param[out] none + \retval none +*/ +void rcu_i2s1_clock_config(uint32_t i2s_clock_source) +{ + uint32_t reg; + + reg = RCU_CFG1; + /* reset the I2S1SEL bit and set according to i2s_clock_source */ + reg &= ~RCU_CFG1_I2S1SEL; + RCU_CFG1 = (reg | i2s_clock_source); +} + +/*! + \brief configure the I2S2 clock source selection + \param[in] i2s_clock_source: I2S2 clock source selection + only one parameter can be selected which is shown as below: + \arg RCU_I2S2SRC_CKSYS: system clock selected as I2S2 source clock + \arg RCU_I2S2SRC_CKPLL2_MUL2: CK_PLL2x2 selected as I2S2 source clock + \param[out] none + \retval none +*/ +void rcu_i2s2_clock_config(uint32_t i2s_clock_source) +{ + uint32_t reg; + + reg = RCU_CFG1; + /* reset the I2S2SEL bit and set according to i2s_clock_source */ + reg &= ~RCU_CFG1_I2S2SEL; + RCU_CFG1 = (reg | i2s_clock_source); +} + +/*! + \brief get the clock stabilization and periphral reset flags + \param[in] flag: the clock stabilization and periphral reset flags, refer to rcu_flag_enum + only one parameter can be selected which is shown as below: + \arg RCU_FLAG_IRC8MSTB: IRC8M stabilization flag + \arg RCU_FLAG_HXTALSTB: HXTAL stabilization flag + \arg RCU_FLAG_PLLSTB: PLL stabilization flag + \arg RCU_FLAG_PLL1STB: PLL1 stabilization flag + \arg RCU_FLAG_PLL2STB: PLL2 stabilization flag + \arg RCU_FLAG_LXTALSTB: LXTAL stabilization flag + \arg RCU_FLAG_IRC40KSTB: IRC40K stabilization flag + \arg RCU_FLAG_EPRST: external PIN reset flag + \arg RCU_FLAG_PORRST: power reset flag + \arg RCU_FLAG_SWRST: software reset flag + \arg RCU_FLAG_FWDGTRST: free watchdog timer reset flag + \arg RCU_FLAG_WWDGTRST: window watchdog timer reset flag + \arg RCU_FLAG_LPRST: low-power reset flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus rcu_flag_get(rcu_flag_enum flag) +{ + /* get the rcu flag */ + if(RESET != (RCU_REG_VAL(flag) & BIT(RCU_BIT_POS(flag)))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear all the reset flag + \param[in] none + \param[out] none + \retval none +*/ +void rcu_all_reset_flag_clear(void) +{ + RCU_RSTSCK |= RCU_RSTSCK_RSTFC; +} + +/*! + \brief get the clock stabilization interrupt and ckm flags + \param[in] int_flag: interrupt and ckm flags, refer to rcu_int_flag_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_FLAG_IRC40KSTB: IRC40K stabilization interrupt flag + \arg RCU_INT_FLAG_LXTALSTB: LXTAL stabilization interrupt flag + \arg RCU_INT_FLAG_IRC8MSTB: IRC8M stabilization interrupt flag + \arg RCU_INT_FLAG_HXTALSTB: HXTAL stabilization interrupt flag + \arg RCU_INT_FLAG_PLLSTB: PLL stabilization interrupt flag + \arg RCU_INT_FLAG_PLL1STB: PLL1 stabilization interrupt flag + \arg RCU_INT_FLAG_PLL2STB: PLL2 stabilization interrupt flag + \arg RCU_INT_FLAG_CKM: HXTAL clock stuck interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus rcu_interrupt_flag_get(rcu_int_flag_enum int_flag) +{ + /* get the rcu interrupt flag */ + if(RESET != (RCU_REG_VAL(int_flag) & BIT(RCU_BIT_POS(int_flag)))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear the interrupt flags + \param[in] int_flag_clear: clock stabilization and stuck interrupt flags clear, refer to rcu_int_flag_clear_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_FLAG_IRC40KSTB_CLR: IRC40K stabilization interrupt flag clear + \arg RCU_INT_FLAG_LXTALSTB_CLR: LXTAL stabilization interrupt flag clear + \arg RCU_INT_FLAG_IRC8MSTB_CLR: IRC8M stabilization interrupt flag clear + \arg RCU_INT_FLAG_HXTALSTB_CLR: HXTAL stabilization interrupt flag clear + \arg RCU_INT_FLAG_PLLSTB_CLR: PLL stabilization interrupt flag clear + \arg RCU_INT_FLAG_PLL1STB_CLR: PLL1 stabilization interrupt flag clear + \arg RCU_INT_FLAG_PLL2STB_CLR: PLL2 stabilization interrupt flag clear + \arg RCU_INT_FLAG_CKM_CLR: clock stuck interrupt flag clear + \param[out] none + \retval none +*/ +void rcu_interrupt_flag_clear(rcu_int_flag_clear_enum int_flag_clear) +{ + RCU_REG_VAL(int_flag_clear) |= BIT(RCU_BIT_POS(int_flag_clear)); +} + +/*! + \brief enable the stabilization interrupt + \param[in] stab_int: clock stabilization interrupt, refer to rcu_int_enum + Only one parameter can be selected which is shown as below: + \arg RCU_INT_IRC40KSTB: IRC40K stabilization interrupt enable + \arg RCU_INT_LXTALSTB: LXTAL stabilization interrupt enable + \arg RCU_INT_IRC8MSTB: IRC8M stabilization interrupt enable + \arg RCU_INT_HXTALSTB: HXTAL stabilization interrupt enable + \arg RCU_INT_PLLSTB: PLL stabilization interrupt enable + \arg RCU_INT_PLL1STB: PLL1 stabilization interrupt enable + \arg RCU_INT_PLL2STB: PLL2 stabilization interrupt enable + \param[out] none + \retval none +*/ +void rcu_interrupt_enable(rcu_int_enum stab_int) +{ + RCU_REG_VAL(stab_int) |= BIT(RCU_BIT_POS(stab_int)); +} + +/*! + \brief disable the stabilization interrupt + \param[in] stab_int: clock stabilization interrupt, refer to rcu_int_enum + only one parameter can be selected which is shown as below: + \arg RCU_INT_IRC40KSTB: IRC40K stabilization interrupt enable + \arg RCU_INT_LXTALSTB: LXTAL stabilization interrupt enable + \arg RCU_INT_IRC8MSTB: IRC8M stabilization interrupt enable + \arg RCU_INT_HXTALSTB: HXTAL stabilization interrupt enable + \arg RCU_INT_PLLSTB: PLL stabilization interrupt enable + \arg RCU_INT_PLL1STB: PLL1 stabilization interrupt enable + \arg RCU_INT_PLL2STB: PLL2 stabilization interrupt enable + \param[out] none + \retval none +*/ +void rcu_interrupt_disable(rcu_int_enum stab_int) +{ + RCU_REG_VAL(stab_int) &= ~BIT(RCU_BIT_POS(stab_int)); +} + +/*! + \brief wait for oscillator stabilization flags is SET or oscillator startup is timeout + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \arg RCU_IRC8M: internal 8M RC oscillators(IRC8M) + \arg RCU_IRC40K: internal 40K RC oscillator(IRC40K) + \arg RCU_PLL_CK: phase locked loop(PLL) + \arg RCU_PLL1_CK: phase locked loop 1 + \arg RCU_PLL2_CK: phase locked loop 2 + \param[out] none + \retval ErrStatus: SUCCESS or ERROR +*/ +ErrStatus rcu_osci_stab_wait(rcu_osci_type_enum osci) +{ + uint32_t stb_cnt = 0U; + ErrStatus reval = ERROR; + FlagStatus osci_stat = RESET; + + switch(osci){ + /* wait HXTAL stable */ + case RCU_HXTAL: + while((RESET == osci_stat) && (HXTAL_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_HXTALSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_HXTALSTB)){ + reval = SUCCESS; + } + break; + + /* wait LXTAL stable */ + case RCU_LXTAL: + while((RESET == osci_stat) && (LXTAL_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_LXTALSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_LXTALSTB)){ + reval = SUCCESS; + } + break; + + /* wait IRC8M stable */ + case RCU_IRC8M: + while((RESET == osci_stat) && (IRC8M_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_IRC8MSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_IRC8MSTB)){ + reval = SUCCESS; + } + break; + + /* wait IRC40K stable */ + case RCU_IRC40K: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_IRC40KSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_IRC40KSTB)){ + reval = SUCCESS; + } + break; + + /* wait PLL stable */ + case RCU_PLL_CK: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_PLLSTB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_PLLSTB)){ + reval = SUCCESS; + } + break; + /* wait PLL1 stable */ + case RCU_PLL1_CK: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_PLL1STB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_PLL1STB)){ + reval = SUCCESS; + } + break; + /* wait PLL2 stable */ + case RCU_PLL2_CK: + while((RESET == osci_stat) && (OSC_STARTUP_TIMEOUT != stb_cnt)){ + osci_stat = rcu_flag_get(RCU_FLAG_PLL2STB); + stb_cnt++; + } + + /* check whether flag is set or not */ + if(RESET != rcu_flag_get(RCU_FLAG_PLL2STB)){ + reval = SUCCESS; + } + break; + + default: + break; + } + + /* return value */ + return reval; +} + +/*! + \brief turn on the oscillator + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \arg RCU_IRC8M: internal 8M RC oscillators(IRC8M) + \arg RCU_IRC40K: internal 40K RC oscillator(IRC40K) + \arg RCU_PLL_CK: phase locked loop(PLL) + \arg RCU_PLL1_CK: phase locked loop 1 + \arg RCU_PLL2_CK: phase locked loop 2 + \param[out] none + \retval none +*/ +void rcu_osci_on(rcu_osci_type_enum osci) +{ + RCU_REG_VAL(osci) |= BIT(RCU_BIT_POS(osci)); +} + +/*! + \brief turn off the oscillator + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \arg RCU_IRC8M: internal 8M RC oscillators(IRC8M) + \arg RCU_IRC40K: internal 40K RC oscillator(IRC40K) + \arg RCU_PLL_CK: phase locked loop(PLL) + \arg RCU_PLL1_CK: phase locked loop 1 + \arg RCU_PLL2_CK: phase locked loop 2 + \param[out] none + \retval none +*/ +void rcu_osci_off(rcu_osci_type_enum osci) +{ + RCU_REG_VAL(osci) &= ~BIT(RCU_BIT_POS(osci)); +} + +/*! + \brief enable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \param[out] none + \retval none +*/ +void rcu_osci_bypass_mode_enable(rcu_osci_type_enum osci) +{ + uint32_t reg; + + switch(osci){ + /* enable HXTAL to bypass mode */ + case RCU_HXTAL: + reg = RCU_CTL; + RCU_CTL &= ~RCU_CTL_HXTALEN; + RCU_CTL = (reg | RCU_CTL_HXTALBPS); + break; + /* enable LXTAL to bypass mode */ + case RCU_LXTAL: + reg = RCU_BDCTL; + RCU_BDCTL &= ~RCU_BDCTL_LXTALEN; + RCU_BDCTL = (reg | RCU_BDCTL_LXTALBPS); + break; + case RCU_IRC8M: + case RCU_IRC40K: + case RCU_PLL_CK: + case RCU_PLL1_CK: + case RCU_PLL2_CK: + break; + default: + break; + } +} + +/*! + \brief disable the oscillator bypass mode, HXTALEN or LXTALEN must be reset before it + \param[in] osci: oscillator types, refer to rcu_osci_type_enum + only one parameter can be selected which is shown as below: + \arg RCU_HXTAL: high speed crystal oscillator(HXTAL) + \arg RCU_LXTAL: low speed crystal oscillator(LXTAL) + \param[out] none + \retval none +*/ +void rcu_osci_bypass_mode_disable(rcu_osci_type_enum osci) +{ + uint32_t reg; + + switch(osci){ + /* disable HXTAL to bypass mode */ + case RCU_HXTAL: + reg = RCU_CTL; + RCU_CTL &= ~RCU_CTL_HXTALEN; + RCU_CTL = (reg & ~RCU_CTL_HXTALBPS); + break; + /* disable LXTAL to bypass mode */ + case RCU_LXTAL: + reg = RCU_BDCTL; + RCU_BDCTL &= ~RCU_BDCTL_LXTALEN; + RCU_BDCTL = (reg & ~RCU_BDCTL_LXTALBPS); + break; + case RCU_IRC8M: + case RCU_IRC40K: + case RCU_PLL_CK: + case RCU_PLL1_CK: + case RCU_PLL2_CK: + break; + default: + break; + } +} + +/*! + \brief enable the HXTAL clock monitor + \param[in] none + \param[out] none + \retval none +*/ + +void rcu_hxtal_clock_monitor_enable(void) +{ + RCU_CTL |= RCU_CTL_CKMEN; +} + +/*! + \brief disable the HXTAL clock monitor + \param[in] none + \param[out] none + \retval none +*/ +void rcu_hxtal_clock_monitor_disable(void) +{ + RCU_CTL &= ~RCU_CTL_CKMEN; +} + +/*! + \brief set the IRC8M adjust value + \param[in] irc8m_adjval: IRC8M adjust value, must be between 0 and 0x1F + \param[out] none + \retval none +*/ +void rcu_irc8m_adjust_value_set(uint32_t irc8m_adjval) +{ + uint32_t reg; + + reg = RCU_CTL; + /* reset the IRC8MADJ bits and set according to irc8m_adjval */ + reg &= ~RCU_CTL_IRC8MADJ; + RCU_CTL = (reg | ((irc8m_adjval & 0x1FU) << 3)); +} + +/*! + \brief deep-sleep mode voltage select + \param[in] dsvol: deep sleep mode voltage + only one parameter can be selected which is shown as below: + \arg RCU_DEEPSLEEP_V_1_2: the core voltage is 1.2V + \arg RCU_DEEPSLEEP_V_1_1: the core voltage is 1.1V + \arg RCU_DEEPSLEEP_V_1_0: the core voltage is 1.0V + \arg RCU_DEEPSLEEP_V_0_9: the core voltage is 0.9V + \param[out] none + \retval none +*/ +void rcu_deepsleep_voltage_set(uint32_t dsvol) +{ + dsvol &= RCU_DSV_DSLPVS; + RCU_DSV = dsvol; +} + +/*! + \brief get the system clock, bus and peripheral clock frequency + \param[in] clock: the clock frequency which to get + only one parameter can be selected which is shown as below: + \arg CK_SYS: system clock frequency + \arg CK_AHB: AHB clock frequency + \arg CK_APB1: APB1 clock frequency + \arg CK_APB2: APB2 clock frequency + \param[out] none + \retval clock frequency of system, AHB, APB1, APB2 +*/ +uint32_t rcu_clock_freq_get(rcu_clock_freq_enum clock) +{ + uint32_t sws, ck_freq = 0U; + uint32_t cksys_freq, ahb_freq, apb1_freq, apb2_freq; + uint32_t pllsel, predv0sel, pllmf,ck_src, idx, clk_exp; + uint32_t predv0, predv1, pll1mf; + + /* exponent of AHB, APB1 and APB2 clock divider */ + uint8_t ahb_exp[16] = {0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 6, 7, 8, 9}; + uint8_t apb1_exp[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + uint8_t apb2_exp[8] = {0, 0, 0, 0, 1, 2, 3, 4}; + + sws = GET_BITS(RCU_CFG0, 2, 3); + switch(sws){ + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + cksys_freq = IRC8M_VALUE; + break; + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + cksys_freq = HXTAL_VALUE; + break; + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + if(RCU_PLLSRC_HXTAL == pllsel) { + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = (uint32_t)((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = (uint32_t)((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; + }else{ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE/2U; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + if(pllmf < 15U){ + pllmf += 2U; + }else{ + pllmf += 1U; + } + + cksys_freq = ck_src * pllmf; + + if(15U == pllmf){ + /* PLL source clock multiply by 6.5 */ + cksys_freq = ck_src * 6U + ck_src / 2U; + } + + break; + /* IRC8M is selected as CK_SYS */ + default: + cksys_freq = IRC8M_VALUE; + break; + } + + /* calculate AHB clock frequency */ + idx = GET_BITS(RCU_CFG0, 4, 7); + clk_exp = ahb_exp[idx]; + ahb_freq = cksys_freq >> clk_exp; + + /* calculate APB1 clock frequency */ + idx = GET_BITS(RCU_CFG0, 8, 10); + clk_exp = apb1_exp[idx]; + apb1_freq = ahb_freq >> clk_exp; + + /* calculate APB2 clock frequency */ + idx = GET_BITS(RCU_CFG0, 11, 13); + clk_exp = apb2_exp[idx]; + apb2_freq = ahb_freq >> clk_exp; + + /* return the clocks frequency */ + switch(clock){ + case CK_SYS: + ck_freq = cksys_freq; + break; + case CK_AHB: + ck_freq = ahb_freq; + break; + case CK_APB1: + ck_freq = apb1_freq; + break; + case CK_APB2: + ck_freq = apb2_freq; + break; + default: + break; + } + return ck_freq; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c new file mode 100644 index 0000000..6404809 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c @@ -0,0 +1,273 @@ +/*! + \file gd32vf103_rtc.c + \brief RTC driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_rtc.h" + +/* RTC register high / low bits mask */ +#define RTC_HIGH_BITS_MASK ((uint32_t)0x000F0000U) /* RTC high bits mask */ +#define RTC_LOW_BITS_MASK ((uint32_t)0x0000FFFFU) /* RTC low bits mask */ + +/* RTC register high bits offset */ +#define RTC_HIGH_BITS_OFFSET ((uint32_t)16U) + +/*! + \brief enter RTC configuration mode + \param[in] none + \param[out] none + \retval none +*/ +void rtc_configuration_mode_enter(void) +{ + RTC_CTL |= RTC_CTL_CMF; +} + +/*! + \brief exit RTC configuration mode + \param[in] none + \param[out] none + \retval none +*/ +void rtc_configuration_mode_exit(void) +{ + RTC_CTL &= ~RTC_CTL_CMF; +} + +/*! + \brief set RTC counter value + \param[in] cnt: RTC counter value + \param[out] none + \retval none +*/ +void rtc_counter_set(uint32_t cnt) +{ + rtc_configuration_mode_enter(); + /* set the RTC counter high bits */ + RTC_CNTH = (cnt >> RTC_HIGH_BITS_OFFSET); + /* set the RTC counter low bits */ + RTC_CNTL = (cnt & RTC_LOW_BITS_MASK); + rtc_configuration_mode_exit(); +} + +/*! + \brief set RTC prescaler value + \param[in] psc: RTC prescaler value + \param[out] none + \retval none +*/ +void rtc_prescaler_set(uint32_t psc) +{ + rtc_configuration_mode_enter(); + /* set the RTC prescaler high bits */ + RTC_PSCH = ((psc & RTC_HIGH_BITS_MASK) >> RTC_HIGH_BITS_OFFSET); + /* set the RTC prescaler low bits */ + RTC_PSCL = (psc & RTC_LOW_BITS_MASK); + rtc_configuration_mode_exit(); +} + +/*! + \brief wait RTC last write operation finished flag set + \param[in] none + \param[out] none + \retval none +*/ +void rtc_lwoff_wait(void) +{ + /* loop until LWOFF flag is set */ + while(RESET == (RTC_CTL & RTC_CTL_LWOFF)){ + } +} + +/*! + \brief wait RTC registers synchronized flag set + \param[in] none + \param[out] none + \retval none +*/ +void rtc_register_sync_wait(void) +{ + /* clear RSYNF flag */ + RTC_CTL &= ~RTC_CTL_RSYNF; + /* loop until RSYNF flag is set */ + while(RESET == (RTC_CTL & RTC_CTL_RSYNF)){ + } +} + +/*! + \brief set RTC alarm value + \param[in] alarm: RTC alarm value + \param[out] none + \retval none +*/ +void rtc_alarm_config(uint32_t alarm) +{ + rtc_configuration_mode_enter(); + /* set the alarm high bits */ + RTC_ALRMH = (alarm >> RTC_HIGH_BITS_OFFSET); + /* set the alarm low bits */ + RTC_ALRML = (alarm & RTC_LOW_BITS_MASK); + rtc_configuration_mode_exit(); +} + +/*! + \brief get RTC counter value + \param[in] none + \param[out] none + \retval RTC counter value +*/ +uint32_t rtc_counter_get(void) +{ + uint32_t temp = 0x0U; + + temp = RTC_CNTL; + temp |= (RTC_CNTH << RTC_HIGH_BITS_OFFSET); + return temp; +} + +/*! + \brief get RTC divider value + \param[in] none + \param[out] none + \retval RTC divider value +*/ +uint32_t rtc_divider_get(void) +{ + uint32_t temp = 0x00U; + + temp = ((RTC_DIVH & RTC_DIVH_DIV) << RTC_HIGH_BITS_OFFSET); + temp |= RTC_DIVL; + return temp; +} + +/*! + \brief get RTC flag status + \param[in] flag: specify which flag status to get + only one parameter can be selected which is shown as below: + \arg RTC_FLAG_SECOND: second interrupt flag + \arg RTC_FLAG_ALARM: alarm interrupt flag + \arg RTC_FLAG_OVERFLOW: overflow interrupt flag + \arg RTC_FLAG_RSYN: registers synchronized flag + \arg RTC_FLAG_LWOF: last write operation finished flag + \param[out] none + \retval SET or RESET +*/ +FlagStatus rtc_flag_get(uint32_t flag) +{ + if(RESET != (RTC_CTL & flag)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear RTC flag status + \param[in] flag: specify which flag status to clear + one or more parameters can be selected which are shown as below: + \arg RTC_FLAG_SECOND: second interrupt flag + \arg RTC_FLAG_ALARM: alarm interrupt flag + \arg RTC_FLAG_OVERFLOW: overflow interrupt flag + \arg RTC_FLAG_RSYN: registers synchronized flag + \param[out] none + \retval none +*/ +void rtc_flag_clear(uint32_t flag) +{ + /* clear RTC flag */ + RTC_CTL &= ~flag; +} + +/*! + \brief get RTC interrupt flag status + \param[in] flag: specify which flag status to get + only one parameter can be selected which is shown as below: + \arg RTC_INT_FLAG_SECOND: second interrupt flag + \arg RTC_INT_FLAG_ALARM: alarm interrupt flag + \arg RTC_INT_FLAG_OVERFLOW: overflow interrupt flag + \param[out] none + \retval SET or RESET +*/ +FlagStatus rtc_interrupt_flag_get(uint32_t flag) +{ + if(RESET != (RTC_CTL & flag)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear RTC interrupt flag status + \param[in] flag: specify which flag status to clear + one or more parameters can be selected which are shown as below: + \arg RTC_INT_FLAG_SECOND: second interrupt flag + \arg RTC_INT_FLAG_ALARM: alarm interrupt flag + \arg RTC_INT_FLAG_OVERFLOW: overflow interrupt flag + \param[out] none + \retval none +*/ +void rtc_interrupt_flag_clear(uint32_t flag) +{ + /* clear RTC interrupt flag */ + RTC_CTL &= ~flag; +} + +/*! + \brief enable RTC interrupt + \param[in] interrupt: specify which interrupt to enbale + one or more parameters can be selected which are shown as below: + \arg RTC_INT_SECOND: second interrupt + \arg RTC_INT_ALARM: alarm interrupt + \arg RTC_INT_OVERFLOW: overflow interrupt + \param[out] none + \retval none +*/ +void rtc_interrupt_enable(uint32_t interrupt) +{ + RTC_INTEN |= interrupt; +} + +/*! + \brief disable RTC interrupt + \param[in] interrupt: specify which interrupt to disbale + one or more parameters can be selected which are shown as below: + \arg RTC_INT_SECOND: second interrupt + \arg RTC_INT_ALARM: alarm interrupt + \arg RTC_INT_OVERFLOW: overflow interrupt + \param[out] none + \retval none +*/ +void rtc_interrupt_disable(uint32_t interrupt) +{ + RTC_INTEN &= ~interrupt; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c new file mode 100644 index 0000000..1c8b434 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c @@ -0,0 +1,766 @@ +/*! + \file gd32vf103_spi.c + \brief SPI driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_spi.h" + +/* SPI/I2S parameter initialization mask */ +#define SPI_INIT_MASK ((uint32_t)0x00003040U) /*!< SPI parameter initialization mask */ +#define I2S_INIT_MASK ((uint32_t)0x0000F047U) /*!< I2S parameter initialization mask */ + +/* I2S clock source selection, multiplication and division mask */ +#define I2S1_CLOCK_SEL ((uint32_t)0x00020000U) /* I2S1 clock source selection */ +#define I2S2_CLOCK_SEL ((uint32_t)0x00040000U) /* I2S2 clock source selection */ +#define I2S_CLOCK_MUL_MASK ((uint32_t)0x0000F000U) /* I2S clock multiplication mask */ +#define I2S_CLOCK_DIV_MASK ((uint32_t)0x000000F0U) /* I2S clock division mask */ + +/* default value and offset */ +#define SPI_I2SPSC_DEFAULT_VALUE ((uint32_t)0x00000002U) /* default value of SPI_I2SPSC register */ +#define RCU_CFG1_PREDV1_OFFSET 4U /* PREDV1 offset in RCU_CFG1 */ +#define RCU_CFG1_PLL2MF_OFFSET 12U /* PLL2MF offset in RCU_CFG1 */ + +/*! + \brief reset SPI and I2S + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_i2s_deinit(uint32_t spi_periph) +{ + switch(spi_periph){ + case SPI0: + /* reset SPI0 */ + rcu_periph_reset_enable(RCU_SPI0RST); + rcu_periph_reset_disable(RCU_SPI0RST); + break; + case SPI1: + /* reset SPI1 and I2S1 */ + rcu_periph_reset_enable(RCU_SPI1RST); + rcu_periph_reset_disable(RCU_SPI1RST); + break; + case SPI2: + /* reset SPI2 and I2S2 */ + rcu_periph_reset_enable(RCU_SPI2RST); + rcu_periph_reset_disable(RCU_SPI2RST); + break; + default : + break; + } +} + +/*! + \brief initialize the parameters of SPI struct with the default values + \param[in] spi_struct: SPI parameter stuct + \param[out] none + \retval none +*/ +void spi_struct_para_init(spi_parameter_struct* spi_struct) +{ + /* set the SPI struct with the default values */ + spi_struct->device_mode = SPI_SLAVE; + spi_struct->trans_mode = SPI_TRANSMODE_FULLDUPLEX; + spi_struct->frame_size = SPI_FRAMESIZE_8BIT; + spi_struct->nss = SPI_NSS_HARD; + spi_struct->clock_polarity_phase = SPI_CK_PL_LOW_PH_1EDGE; + spi_struct->prescale = SPI_PSC_2; +} + +/*! + \brief initialize SPI parameter + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] spi_struct: SPI parameter initialization stuct members of the structure + and the member values are shown as below: + device_mode: SPI_MASTER, SPI_SLAVE + trans_mode: SPI_TRANSMODE_FULLDUPLEX, SPI_TRANSMODE_RECEIVEONLY, + SPI_TRANSMODE_BDRECEIVE, SPI_TRANSMODE_BDTRANSMIT + frame_size: SPI_FRAMESIZE_16BIT, SPI_FRAMESIZE_8BIT + nss: SPI_NSS_SOFT, SPI_NSS_HARD + endian: SPI_ENDIAN_MSB, SPI_ENDIAN_LSB + clock_polarity_phase: SPI_CK_PL_LOW_PH_1EDGE, SPI_CK_PL_HIGH_PH_1EDGE + SPI_CK_PL_LOW_PH_2EDGE, SPI_CK_PL_HIGH_PH_2EDGE + prescale: SPI_PSC_n (n=2,4,8,16,32,64,128,256) + \param[out] none + \retval none +*/ +void spi_init(uint32_t spi_periph, spi_parameter_struct* spi_struct) +{ + uint32_t reg = 0U; + reg = SPI_CTL0(spi_periph); + reg &= SPI_INIT_MASK; + + /* select SPI as master or slave */ + reg |= spi_struct->device_mode; + /* select SPI transfer mode */ + reg |= spi_struct->trans_mode; + /* select SPI frame size */ + reg |= spi_struct->frame_size; + /* select SPI NSS use hardware or software */ + reg |= spi_struct->nss; + /* select SPI LSB or MSB */ + reg |= spi_struct->endian; + /* select SPI polarity and phase */ + reg |= spi_struct->clock_polarity_phase; + /* select SPI prescale to adjust transmit speed */ + reg |= spi_struct->prescale; + + /* write to SPI_CTL0 register */ + SPI_CTL0(spi_periph) = (uint32_t)reg; + + SPI_I2SCTL(spi_periph) &= (uint32_t)(~SPI_I2SCTL_I2SSEL); +} + +/*! + \brief enable SPI + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_enable(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_SPIEN; +} + +/*! + \brief disable SPI + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_disable(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_SPIEN); +} + +/*! + \brief initialize I2S parameter + \param[in] spi_periph: SPIx(x=1,2) + \param[in] mode: I2S operation mode + only one parameter can be selected which is shown as below: + \arg I2S_MODE_SLAVETX: I2S slave transmit mode + \arg I2S_MODE_SLAVERX: I2S slave receive mode + \arg I2S_MODE_MASTERTX: I2S master transmit mode + \arg I2S_MODE_MASTERRX: I2S master receive mode + \param[in] standard: I2S standard + only one parameter can be selected which is shown as below: + \arg I2S_STD_PHILLIPS: I2S phillips standard + \arg I2S_STD_MSB: I2S MSB standard + \arg I2S_STD_LSB: I2S LSB standard + \arg I2S_STD_PCMSHORT: I2S PCM short standard + \arg I2S_STD_PCMLONG: I2S PCM long standard + \param[in] ckpl: I2S idle state clock polarity + only one parameter can be selected which is shown as below: + \arg I2S_CKPL_LOW: I2S clock polarity low level + \arg I2S_CKPL_HIGH: I2S clock polarity high level + \param[out] none + \retval none +*/ +void i2s_init(uint32_t spi_periph, uint32_t mode, uint32_t standard, uint32_t ckpl) +{ + uint32_t reg = 0U; + reg = SPI_I2SCTL(spi_periph); + reg &= I2S_INIT_MASK; + + /* enable I2S mode */ + reg |= (uint32_t)SPI_I2SCTL_I2SSEL; + /* select I2S mode */ + reg |= (uint32_t)mode; + /* select I2S standard */ + reg |= (uint32_t)standard; + /* select I2S polarity */ + reg |= (uint32_t)ckpl; + + /* write to SPI_I2SCTL register */ + SPI_I2SCTL(spi_periph) = (uint32_t)reg; +} + +/*! + \brief configure I2S prescaler + \param[in] spi_periph: SPIx(x=1,2) + \param[in] audiosample: I2S audio sample rate + only one parameter can be selected which is shown as below: + \arg I2S_AUDIOSAMPLE_8K: audio sample rate is 8KHz + \arg I2S_AUDIOSAMPLE_11K: audio sample rate is 11KHz + \arg I2S_AUDIOSAMPLE_16K: audio sample rate is 16KHz + \arg I2S_AUDIOSAMPLE_22K: audio sample rate is 22KHz + \arg I2S_AUDIOSAMPLE_32K: audio sample rate is 32KHz + \arg I2S_AUDIOSAMPLE_44K: audio sample rate is 44KHz + \arg I2S_AUDIOSAMPLE_48K: audio sample rate is 48KHz + \arg I2S_AUDIOSAMPLE_96K: audio sample rate is 96KHz + \arg I2S_AUDIOSAMPLE_192K: audio sample rate is 192KHz + \param[in] frameformat: I2S data length and channel length + only one parameter can be selected which is shown as below: + \arg I2S_FRAMEFORMAT_DT16B_CH16B: I2S data length is 16 bit and channel length is 16 bit + \arg I2S_FRAMEFORMAT_DT16B_CH32B: I2S data length is 16 bit and channel length is 32 bit + \arg I2S_FRAMEFORMAT_DT24B_CH32B: I2S data length is 24 bit and channel length is 32 bit + \arg I2S_FRAMEFORMAT_DT32B_CH32B: I2S data length is 32 bit and channel length is 32 bit + \param[in] mckout: I2S master clock output + only one parameter can be selected which is shown as below: + \arg I2S_MCKOUT_ENABLE: I2S master clock output enable + \arg I2S_MCKOUT_DISABLE: I2S master clock output disable + \param[out] none + \retval none +*/ +void i2s_psc_config(uint32_t spi_periph, uint32_t audiosample, uint32_t frameformat, uint32_t mckout) +{ + uint32_t i2sdiv = 2U, i2sof = 0U; + uint32_t clks = 0U; + uint32_t i2sclock = 0U; + + /* deinit SPI_I2SPSC register */ + SPI_I2SPSC(spi_periph) = SPI_I2SPSC_DEFAULT_VALUE; + + /* get the I2S clock source */ + if(SPI1 == ((uint32_t)spi_periph)){ + /* I2S1 clock source selection */ + clks = I2S1_CLOCK_SEL; + }else{ + /* I2S2 clock source selection */ + clks = I2S2_CLOCK_SEL; + } + + if(0U != (RCU_CFG1 & clks)){ + /* get RCU PLL2 clock multiplication factor */ + clks = (uint32_t)((RCU_CFG1 & I2S_CLOCK_MUL_MASK) >> RCU_CFG1_PLL2MF_OFFSET); + + if((clks > 5U) && (clks < 15U)){ + /* multiplier is between 8 and 16 */ + clks += 2U; + }else{ + if(15U == clks){ + /* multiplier is 20 */ + clks = 20U; + } + } + + /* get the PREDV1 value */ + i2sclock = (uint32_t)(((RCU_CFG1 & I2S_CLOCK_DIV_MASK) >> RCU_CFG1_PREDV1_OFFSET) + 1U); + /* calculate I2S clock based on PLL2 and PREDV1 */ + i2sclock = (uint32_t)((HXTAL_VALUE / i2sclock) * clks * 2U); + }else{ + /* get system clock */ + i2sclock = rcu_clock_freq_get(CK_SYS); + } + + /* config the prescaler depending on the mclk output state, the frame format and audio sample rate */ + if(I2S_MCKOUT_ENABLE == mckout){ + clks = (uint32_t)(((i2sclock / 256U) * 10U) / audiosample); + }else{ + if(I2S_FRAMEFORMAT_DT16B_CH16B == frameformat){ + clks = (uint32_t)(((i2sclock / 32U) *10U ) / audiosample); + }else{ + clks = (uint32_t)(((i2sclock / 64U) *10U ) / audiosample); + } + } + + /* remove the floating point */ + clks = (clks + 5U) / 10U; + i2sof = (clks & 0x00000001U); + i2sdiv = ((clks - i2sof) / 2U); + i2sof = (i2sof << 8U); + + /* set the default values */ + if((i2sdiv < 2U) || (i2sdiv > 255U)){ + i2sdiv = 2U; + i2sof = 0U; + } + /* configure SPI_I2SPSC */ + SPI_I2SPSC(spi_periph) = (uint32_t)(i2sdiv | i2sof | mckout); + + /* clear SPI_I2SCTL_DTLEN and SPI_I2SCTL_CHLEN bits */ + SPI_I2SCTL(spi_periph) &= (uint32_t)(~(SPI_I2SCTL_DTLEN | SPI_I2SCTL_CHLEN)); + /* configure data frame format */ + SPI_I2SCTL(spi_periph) |= (uint32_t)frameformat; +} + +/*! + \brief enable I2S + \param[in] spi_periph: SPIx(x=1,2) + \param[out] none + \retval none +*/ +void i2s_enable(uint32_t spi_periph) +{ + SPI_I2SCTL(spi_periph) |= (uint32_t)SPI_I2SCTL_I2SEN; +} + +/*! + \brief disable I2S + \param[in] spi_periph: SPIx(x=1,2) + \param[out] none + \retval none +*/ +void i2s_disable(uint32_t spi_periph) +{ + SPI_I2SCTL(spi_periph) &= (uint32_t)(~SPI_I2SCTL_I2SEN); +} + +/*! + \brief enable SPI NSS output + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_nss_output_enable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_NSSDRV; +} + +/*! + \brief disable SPI NSS output + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_nss_output_disable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_NSSDRV); +} + +/*! + \brief SPI NSS pin high level in software mode + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_nss_internal_high(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_SWNSS; +} + +/*! + \brief SPI NSS pin low level in software mode + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_nss_internal_low(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_SWNSS); +} + +/*! + \brief enable SPI DMA send or receive + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] dma: SPI DMA mode + only one parameter can be selected which is shown as below: + \arg SPI_DMA_TRANSMIT: SPI transmit data using DMA + \arg SPI_DMA_RECEIVE: SPI receive data using DMA + \param[out] none + \retval none +*/ +void spi_dma_enable(uint32_t spi_periph, uint8_t dma) +{ + if(SPI_DMA_TRANSMIT == dma){ + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_DMATEN; + }else{ + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_DMAREN; + } +} + +/*! + \brief disable SPI DMA send or receive + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] dma: SPI DMA mode + only one parameter can be selected which is shown as below: + \arg SPI_DMA_TRANSMIT: SPI transmit data using DMA + \arg SPI_DMA_RECEIVE: SPI receive data using DMA + \param[out] none + \retval none +*/ +void spi_dma_disable(uint32_t spi_periph, uint8_t dma) +{ + if(SPI_DMA_TRANSMIT == dma){ + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_DMATEN); + }else{ + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_DMAREN); + } +} + +/*! + \brief configure SPI/I2S data frame format + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] frame_format: SPI frame size + only one parameter can be selected which is shown as below: + \arg SPI_FRAMESIZE_16BIT: SPI frame size is 16 bits + \arg SPI_FRAMESIZE_8BIT: SPI frame size is 8 bits + \param[out] none + \retval none +*/ +void spi_i2s_data_frame_format_config(uint32_t spi_periph, uint16_t frame_format) +{ + /* clear SPI_CTL0_FF16 bit */ + SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_FF16); + /* configure SPI_CTL0_FF16 bit */ + SPI_CTL0(spi_periph) |= (uint32_t)frame_format; +} + +/*! + \brief SPI transmit data + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] data: 16-bit data + \param[out] none + \retval none +*/ +void spi_i2s_data_transmit(uint32_t spi_periph, uint16_t data) +{ + SPI_DATA(spi_periph) = (uint32_t)data; +} + +/*! + \brief SPI receive data + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval 16-bit data +*/ +uint16_t spi_i2s_data_receive(uint32_t spi_periph) +{ + return ((uint16_t)SPI_DATA(spi_periph)); +} + +/*! + \brief configure SPI bidirectional transfer direction + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] transfer_direction: SPI transfer direction + only one parameter can be selected which is shown as below: + \arg SPI_BIDIRECTIONAL_TRANSMIT: SPI work in transmit-only mode + \arg SPI_BIDIRECTIONAL_RECEIVE: SPI work in receive-only mode + \param[out] none + \retval none +*/ +void spi_bidirectional_transfer_config(uint32_t spi_periph, uint32_t transfer_direction) +{ + if(SPI_BIDIRECTIONAL_TRANSMIT == transfer_direction){ + /* set the transmit-only mode */ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_BIDIRECTIONAL_TRANSMIT; + }else{ + /* set the receive-only mode */ + SPI_CTL0(spi_periph) &= SPI_BIDIRECTIONAL_RECEIVE; + } +} + +/*! + \brief set SPI CRC polynomial + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] crc_poly: CRC polynomial value + \param[out] none + \retval none +*/ +void spi_crc_polynomial_set(uint32_t spi_periph,uint16_t crc_poly) +{ + /* enable SPI CRC */ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_CRCEN; + + /* set SPI CRC polynomial */ + SPI_CRCPOLY(spi_periph) = (uint32_t)crc_poly; +} + +/*! + \brief get SPI CRC polynomial + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval 16-bit CRC polynomial +*/ +uint16_t spi_crc_polynomial_get(uint32_t spi_periph) +{ + return ((uint16_t)SPI_CRCPOLY(spi_periph)); +} + +/*! + \brief turn on CRC function + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_crc_on(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_CRCEN; +} + +/*! + \brief turn off CRC function + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_crc_off(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) &= (uint32_t)(~SPI_CTL0_CRCEN); +} + +/*! + \brief SPI next data is CRC value + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_crc_next(uint32_t spi_periph) +{ + SPI_CTL0(spi_periph) |= (uint32_t)SPI_CTL0_CRCNT; +} + +/*! + \brief get SPI CRC send value or receive value + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] crc: SPI crc value + only one parameter can be selected which is shown as below: + \arg SPI_CRC_TX: get transmit crc value + \arg SPI_CRC_RX: get receive crc value + \param[out] none + \retval 16-bit CRC value +*/ +uint16_t spi_crc_get(uint32_t spi_periph,uint8_t crc) +{ + if(SPI_CRC_TX == crc){ + return ((uint16_t)(SPI_TCRC(spi_periph))); + }else{ + return ((uint16_t)(SPI_RCRC(spi_periph))); + } +} + +/*! + \brief enable SPI TI mode + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_ti_mode_enable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_TMOD; +} + +/*! + \brief disable SPI TI mode + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_ti_mode_disable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_TMOD); +} + +/*! + \brief enable SPI NSS pulse mode + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_nssp_mode_enable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_NSSP; +} + +/*! + \brief disable SPI NSS pulse mode + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_nssp_mode_disable(uint32_t spi_periph) +{ + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_NSSP); +} + + +/*! + \brief enable SPI and I2S interrupt + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] interrupt: SPI/I2S interrupt + only one parameter can be selected which is shown as below: + \arg SPI_I2S_INT_TBE: transmit buffer empty interrupt + \arg SPI_I2S_INT_RBNE: receive buffer not empty interrupt + \arg SPI_I2S_INT_ERR: CRC error,configuration error,reception overrun error, + transmission underrun error and format error interrupt + \param[out] none + \retval none +*/ +void spi_i2s_interrupt_enable(uint32_t spi_periph, uint8_t interrupt) +{ + switch(interrupt){ + /* SPI/I2S transmit buffer empty interrupt */ + case SPI_I2S_INT_TBE: + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_TBEIE; + break; + /* SPI/I2S receive buffer not empty interrupt */ + case SPI_I2S_INT_RBNE: + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_RBNEIE; + break; + /* SPI/I2S error */ + case SPI_I2S_INT_ERR: + SPI_CTL1(spi_periph) |= (uint32_t)SPI_CTL1_ERRIE; + break; + default: + break; + } +} + +/*! + \brief disable SPI and I2S interrupt + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] interrupt: SPI/I2S interrupt + only one parameter can be selected which is shown as below: + \arg SPI_I2S_INT_TBE: transmit buffer empty interrupt + \arg SPI_I2S_INT_RBNE: receive buffer not empty interrupt + \arg SPI_I2S_INT_ERR: CRC error,configuration error,reception overrun error, + transmission underrun error and format error interrupt + \param[out] none + \retval none +*/ +void spi_i2s_interrupt_disable(uint32_t spi_periph, uint8_t interrupt) +{ + switch(interrupt){ + /* SPI/I2S transmit buffer empty interrupt */ + case SPI_I2S_INT_TBE: + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_TBEIE); + break; + /* SPI/I2S receive buffer not empty interrupt */ + case SPI_I2S_INT_RBNE: + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_RBNEIE); + break; + /* SPI/I2S error */ + case SPI_I2S_INT_ERR: + SPI_CTL1(spi_periph) &= (uint32_t)(~SPI_CTL1_ERRIE); + break; + default: + break; + } +} + +/*! + \brief get SPI and I2S interrupt flag status + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] interrupt: SPI/I2S interrupt flag status + only one parameter can be selected which is shown as below: + \arg SPI_I2S_INT_FLAG_TBE: transmit buffer empty interrupt flag + \arg SPI_I2S_INT_FLAG_RBNE: receive buffer not empty interrupt flag + \arg SPI_I2S_INT_FLAG_RXORERR: overrun interrupt flag + \arg SPI_INT_FLAG_CONFERR: config error interrupt flag + \arg SPI_INT_FLAG_CRCERR: CRC error interrupt flag + \arg I2S_INT_FLAG_TXURERR: underrun error interrupt flag + \arg SPI_I2S_INT_FLAG_FERR: format error interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus spi_i2s_interrupt_flag_get(uint32_t spi_periph, uint8_t interrupt) +{ + uint32_t reg1 = SPI_STAT(spi_periph); + uint32_t reg2 = SPI_CTL1(spi_periph); + + switch(interrupt){ + /* SPI/I2S transmit buffer empty interrupt */ + case SPI_I2S_INT_FLAG_TBE: + reg1 = reg1 & SPI_STAT_TBE; + reg2 = reg2 & SPI_CTL1_TBEIE; + break; + /* SPI/I2S receive buffer not empty interrupt */ + case SPI_I2S_INT_FLAG_RBNE: + reg1 = reg1 & SPI_STAT_RBNE; + reg2 = reg2 & SPI_CTL1_RBNEIE; + break; + /* SPI/I2S overrun interrupt */ + case SPI_I2S_INT_FLAG_RXORERR: + reg1 = reg1 & SPI_STAT_RXORERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + /* SPI config error interrupt */ + case SPI_INT_FLAG_CONFERR: + reg1 = reg1 & SPI_STAT_CONFERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + /* SPI CRC error interrupt */ + case SPI_INT_FLAG_CRCERR: + reg1 = reg1 & SPI_STAT_CRCERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + /* I2S underrun error interrupt */ + case I2S_INT_FLAG_TXURERR: + reg1 = reg1 & SPI_STAT_TXURERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + /* SPI/I2S format error interrupt */ + case SPI_I2S_INT_FLAG_FERR: + reg1 = reg1 & SPI_STAT_FERR; + reg2 = reg2 & SPI_CTL1_ERRIE; + break; + default: + break; + } + /* get SPI/I2S interrupt flag status */ + if((0U != reg1) && (0U != reg2)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief get SPI and I2S flag status + \param[in] spi_periph: SPIx(x=0,1,2) + \param[in] flag: SPI/I2S flag status + one or more parameters can be selected which are shown as below: + \arg SPI_FLAG_TBE: transmit buffer empty flag + \arg SPI_FLAG_RBNE: receive buffer not empty flag + \arg SPI_FLAG_TRANS: transmit on-going flag + \arg SPI_FLAG_RXORERR: receive overrun error flag + \arg SPI_FLAG_CONFERR: mode config error flag + \arg SPI_FLAG_CRCERR: CRC error flag + \arg SPI_FLAG_FERR: format error interrupt flag + \arg I2S_FLAG_TBE: transmit buffer empty flag + \arg I2S_FLAG_RBNE: receive buffer not empty flag + \arg I2S_FLAG_TRANS: transmit on-going flag + \arg I2S_FLAG_RXORERR: overrun error flag + \arg I2S_FLAG_TXURERR: underrun error flag + \arg I2S_FLAG_CH: channel side flag + \arg I2S_FLAG_FERR: format error interrupt flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus spi_i2s_flag_get(uint32_t spi_periph, uint32_t flag) +{ + if(RESET != (SPI_STAT(spi_periph) & flag)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear SPI CRC error flag status + \param[in] spi_periph: SPIx(x=0,1,2) + \param[out] none + \retval none +*/ +void spi_crc_error_clear(uint32_t spi_periph) +{ + SPI_STAT(spi_periph) &= (uint32_t)(~SPI_FLAG_CRCERR); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c new file mode 100644 index 0000000..fe0d991 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c @@ -0,0 +1,1966 @@ +/*! + \file gd32vf103_timer.c + \brief TIMER driver + + \version 2019-06-05, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ +#include "gd32vf103_timer.h" + +/* TIMER init parameter mask */ +#define ALIGNEDMODE_MASK ((uint32_t)0x00000060U) /*!< TIMER init parameter aligne dmode mask */ +#define COUNTERDIRECTION_MASK ((uint32_t)0x00000010U) /*!< TIMER init parameter counter direction mask */ +#define CLOCKDIVISION_MASK ((uint32_t)0x00000300U) /*!< TIMER init parameter clock division value mask */ + +/*! + \brief deinit a timer + \param[in] timer_periph: TIMERx(x=0..6) + \param[out] none + \retval none +*/ +void timer_deinit(uint32_t timer_periph) +{ + switch(timer_periph){ + case TIMER0: + /* reset TIMER0 */ + rcu_periph_reset_enable(RCU_TIMER0RST); + rcu_periph_reset_disable(RCU_TIMER0RST); + break; + case TIMER1: + /* reset TIMER1 */ + rcu_periph_reset_enable(RCU_TIMER1RST); + rcu_periph_reset_disable(RCU_TIMER1RST); + break; + case TIMER2: + /* reset TIMER2 */ + rcu_periph_reset_enable(RCU_TIMER2RST); + rcu_periph_reset_disable(RCU_TIMER2RST); + break; + case TIMER3: + /* reset TIMER3 */ + rcu_periph_reset_enable(RCU_TIMER3RST); + rcu_periph_reset_disable(RCU_TIMER3RST); + break; + case TIMER4: + /* reset TIMER4 */ + rcu_periph_reset_enable(RCU_TIMER4RST); + rcu_periph_reset_disable(RCU_TIMER4RST); + break; + case TIMER5: + /* reset TIMER5 */ + rcu_periph_reset_enable(RCU_TIMER5RST); + rcu_periph_reset_disable(RCU_TIMER5RST); + break; + case TIMER6: + /* reset TIMER6 */ + rcu_periph_reset_enable(RCU_TIMER6RST); + rcu_periph_reset_disable(RCU_TIMER6RST); + break; + + default: + break; + } +} + +/*! + \brief initialize TIMER init parameter struct with a default value + \param[in] initpara: init parameter struct + \param[out] none + \retval none +*/ +void timer_struct_para_init(timer_parameter_struct* initpara) +{ + /* initialize the init parameter struct member with the default value */ + initpara->prescaler = 0U; + initpara->alignedmode = TIMER_COUNTER_EDGE; + initpara->counterdirection = TIMER_COUNTER_UP; + initpara->period = 65535U; + initpara->clockdivision = TIMER_CKDIV_DIV1; + initpara->repetitioncounter = 0U; +} + +/*! + \brief initialize TIMER counter + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] initpara: init parameter struct + prescaler: prescaler value of the counter clock, 0~65535 + alignedmode: TIMER_COUNTER_EDGE, TIMER_COUNTER_CENTER_DOWN, TIMER_COUNTER_CENTER_UP, + TIMER_COUNTER_CENTER_BOTH + counterdirection: TIMER_COUNTER_UP, TIMER_COUNTER_DOWN + period: counter auto reload value, 0~65535 + clockdivision: TIMER_CKDIV_DIV1, TIMER_CKDIV_DIV2, TIMER_CKDIV_DIV4 + repetitioncounter: counter repetition value, 0~255 + \param[out] none + \retval none +*/ +void timer_init(uint32_t timer_periph, timer_parameter_struct* initpara) +{ + /* configure the counter prescaler value */ + TIMER_PSC(timer_periph) = (uint16_t)initpara->prescaler; + + /* configure the counter direction and aligned mode */ + if((TIMER0 == timer_periph) || (TIMER1 == timer_periph) || (TIMER2 == timer_periph) + || (TIMER3 == timer_periph) || (TIMER4 == timer_periph) ){ + TIMER_CTL0(timer_periph) &= (~(uint32_t)(TIMER_CTL0_DIR | TIMER_CTL0_CAM)); + TIMER_CTL0(timer_periph) |= (uint32_t)(initpara->alignedmode & ALIGNEDMODE_MASK); + TIMER_CTL0(timer_periph) |= (uint32_t)(initpara->counterdirection & COUNTERDIRECTION_MASK); + }else{ + TIMER_CTL0(timer_periph) &= (uint32_t)(~ TIMER_CTL0_DIR); + TIMER_CTL0(timer_periph) |= (uint32_t)(initpara->counterdirection & COUNTERDIRECTION_MASK); + } + + /* configure the autoreload value */ + TIMER_CAR(timer_periph) = (uint32_t)initpara->period; + + if((TIMER5 != timer_periph) && (TIMER6 != timer_periph)){ + /* reset the CKDIV bit */ + TIMER_CTL0(timer_periph) &= (~(uint32_t)TIMER_CTL0_CKDIV); + TIMER_CTL0(timer_periph) |= (uint32_t)(initpara->clockdivision & CLOCKDIVISION_MASK); + } + + if (TIMER0 == timer_periph) { + /* configure the repetition counter value */ + TIMER_CREP(timer_periph) = (uint32_t)initpara->repetitioncounter; + } + + /* generate an update event */ + TIMER_SWEVG(timer_periph) |= (uint32_t)TIMER_SWEVG_UPG; +} + +/*! + \brief enable a timer + \param[in] timer_periph: TIMERx(x=0..6) + \param[out] none + \retval none +*/ +void timer_enable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_CEN; +} + +/*! + \brief disable a timer + \param[in] timer_periph: TIMERx(x=0..6) + \param[out] none + \retval none +*/ +void timer_disable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_CEN; +} + +/*! + \brief enable the auto reload shadow function + \param[in] timer_periph: TIMERx(x=0..6) + \param[out] none + \retval none +*/ +void timer_auto_reload_shadow_enable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_ARSE; +} + +/*! + \brief disable the auto reload shadow function + \param[in] timer_periph: TIMERx(x=0..6) + \param[out] none + \retval none +*/ +void timer_auto_reload_shadow_disable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_ARSE; +} + +/*! + \brief enable the update event + \param[in] timer_periph: TIMERx(x=0..6) + \param[out] none + \retval none +*/ +void timer_update_event_enable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_UPDIS; +} + +/*! + \brief disable the update event + \param[in] timer_periph: TIMERx(x=0..6) + \param[out] none + \retval none +*/ +void timer_update_event_disable(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) |= (uint32_t) TIMER_CTL0_UPDIS; +} + +/*! + \brief set TIMER counter alignment mode + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] aligned: + only one parameter can be selected which is shown as below: + \arg TIMER_COUNTER_EDGE: edge-aligned mode + \arg TIMER_COUNTER_CENTER_DOWN: center-aligned and counting down assert mode + \arg TIMER_COUNTER_CENTER_UP: center-aligned and counting up assert mode + \arg TIMER_COUNTER_CENTER_BOTH: center-aligned and counting up/down assert mode + \param[out] none + \retval none +*/ +void timer_counter_alignment(uint32_t timer_periph, uint16_t aligned) +{ + TIMER_CTL0(timer_periph) &= (uint32_t)(~TIMER_CTL0_CAM); + TIMER_CTL0(timer_periph) |= (uint32_t)aligned; +} + +/*! + \brief set TIMER counter up direction + \param[in] timer_periph: TIMERx(x=0..4) + \param[out] none + \retval none +*/ +void timer_counter_up_direction(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_DIR; +} + +/*! + \brief set TIMER counter down direction + \param[in] timer_periph: TIMERx(x=0..4) + \param[out] none + \retval none +*/ +void timer_counter_down_direction(uint32_t timer_periph) +{ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_DIR; +} + +/*! + \brief configure TIMER prescaler + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] prescaler: prescaler value + \param[in] pscreload: prescaler reload mode + only one parameter can be selected which is shown as below: + \arg TIMER_PSC_RELOAD_NOW: the prescaler is loaded right now + \arg TIMER_PSC_RELOAD_UPDATE: the prescaler is loaded at the next update event + \param[out] none + \retval none +*/ +void timer_prescaler_config(uint32_t timer_periph, uint16_t prescaler, uint32_t pscreload) +{ + TIMER_PSC(timer_periph) = (uint32_t)prescaler; + + if(TIMER_PSC_RELOAD_NOW == pscreload){ + TIMER_SWEVG(timer_periph) |= (uint32_t)TIMER_SWEVG_UPG; + } +} + +/*! + \brief configure TIMER repetition register value + \param[in] timer_periph: TIMERx(x=0) + \param[in] repetition: the counter repetition value, 0~255 + \param[out] none + \retval none +*/ +void timer_repetition_value_config(uint32_t timer_periph, uint16_t repetition) +{ + TIMER_CREP(timer_periph) = (uint32_t)repetition; +} + +/*! + \brief configure TIMER autoreload register value + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] autoreload: the counter auto-reload value + \param[out] none + \retval none +*/ +void timer_autoreload_value_config(uint32_t timer_periph, uint16_t autoreload) +{ + TIMER_CAR(timer_periph) = (uint32_t)autoreload; +} + +/*! + \brief configure TIMER counter register value + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] counter: the counter value + \param[out] none + \retval none +*/ +void timer_counter_value_config(uint32_t timer_periph, uint16_t counter) +{ + TIMER_CNT(timer_periph) = (uint32_t)counter; +} + +/*! + \brief read TIMER counter value + \param[in] timer_periph: TIMERx(x=0..6) + \param[out] none + \retval counter value +*/ +uint32_t timer_counter_read(uint32_t timer_periph) +{ + uint32_t count_value = 0U; + count_value = TIMER_CNT(timer_periph); + return (count_value); +} + +/*! + \brief read TIMER prescaler value + \param[in] timer_periph: TIMERx(x=0..6) + \param[out] none + \retval prescaler register value +*/ +uint16_t timer_prescaler_read(uint32_t timer_periph) +{ + uint16_t prescaler_value = 0U; + prescaler_value = (uint16_t) (TIMER_PSC(timer_periph)); + return (prescaler_value); +} + +/*! + \brief configure TIMER single pulse mode + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] spmode: + only one parameter can be selected which is shown as below: + \arg TIMER_SP_MODE_SINGLE: single pulse mode + \arg TIMER_SP_MODE_REPETITIVE: repetitive pulse mode + \param[out] none + \retval none +*/ +void timer_single_pulse_mode_config(uint32_t timer_periph, uint32_t spmode) +{ + if(TIMER_SP_MODE_SINGLE == spmode){ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_SPM; + }else if(TIMER_SP_MODE_REPETITIVE == spmode){ + TIMER_CTL0(timer_periph) &= ~((uint32_t)TIMER_CTL0_SPM); + }else{ + /* illegal parameters */ + } +} + +/*! + \brief configure TIMER update source + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] update: + only one parameter can be selected which is shown as below: + \arg TIMER_UPDATE_SRC_GLOBAL: update generate by setting of UPG bit or the counter overflow/underflow, + or the slave mode controller trigger + \arg TIMER_UPDATE_SRC_REGULAR: update generate only by counter overflow/underflow + \param[out] none + \retval none +*/ +void timer_update_source_config(uint32_t timer_periph, uint32_t update) +{ + if(TIMER_UPDATE_SRC_REGULAR == update){ + TIMER_CTL0(timer_periph) |= (uint32_t)TIMER_CTL0_UPS; + }else if(TIMER_UPDATE_SRC_GLOBAL == update){ + TIMER_CTL0(timer_periph) &= ~(uint32_t)TIMER_CTL0_UPS; + }else{ + /* illegal parameters */ + } +} + + +/*! + \brief enable the TIMER DMA + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] dma: specify which DMA to enable + one or more parameters can be selected which are shown as below: + \arg TIMER_DMA_UPD: update DMA enable, TIMERx(x=0..6) + \arg TIMER_DMA_CH0D: channel 0 DMA enable, TIMERx(x=0..4) + \arg TIMER_DMA_CH1D: channel 1 DMA enable, TIMERx(x=0..4) + \arg TIMER_DMA_CH2D: channel 2 DMA enable, TIMERx(x=0..4) + \arg TIMER_DMA_CH3D: channel 3 DMA enable, TIMERx(x=0..4) + \arg TIMER_DMA_CMTD: channel commutation DMA request enable, TIMERx(x=0) + \arg TIMER_DMA_TRGD: trigger DMA enable, TIMERx(x=0..4) + \param[out] none + \retval none +*/ +void timer_dma_enable(uint32_t timer_periph, uint16_t dma) +{ + TIMER_DMAINTEN(timer_periph) |= (uint32_t) dma; +} + +/*! + \brief disable the TIMER DMA + \param[in] timer_periph: TIMERxTIMERx(x=0..6) + \param[in] dma: specify which DMA to disbale + one or more parameters can be selected which are shown as below: + \arg TIMER_DMA_UPD: update DMA enable, TIMERx(x=0..6) + \arg TIMER_DMA_CH0D: channel 0 DMA enable, TIMERx(x=0..4) + \arg TIMER_DMA_CH1D: channel 1 DMA enable, TIMERx(x=0..4) + \arg TIMER_DMA_CH2D: channel 2 DMA enable, TIMERx(x=0..4) + \arg TIMER_DMA_CH3D: channel 3 DMA enable, TIMERx(x=0..4) + \arg TIMER_DMA_CMTD: channel commutation DMA request enable, TIMERx(x=0) + \arg TIMER_DMA_TRGD: trigger DMA enable, TIMERx(x=0..4,7) + \param[out] none + \retval none +*/ +void timer_dma_disable(uint32_t timer_periph, uint16_t dma) +{ + TIMER_DMAINTEN(timer_periph) &= (~(uint32_t)(dma)); +} + +/*! + \brief channel DMA request source selection + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] dma_request: channel DMA request source selection + only one parameter can be selected which is shown as below: + \arg TIMER_DMAREQUEST_CHANNELEVENT: DMA request of channel n is sent when channel n event occurs + \arg TIMER_DMAREQUEST_UPDATEEVENT: DMA request of channel n is sent when update event occurs + \param[out] none + \retval none +*/ +void timer_channel_dma_request_source_select(uint32_t timer_periph, uint32_t dma_request) +{ + if(TIMER_DMAREQUEST_UPDATEEVENT == dma_request){ + TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_DMAS; + }else if(TIMER_DMAREQUEST_CHANNELEVENT == dma_request){ + TIMER_CTL1(timer_periph) &= ~(uint32_t)TIMER_CTL1_DMAS; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief configure the TIMER DMA transfer + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] dma_baseaddr: + only one parameter can be selected which is shown as below: + \arg TIMER_DMACFG_DMATA_CTL0: DMA transfer address is TIMER_CTL0, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_CTL1: DMA transfer address is TIMER_CTL1, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_SMCFG: DMA transfer address is TIMER_SMCFG, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_DMAINTEN: DMA transfer address is TIMER_DMAINTEN, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_INTF: DMA transfer address is TIMER_INTF, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_SWEVG: DMA transfer address is TIMER_SWEVG, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_CHCTL0: DMA transfer address is TIMER_CHCTL0, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_CHCTL1: DMA transfer address is TIMER_CHCTL1, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_CHCTL2: DMA transfer address is TIMER_CHCTL2, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_CNT: DMA transfer address is TIMER_CNT, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_PSC: DMA transfer address is TIMER_PSC, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_CAR: DMA transfer address is TIMER_CAR, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_CREP: DMA transfer address is TIMER_CREP, TIMERx(x=0) + \arg TIMER_DMACFG_DMATA_CH0CV: DMA transfer address is TIMER_CH0CV, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_CH1CV: DMA transfer address is TIMER_CH1CV, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_CH2CV: DMA transfer address is TIMER_CH2CV, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_CH3CV: DMA transfer address is TIMER_CH3CV, TIMERx(x=0..4) + \arg TIMER_DMACFG_DMATA_CCHP: DMA transfer address is TIMER_CCHP, TIMERx(x=0) + \arg TIMER_DMACFG_DMATA_DMACFG: DMA transfer address is TIMER_DMACFG, TIMERx(x=0..4) + \param[in] dma_lenth: + only one parameter can be selected which is shown as below: + \arg TIMER_DMACFG_DMATC_xTRANSFER(x=1..6): DMA transfer x time + \param[out] none + \retval none +*/ +void timer_dma_transfer_config(uint32_t timer_periph, uint32_t dma_baseaddr, uint32_t dma_lenth) +{ + TIMER_DMACFG(timer_periph) &= (~(uint32_t)(TIMER_DMACFG_DMATA | TIMER_DMACFG_DMATC)); + TIMER_DMACFG(timer_periph) |= (uint32_t)(dma_baseaddr | dma_lenth); +} + +/*! + \brief software generate events + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] event: the timer software event generation sources + one or more parameters can be selected which are shown as below: + \arg TIMER_EVENT_SRC_UPG: update event generation, TIMERx(x=0..6) + \arg TIMER_EVENT_SRC_CH0G: channel 0 capture or compare event generation, TIMERx(x=0..4) + \arg TIMER_EVENT_SRC_CH1G: channel 1 capture or compare event generation, TIMERx(x=0..4) + \arg TIMER_EVENT_SRC_CH2G: channel 2 capture or compare event generation, TIMERx(x=0..4) + \arg TIMER_EVENT_SRC_CH3G: channel 3 capture or compare event generation, TIMERx(x=0..4) + \arg TIMER_EVENT_SRC_CMTG: channel commutation event generation, TIMERx(x=0) + \arg TIMER_EVENT_SRC_TRGG: trigger event generation, TIMERx(x=0..4) + \arg TIMER_EVENT_SRC_BRKG: break event generation, TIMERx(x=0) + \param[out] none + \retval none +*/ +void timer_event_software_generate(uint32_t timer_periph, uint16_t event) +{ + TIMER_SWEVG(timer_periph) |= (uint32_t)event; +} + +/*! + \brief initialize TIMER break parameter struct with a default value + \param[in] breakpara: TIMER break parameter struct + \param[out] none + \retval none +*/ +void timer_break_struct_para_init(timer_break_parameter_struct* breakpara) +{ + /* initialize the break parameter struct member with the default value */ + breakpara->runoffstate = TIMER_ROS_STATE_DISABLE; + breakpara->ideloffstate = TIMER_IOS_STATE_DISABLE; + breakpara->deadtime = 0U; + breakpara->breakpolarity = TIMER_BREAK_POLARITY_LOW; + breakpara->outputautostate = TIMER_OUTAUTO_DISABLE; + breakpara->protectmode = TIMER_CCHP_PROT_OFF; + breakpara->breakstate = TIMER_BREAK_DISABLE; +} + +/*! + \brief configure TIMER break function + \param[in] timer_periph: TIMERx(x=0) + \param[in] breakpara: TIMER break parameter struct + runoffstate: TIMER_ROS_STATE_ENABLE, TIMER_ROS_STATE_DISABLE + ideloffstate: TIMER_IOS_STATE_ENABLE, TIMER_IOS_STATE_DISABLE + deadtime: 0~255 + breakpolarity: TIMER_BREAK_POLARITY_LOW, TIMER_BREAK_POLARITY_HIGH + outputautostate: TIMER_OUTAUTO_ENABLE, TIMER_OUTAUTO_DISABLE + protectmode: TIMER_CCHP_PROT_OFF, TIMER_CCHP_PROT_0, TIMER_CCHP_PROT_1, TIMER_CCHP_PROT_2 + breakstate: TIMER_BREAK_ENABLE, TIMER_BREAK_DISABLE + \param[out] none + \retval none +*/ +void timer_break_config(uint32_t timer_periph, timer_break_parameter_struct* breakpara) +{ + TIMER_CCHP(timer_periph) = (uint32_t)(((uint32_t)(breakpara->runoffstate)) | + ((uint32_t)(breakpara->ideloffstate))| + ((uint32_t)(breakpara->deadtime)) | + ((uint32_t)(breakpara->breakpolarity)) | + ((uint32_t)(breakpara->outputautostate)) | + ((uint32_t)(breakpara->protectmode)) | + ((uint32_t)(breakpara->breakstate))); +} + +/*! + \brief enable TIMER break function + \param[in] timer_periph: TIMERx(x=0) + \param[out] none + \retval none +*/ +void timer_break_enable(uint32_t timer_periph) +{ + TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_BRKEN; +} + +/*! + \brief disable TIMER break function + \param[in] timer_periph: TIMERx(x=0) + \param[out] none + \retval none +*/ +void timer_break_disable(uint32_t timer_periph) +{ + TIMER_CCHP(timer_periph) &= ~(uint32_t)TIMER_CCHP_BRKEN; +} + +/*! + \brief enable TIMER output automatic function + \param[in] timer_periph: TIMERx(x=0) + \param[out] none + \retval none +*/ +void timer_automatic_output_enable(uint32_t timer_periph) +{ + TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_OAEN; +} + +/*! + \brief disable TIMER output automatic function + \param[in] timer_periph: TIMERx(x=0) + \param[out] none + \retval none +*/ +void timer_automatic_output_disable(uint32_t timer_periph) +{ + TIMER_CCHP(timer_periph) &= ~(uint32_t)TIMER_CCHP_OAEN; +} + +/*! + \brief enable or disable TIMER primary output function + \param[in] timer_periph: TIMERx(x=0) + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void timer_primary_output_config(uint32_t timer_periph, ControlStatus newvalue) +{ + if(ENABLE == newvalue){ + TIMER_CCHP(timer_periph) |= (uint32_t)TIMER_CCHP_POEN; + }else{ + TIMER_CCHP(timer_periph) &= (~(uint32_t)TIMER_CCHP_POEN); + } +} + +/*! + \brief enable or disable channel capture/compare control shadow register + \param[in] timer_periph: TIMERx(x=0) + \param[in] newvalue: ENABLE or DISABLE + \param[out] none + \retval none +*/ +void timer_channel_control_shadow_config(uint32_t timer_periph, ControlStatus newvalue) +{ + if(ENABLE == newvalue){ + TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_CCSE; + }else{ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_CCSE); + } +} + +/*! + \brief configure TIMER channel control shadow register update control + \param[in] timer_periph: TIMERx(x=0) + \param[in] ccuctl: channel control shadow register update control + only one parameter can be selected which is shown as below: + \arg TIMER_UPDATECTL_CCU: the shadow registers update by when CMTG bit is set + \arg TIMER_UPDATECTL_CCUTRI: the shadow registers update by when CMTG bit is set or an rising edge of TRGI occurs + \param[out] none + \retval none +*/ +void timer_channel_control_shadow_update_config(uint32_t timer_periph, uint32_t ccuctl) +{ + if(TIMER_UPDATECTL_CCU == ccuctl){ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_CCUC); + }else if(TIMER_UPDATECTL_CCUTRI == ccuctl){ + TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_CCUC; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief initialize TIMER channel output parameter struct with a default value + \param[in] ocpara: TIMER channel n output parameter struct + \param[out] none + \retval none +*/ +void timer_channel_output_struct_para_init(timer_oc_parameter_struct* ocpara) +{ + /* initialize the channel output parameter struct member with the default value */ + ocpara->outputstate = TIMER_CCX_DISABLE; + ocpara->outputnstate = TIMER_CCXN_DISABLE; + ocpara->ocpolarity = TIMER_OC_POLARITY_HIGH; + ocpara->ocnpolarity = TIMER_OCN_POLARITY_HIGH; + ocpara->ocidlestate = TIMER_OC_IDLE_STATE_LOW; + ocpara->ocnidlestate = TIMER_OCN_IDLE_STATE_LOW; +} + +/*! + \brief configure TIMER channel output function + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4)) + \param[in] ocpara: TIMER channeln output parameter struct + outputstate: TIMER_CCX_ENABLE, TIMER_CCX_DISABLE + outputnstate: TIMER_CCXN_ENABLE, TIMER_CCXN_DISABLE + ocpolarity: TIMER_OC_POLARITY_HIGH, TIMER_OC_POLARITY_LOW + ocnpolarity: TIMER_OCN_POLARITY_HIGH, TIMER_OCN_POLARITY_LOW + ocidlestate: TIMER_OC_IDLE_STATE_LOW, TIMER_OC_IDLE_STATE_HIGH + ocnidlestate: TIMER_OCN_IDLE_STATE_LOW, TIMER_OCN_IDLE_STATE_HIGH + \param[out] none + \retval none +*/ +void timer_channel_output_config(uint32_t timer_periph, uint16_t channel, timer_oc_parameter_struct* ocpara) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->outputstate; + /* reset the CH0P bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0P); + /* set the CH0P bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->ocpolarity; + + if (TIMER0 == timer_periph) { + /* reset the CH0NEN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NEN); + /* set the CH0NEN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->outputnstate; + /* reset the CH0NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NP); + /* set the CH0NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpara->ocnpolarity; + /* reset the ISO0 bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO0); + /* set the ISO0 bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)ocpara->ocidlestate; + /* reset the ISO0N bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO0N); + /* set the ISO0N bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)ocpara->ocnidlestate; + } + TIMER_CHCTL0(timer_periph) &= ~(uint32_t)TIMER_CHCTL0_CH0MS; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputstate) << 4U); + /* reset the CH1P bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1P); + /* set the CH1P bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocpolarity) << 4U); + + if (TIMER0 == timer_periph) { + /* reset the CH1NEN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NEN); + /* set the CH1NEN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputnstate) << 4U); + /* reset the CH1NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NP); + /* set the CH1NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnpolarity) << 4U); + /* reset the ISO1 bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO1); + /* set the ISO1 bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocidlestate) << 2U); + /* reset the ISO1N bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO1N); + /* set the ISO1N bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnidlestate) << 2U); + } + TIMER_CHCTL0(timer_periph) &= ~(uint32_t)TIMER_CHCTL0_CH1MS; + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + /* reset the CH2EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2EN); + /* set the CH2EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputstate) << 8U); + /* reset the CH2P bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2P); + /* set the CH2P bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocpolarity) << 8U); + + if (TIMER0 == timer_periph) { + /* reset the CH2NEN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NEN); + /* set the CH2NEN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputnstate) << 8U); + /* reset the CH2NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NP); + /* set the CH2NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnpolarity) << 8U); + /* reset the ISO2 bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO2); + /* set the ISO2 bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocidlestate) << 4U); + /* reset the ISO2N bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO2N); + /* set the ISO2N bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocnidlestate) << 4U); + } + TIMER_CHCTL1(timer_periph) &= ~(uint32_t)TIMER_CHCTL1_CH2MS; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + /* reset the CH3EN bit */ + TIMER_CHCTL2(timer_periph) &=(~(uint32_t)TIMER_CHCTL2_CH3EN); + /* set the CH3EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->outputstate) << 12U); + /* reset the CH3P bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3P); + /* set the CH3P bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocpolarity) << 12U); + + if (TIMER0 == timer_periph) { + /* reset the ISO3 bit */ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_ISO3); + /* set the ISO3 bit */ + TIMER_CTL1(timer_periph) |= (uint32_t)((uint32_t)(ocpara->ocidlestate) << 6U); + } + TIMER_CHCTL1(timer_periph) &= ~(uint32_t)TIMER_CHCTL1_CH3MS; + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output compare mode + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4)) + \param[in] ocmode: channel output compare mode + only one parameter can be selected which is shown as below: + \arg TIMER_OC_MODE_TIMING: timing mode + \arg TIMER_OC_MODE_ACTIVE: active mode + \arg TIMER_OC_MODE_INACTIVE: inactive mode + \arg TIMER_OC_MODE_TOGGLE: toggle mode + \arg TIMER_OC_MODE_LOW: force low mode + \arg TIMER_OC_MODE_HIGH: force high mode + \arg TIMER_OC_MODE_PWM0: PWM mode 0 + \arg TIMER_OC_MODE_PWM1: PWM mode 1 + \param[out] none + \retval none +*/ +void timer_channel_output_mode_config(uint32_t timer_periph, uint16_t channel, uint16_t ocmode) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMCTL); + TIMER_CHCTL0(timer_periph) |= (uint32_t)ocmode; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMCTL); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(ocmode) << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMCTL); + TIMER_CHCTL1(timer_periph) |= (uint32_t)ocmode; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMCTL); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(ocmode) << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output pulse value + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4)) + \param[in] pulse: channel output pulse value + \param[out] none + \retval none +*/ +void timer_channel_output_pulse_value_config(uint32_t timer_periph, uint16_t channel, uint32_t pulse) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CH0CV(timer_periph) = (uint32_t)pulse; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CH1CV(timer_periph) = (uint32_t)pulse; + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CH2CV(timer_periph) = (uint32_t)pulse; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CH3CV(timer_periph) = (uint32_t)pulse; + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output shadow function + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4)) + \param[in] ocshadow: channel output shadow state + only one parameter can be selected which is shown as below: + \arg TIMER_OC_SHADOW_ENABLE: channel output shadow state enable + \arg TIMER_OC_SHADOW_DISABLE: channel output shadow state disable + \param[out] none + \retval none +*/ +void timer_channel_output_shadow_config(uint32_t timer_periph, uint16_t channel, uint16_t ocshadow) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMSEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)ocshadow; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMSEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(ocshadow) << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMSEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)ocshadow; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMSEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(ocshadow) << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output fast function + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4)) + \param[in] ocfast: channel output fast function + only one parameter can be selected which is shown as below: + \arg TIMER_OC_FAST_ENABLE: channel output fast function enable + \arg TIMER_OC_FAST_DISABLE: channel output fast function disable + \param[out] none + \retval none +*/ +void timer_channel_output_fast_config(uint32_t timer_periph, uint16_t channel, uint16_t ocfast) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMFEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)ocfast; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMFEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)ocfast << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMFEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)ocfast; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMFEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)ocfast << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output clear function + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4)) + \param[in] occlear: channel output clear function + only one parameter can be selected which is shown as below: + \arg TIMER_OC_CLEAR_ENABLE: channel output clear function enable + \arg TIMER_OC_CLEAR_DISABLE: channel output clear function disable + \param[out] none + \retval none +*/ +void timer_channel_output_clear_config(uint32_t timer_periph, uint16_t channel, uint16_t occlear) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0COMCEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)occlear; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1COMCEN); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)occlear << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2COMCEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)occlear; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3COMCEN); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)occlear << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel output polarity + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4)) + \param[in] ocpolarity: channel output polarity + only one parameter can be selected which is shown as below: + \arg TIMER_OC_POLARITY_HIGH: channel output polarity is high + \arg TIMER_OC_POLARITY_LOW: channel output polarity is low + \param[out] none + \retval none +*/ +void timer_channel_output_polarity_config(uint32_t timer_periph, uint16_t channel, uint16_t ocpolarity) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0P); + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocpolarity; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1P); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpolarity << 4U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2P); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpolarity << 8U); + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3P); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocpolarity << 12U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel complementary output polarity + \param[in] timer_periph: TIMERx(x=0) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0)) + \param[in] ocnpolarity: channel complementary output polarity + only one parameter can be selected which is shown as below: + \arg TIMER_OCN_POLARITY_HIGH: channel complementary output polarity is high + \arg TIMER_OCN_POLARITY_LOW: channel complementary output polarity is low + \param[out] none + \retval none +*/ +void timer_channel_complementary_output_polarity_config(uint32_t timer_periph, uint16_t channel, uint16_t ocnpolarity) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NP); + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocnpolarity; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NP); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnpolarity << 4U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NP); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnpolarity << 8U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel enable state + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4)) + \param[in] state: TIMER channel enable state + only one parameter can be selected which is shown as below: + \arg TIMER_CCX_ENABLE: channel enable + \arg TIMER_CCX_DISABLE: channel disable + \param[out] none + \retval none +*/ +void timer_channel_output_state_config(uint32_t timer_periph, uint16_t channel, uint32_t state) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)state; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)state << 4U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2EN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)state << 8U); + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3EN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)state << 12U); + break; + default: + break; + } +} + +/*! + \brief configure TIMER channel complementary output enable state + \param[in] timer_periph: TIMERx(x=0) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0 + \arg TIMER_CH_1: TIMER channel 1 + \arg TIMER_CH_2: TIMER channel 2 + \param[in] ocnstate: TIMER channel complementary output enable state + only one parameter can be selected which is shown as below: + \arg TIMER_CCXN_ENABLE: channel complementary enable + \arg TIMER_CCXN_DISABLE: channel complementary disable + \param[out] none + \retval none +*/ +void timer_channel_complementary_output_state_config(uint32_t timer_periph, uint16_t channel, uint16_t ocnstate) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0NEN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)ocnstate; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1NEN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnstate << 4U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2NEN); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)ocnstate << 8U); + break; + default: + break; + } +} + +/*! + \brief initialize TIMER channel input parameter struct with a default value + \param[in] icpara: TIMER channel intput parameter struct + \param[out] none + \retval none +*/ +void timer_channel_input_struct_para_init(timer_ic_parameter_struct* icpara) +{ + /* initialize the channel input parameter struct member with the default value */ + icpara->icpolarity = TIMER_IC_POLARITY_RISING; + icpara->icselection = TIMER_IC_SELECTION_DIRECTTI; + icpara->icprescaler = TIMER_IC_PSC_DIV1; + icpara->icfilter = 0U; +} + +/*! + \brief configure TIMER input capture parameter + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4)) + \param[in] icpara: TIMER channel intput parameter struct + icpolarity: TIMER_IC_POLARITY_RISING, TIMER_IC_POLARITY_FALLING, + TIMER_IC_POLARITY_BOTH_EDGE(only for TIMER1~TIMER8) + icselection: TIMER_IC_SELECTION_DIRECTTI, TIMER_IC_SELECTION_INDIRECTTI, + TIMER_IC_SELECTION_ITS + icprescaler: TIMER_IC_PSC_DIV1, TIMER_IC_PSC_DIV2, TIMER_IC_PSC_DIV4, + TIMER_IC_PSC_DIV8 + icfilter: 0~15 + \param[out] none + \retval none +*/ +void timer_input_capture_config(uint32_t timer_periph, uint16_t channel, timer_ic_parameter_struct* icpara) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + + /* reset the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); + TIMER_CHCTL2(timer_periph) |= (uint32_t)(icpara->icpolarity); + /* reset the CH0MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); + TIMER_CHCTL0(timer_periph) |= (uint32_t)(icpara->icselection); + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 4U); + + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; + break; + + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + + /* reset the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpara->icpolarity) << 4U); + /* reset the CH1MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpara->icselection) << 8U); + /* reset the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 12U); + + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + /* reset the CH2EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH2EN); + + /* reset the CH2P and CH2NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH2P | TIMER_CHCTL2_CH2NP)); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpara->icpolarity) << 8U); + + /* reset the CH2MS bit */ + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2MS); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icselection)); + + /* reset the CH2CAPFLT bit */ + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2CAPFLT); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 4U); + + /* set the CH2EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH2EN; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + /* reset the CH3EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH3EN); + + /* reset the CH3P bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH3P)); + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpara->icpolarity) << 12U); + + /* reset the CH3MS bit */ + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3MS); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icselection) << 8U); + + /* reset the CH3CAPFLT bit */ + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3CAPFLT); + TIMER_CHCTL1(timer_periph) |= (uint32_t)((uint32_t)(icpara->icfilter) << 12U); + + /* set the CH3EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH3EN; + break; + default: + break; + } + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, channel, (uint16_t)(icpara->icprescaler)); +} + +/*! + \brief configure TIMER channel input capture prescaler value + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4)) + \param[in] prescaler: channel input capture prescaler value + only one parameter can be selected which is shown as below: + \arg TIMER_IC_PSC_DIV1: no prescaler + \arg TIMER_IC_PSC_DIV2: divided by 2 + \arg TIMER_IC_PSC_DIV4: divided by 4 + \arg TIMER_IC_PSC_DIV8: divided by 8 + \param[out] none + \retval none +*/ +void timer_channel_input_capture_prescaler_config(uint32_t timer_periph, uint16_t channel, uint16_t prescaler) +{ + switch(channel){ + /* configure TIMER_CH_0 */ + case TIMER_CH_0: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPPSC); + TIMER_CHCTL0(timer_periph) |= (uint32_t)prescaler; + break; + /* configure TIMER_CH_1 */ + case TIMER_CH_1: + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPPSC); + TIMER_CHCTL0(timer_periph) |= ((uint32_t)prescaler << 8U); + break; + /* configure TIMER_CH_2 */ + case TIMER_CH_2: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH2CAPPSC); + TIMER_CHCTL1(timer_periph) |= (uint32_t)prescaler; + break; + /* configure TIMER_CH_3 */ + case TIMER_CH_3: + TIMER_CHCTL1(timer_periph) &= (~(uint32_t)TIMER_CHCTL1_CH3CAPPSC); + TIMER_CHCTL1(timer_periph) |= ((uint32_t)prescaler << 8U); + break; + default: + break; + } +} + +/*! + \brief read TIMER channel capture compare register value + \param[in] timer_periph: please refer to the following parameters + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0(TIMERx(x=0..4)) + \arg TIMER_CH_1: TIMER channel 1(TIMERx(x=0..4)) + \arg TIMER_CH_2: TIMER channel 2(TIMERx(x=0..4)) + \arg TIMER_CH_3: TIMER channel 3(TIMERx(x=0..4)) + \param[out] none + \retval channel capture compare register value +*/ +uint32_t timer_channel_capture_value_register_read(uint32_t timer_periph, uint16_t channel) +{ + uint32_t count_value = 0U; + + switch(channel){ + case TIMER_CH_0: + /* read TIMER channel 0 capture compare register value */ + count_value = TIMER_CH0CV(timer_periph); + break; + case TIMER_CH_1: + /* read TIMER channel 1 capture compare register value */ + count_value = TIMER_CH1CV(timer_periph); + break; + case TIMER_CH_2: + /* read TIMER channel 2 capture compare register value */ + count_value = TIMER_CH2CV(timer_periph); + break; + case TIMER_CH_3: + /* read TIMER channel 3 capture compare register value */ + count_value = TIMER_CH3CV(timer_periph); + break; + default: + break; + } + return (count_value); +} + +/*! + \brief configure TIMER input pwm capture function + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] channel: + only one parameter can be selected which is shown as below: + \arg TIMER_CH_0: TIMER channel 0 + \arg TIMER_CH_1: TIMER channel 1 + \param[in] icpwm: TIMER channel intput pwm parameter struct + icpolarity: TIMER_IC_POLARITY_RISING, TIMER_IC_POLARITY_FALLING + icselection: TIMER_IC_SELECTION_DIRECTTI, TIMER_IC_SELECTION_INDIRECTTI + icprescaler: TIMER_IC_PSC_DIV1, TIMER_IC_PSC_DIV2, TIMER_IC_PSC_DIV4, + TIMER_IC_PSC_DIV8 + icfilter: 0~15 + \param[out] none + \retval none +*/ +void timer_input_pwm_capture_config(uint32_t timer_periph, uint16_t channel, timer_ic_parameter_struct* icpwm) +{ + uint16_t icpolarity = 0x0U; + uint16_t icselection = 0x0U; + + /* Set channel input polarity */ + if(TIMER_IC_POLARITY_RISING == icpwm->icpolarity){ + icpolarity = TIMER_IC_POLARITY_FALLING; + }else{ + icpolarity = TIMER_IC_POLARITY_RISING; + } + /* Set channel input mode selection */ + if(TIMER_IC_SELECTION_DIRECTTI == icpwm->icselection){ + icselection = TIMER_IC_SELECTION_INDIRECTTI; + }else{ + icselection = TIMER_IC_SELECTION_DIRECTTI; + } + + if(TIMER_CH_0 == channel){ + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + /* reset the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); + /* set the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)(icpwm->icpolarity); + /* reset the CH0MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); + /* set the CH0MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)(icpwm->icselection); + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); + /* set the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= ((uint32_t)(icpwm->icfilter) << 4U); + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_0, (uint16_t)(icpwm->icprescaler)); + + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + /* reset the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); + /* set the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)icpolarity<< 4U); + /* reset the CH1MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); + /* set the CH1MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)icselection << 8U); + /* reset the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); + /* set the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icfilter) << 12U); + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_1, (uint16_t)(icpwm->icprescaler)); + }else{ + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + /* reset the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); + /* set the CH1P and CH1NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icpolarity) << 4U); + /* reset the CH1MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); + /* set the CH1MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icselection) << 8U); + /* reset the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); + /* set the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)(icpwm->icfilter) << 12U); + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_1, (uint16_t)(icpwm->icprescaler)); + + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + /* reset the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); + /* set the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)icpolarity; + /* reset the CH0MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); + /* set the CH0MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)icselection; + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); + /* set the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= ((uint32_t)(icpwm->icfilter) << 4U); + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; + /* configure TIMER channel input capture prescaler value */ + timer_channel_input_capture_prescaler_config(timer_periph, TIMER_CH_0, (uint16_t)(icpwm->icprescaler)); + } +} + +/*! + \brief configure TIMER hall sensor mode + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] hallmode: + only one parameter can be selected which is shown as below: + \arg TIMER_HALLINTERFACE_ENABLE: TIMER hall sensor mode enable + \arg TIMER_HALLINTERFACE_DISABLE: TIMER hall sensor mode disable + \param[out] none + \retval none +*/ +void timer_hall_mode_config(uint32_t timer_periph, uint32_t hallmode) +{ + if(TIMER_HALLINTERFACE_ENABLE == hallmode){ + TIMER_CTL1(timer_periph) |= (uint32_t)TIMER_CTL1_TI0S; + }else if(TIMER_HALLINTERFACE_DISABLE == hallmode){ + TIMER_CTL1(timer_periph) &= ~(uint32_t)TIMER_CTL1_TI0S; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief select TIMER input trigger source + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] intrigger: + only one parameter can be selected which is shown as below: + \arg TIMER_SMCFG_TRGSEL_ITI0: internal trigger 0(TIMERx(x=0..4)) + \arg TIMER_SMCFG_TRGSEL_ITI1: internal trigger 1(TIMERx(x=0..4)) + \arg TIMER_SMCFG_TRGSEL_ITI2: internal trigger 2(TIMERx(x=0..4)) + \arg TIMER_SMCFG_TRGSEL_ITI3: internal trigger 3(TIMERx(x=0..4)) + \arg TIMER_SMCFG_TRGSEL_CI0F_ED: TI0 edge detector(TIMERx(x=0..4)) + \arg TIMER_SMCFG_TRGSEL_CI0FE0: filtered TIMER input 0(TIMERx(x=0..4)) + \arg TIMER_SMCFG_TRGSEL_CI1FE1: filtered TIMER input 1(TIMERx(x=0..4)) + \arg TIMER_SMCFG_TRGSEL_ETIFP: filtered external trigger input(TIMERx(x=0..4)) + \param[out] none + \retval none +*/ +void timer_input_trigger_source_select(uint32_t timer_periph, uint32_t intrigger) +{ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_TRGS); + TIMER_SMCFG(timer_periph) |= (uint32_t)intrigger; +} + +/*! + \brief select TIMER master mode output trigger source + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] outrigger: + only one parameter can be selected which is shown as below: + \arg TIMER_TRI_OUT_SRC_RESET: the UPG bit as trigger output(TIMERx(x=0..6)) + \arg TIMER_TRI_OUT_SRC_ENABLE: the counter enable signal TIMER_CTL0_CEN as trigger output(TIMERx(x=0..6)) + \arg TIMER_TRI_OUT_SRC_UPDATE: update event as trigger output(TIMERx(x=0..6)) + \arg TIMER_TRI_OUT_SRC_CH0: a capture or a compare match occurred in channel 0 as trigger output TRGO(TIMERx(x=0..4)) + \arg TIMER_TRI_OUT_SRC_O0CPRE: O0CPRE as trigger output(TIMERx(x=0..4)) + \arg TIMER_TRI_OUT_SRC_O1CPRE: O1CPRE as trigger output(TIMERx(x=0..4)) + \arg TIMER_TRI_OUT_SRC_O2CPRE: O2CPRE as trigger output(TIMERx(x=0..4)) + \arg TIMER_TRI_OUT_SRC_O3CPRE: O3CPRE as trigger output(TIMERx(x=0..4)) + \param[out] none + \retval none +*/ +void timer_master_output_trigger_source_select(uint32_t timer_periph, uint32_t outrigger) +{ + TIMER_CTL1(timer_periph) &= (~(uint32_t)TIMER_CTL1_MMC); + TIMER_CTL1(timer_periph) |= (uint32_t)outrigger; +} + +/*! + \brief select TIMER slave mode + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] slavemode: + only one parameter can be selected which is shown as below: + \arg TIMER_SLAVE_MODE_DISABLE: slave mode disable + \arg TIMER_ENCODER_MODE0: encoder mode 0 + \arg TIMER_ENCODER_MODE1: encoder mode 1 + \arg TIMER_ENCODER_MODE2: encoder mode 2 + \arg TIMER_SLAVE_MODE_RESTART: restart mode + \arg TIMER_SLAVE_MODE_PAUSE: pause mode + \arg TIMER_SLAVE_MODE_EVENT: event mode + \arg TIMER_SLAVE_MODE_EXTERNAL0: external clock mode 0 + \param[out] none + \retval none +*/ + +void timer_slave_mode_select(uint32_t timer_periph, uint32_t slavemode) +{ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_SMC); + TIMER_SMCFG(timer_periph) |= (uint32_t)slavemode; +} + +/*! + \brief configure TIMER master slave mode + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] masterslave: + only one parameter can be selected which is shown as below: + \arg TIMER_MASTER_SLAVE_MODE_ENABLE: master slave mode enable + \arg TIMER_MASTER_SLAVE_MODE_DISABLE: master slave mode disable + \param[out] none + \retval none +*/ +void timer_master_slave_mode_config(uint32_t timer_periph, uint32_t masterslave) +{ + if(TIMER_MASTER_SLAVE_MODE_ENABLE == masterslave){ + TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SMCFG_MSM; + }else if(TIMER_MASTER_SLAVE_MODE_DISABLE == masterslave){ + TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_MSM; + }else{ + /* illegal parameters */ + } +} + +/*! + \brief configure TIMER external trigger input + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] extprescaler: + only one parameter can be selected which is shown as below: + \arg TIMER_EXT_TRI_PSC_OFF: no divided + \arg TIMER_EXT_TRI_PSC_DIV2: divided by 2 + \arg TIMER_EXT_TRI_PSC_DIV4: divided by 4 + \arg TIMER_EXT_TRI_PSC_DIV8: divided by 8 + \param[in] extpolarity: + only one parameter can be selected which is shown as below: + \arg TIMER_ETP_FALLING: active low or falling edge active + \arg TIMER_ETP_RISING: active high or rising edge active + \param[in] extfilter: a value between 0 and 15 + \param[out] none + \retval none +*/ +void timer_external_trigger_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter) +{ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)(TIMER_SMCFG_ETP | TIMER_SMCFG_ETPSC | TIMER_SMCFG_ETFC)); + TIMER_SMCFG(timer_periph) |= (uint32_t)(extprescaler | extpolarity); + TIMER_SMCFG(timer_periph) |= (uint32_t)(extfilter << 8U); +} + +/*! + \brief configure TIMER quadrature decoder mode + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] decomode: + only one parameter can be selected which is shown as below: + \arg TIMER_ENCODER_MODE0: counter counts on CI0FE0 edge depending on CI1FE1 level + \arg TIMER_ENCODER_MODE1: counter counts on CI1FE1 edge depending on CI0FE0 level + \arg TIMER_ENCODER_MODE2: counter counts on both CI0FE0 and CI1FE1 edges depending on the level of the other input + \param[in] ic0polarity: + only one parameter can be selected which is shown as below: + \arg TIMER_IC_POLARITY_RISING: capture rising edge + \arg TIMER_IC_POLARITY_FALLING: capture falling edge + \param[in] ic1polarity: + only one parameter can be selected which is shown as below: + \arg TIMER_IC_POLARITY_RISING: capture rising edge + \arg TIMER_IC_POLARITY_FALLING: capture falling edge + \param[out] none + \retval none +*/ +void timer_quadrature_decoder_mode_config(uint32_t timer_periph, uint32_t decomode, uint16_t ic0polarity, uint16_t ic1polarity) +{ + /* configure the quadrature decoder mode */ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_SMC); + TIMER_SMCFG(timer_periph) |= (uint32_t)decomode; + /* configure input capture selection */ + TIMER_CHCTL0(timer_periph) &= (uint32_t)(((~(uint32_t)TIMER_CHCTL0_CH0MS)) & ((~(uint32_t)TIMER_CHCTL0_CH1MS))); + TIMER_CHCTL0(timer_periph) |= (uint32_t)(TIMER_IC_SELECTION_DIRECTTI | ((uint32_t)TIMER_IC_SELECTION_DIRECTTI << 8U)); + /* configure channel input capture polarity */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); + TIMER_CHCTL2(timer_periph) |= ((uint32_t)ic0polarity | ((uint32_t)ic1polarity << 4U)); +} + +/*! + \brief configure TIMER internal clock mode + \param[in] timer_periph: TIMERx(x=0..4) + \param[out] none + \retval none +*/ +void timer_internal_clock_config(uint32_t timer_periph) +{ + TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_SMC; +} + +/*! + \brief configure TIMER the internal trigger as external clock input + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] intrigger: + only one parameter can be selected which is shown as below: + \arg TIMER_SMCFG_TRGSEL_ITI0: internal trigger 0 + \arg TIMER_SMCFG_TRGSEL_ITI1: internal trigger 1 + \arg TIMER_SMCFG_TRGSEL_ITI2: internal trigger 2 + \arg TIMER_SMCFG_TRGSEL_ITI3: internal trigger 3 + \param[out] none + \retval none +*/ +void timer_internal_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t intrigger) +{ + timer_input_trigger_source_select(timer_periph, intrigger); + TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_SMC; + TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SLAVE_MODE_EXTERNAL0; +} + +/*! + \brief configure TIMER the external trigger as external clock input + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] extrigger: + only one parameter can be selected which is shown as below: + \arg TIMER_SMCFG_TRGSEL_CI0F_ED: TI0 edge detector + \arg TIMER_SMCFG_TRGSEL_CI0FE0: filtered TIMER input 0 + \arg TIMER_SMCFG_TRGSEL_CI1FE1: filtered TIMER input 1 + \param[in] extpolarity: + only one parameter can be selected which is shown as below: + \arg TIMER_IC_POLARITY_RISING: active low or falling edge active + \arg TIMER_IC_POLARITY_FALLING: active high or rising edge active + \param[in] extfilter: a value between 0 and 15 + \param[out] none + \retval none +*/ +void timer_external_trigger_as_external_clock_config(uint32_t timer_periph, uint32_t extrigger, uint16_t extpolarity, uint32_t extfilter) +{ + if(TIMER_SMCFG_TRGSEL_CI1FE1 == extrigger){ + /* reset the CH1EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH1EN); + /* reset the CH1NP bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH1P | TIMER_CHCTL2_CH1NP)); + /* set the CH1NP bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)((uint32_t)extpolarity << 4U); + /* reset the CH1MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1MS); + /* set the CH1MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)((uint32_t)TIMER_IC_SELECTION_DIRECTTI << 8U); + /* reset the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH1CAPFLT); + /* set the CH1CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)(extfilter << 12U); + /* set the CH1EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH1EN; + }else{ + /* reset the CH0EN bit */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)TIMER_CHCTL2_CH0EN); + /* reset the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) &= (~(uint32_t)(TIMER_CHCTL2_CH0P | TIMER_CHCTL2_CH0NP)); + /* set the CH0P and CH0NP bits */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)extpolarity; + /* reset the CH0MS bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0MS); + /* set the CH0MS bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)TIMER_IC_SELECTION_DIRECTTI; + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) &= (~(uint32_t)TIMER_CHCTL0_CH0CAPFLT); + /* reset the CH0CAPFLT bit */ + TIMER_CHCTL0(timer_periph) |= (uint32_t)(extfilter << 4U); + /* set the CH0EN bit */ + TIMER_CHCTL2(timer_periph) |= (uint32_t)TIMER_CHCTL2_CH0EN; + } + /* select TIMER input trigger source */ + timer_input_trigger_source_select(timer_periph, extrigger); + /* reset the SMC bit */ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)TIMER_SMCFG_SMC); + /* set the SMC bit */ + TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SLAVE_MODE_EXTERNAL0; +} + +/*! + \brief configure TIMER the external clock mode0 + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] extprescaler: + only one parameter can be selected which is shown as below: + \arg TIMER_EXT_TRI_PSC_OFF: no divided + \arg TIMER_EXT_TRI_PSC_DIV2: divided by 2 + \arg TIMER_EXT_TRI_PSC_DIV4: divided by 4 + \arg TIMER_EXT_TRI_PSC_DIV8: divided by 8 + \param[in] extpolarity: + only one parameter can be selected which is shown as below: + \arg TIMER_ETP_FALLING: active low or falling edge active + \arg TIMER_ETP_RISING: active high or rising edge active + \param[in] extfilter: a value between 0 and 15 + \param[out] none + \retval none +*/ +void timer_external_clock_mode0_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter) +{ + /* configure TIMER external trigger input */ + timer_external_trigger_config(timer_periph, extprescaler, extpolarity, extfilter); + /* reset the SMC bit,TRGS bit */ + TIMER_SMCFG(timer_periph) &= (~(uint32_t)(TIMER_SMCFG_SMC | TIMER_SMCFG_TRGS)); + /* set the SMC bit,TRGS bit */ + TIMER_SMCFG(timer_periph) |= (uint32_t)(TIMER_SLAVE_MODE_EXTERNAL0 | TIMER_SMCFG_TRGSEL_ETIFP); +} + +/*! + \brief configure TIMER the external clock mode1 + \param[in] timer_periph: TIMERx(x=0..4) + \param[in] extprescaler: + only one parameter can be selected which is shown as below: + \arg TIMER_EXT_TRI_PSC_OFF: no divided + \arg TIMER_EXT_TRI_PSC_DIV2: divided by 2 + \arg TIMER_EXT_TRI_PSC_DIV4: divided by 4 + \arg TIMER_EXT_TRI_PSC_DIV8: divided by 8 + \param[in] extpolarity: + only one parameter can be selected which is shown as below: + \arg TIMER_ETP_FALLING: active low or falling edge active + \arg TIMER_ETP_RISING: active high or rising edge active + \param[in] extfilter: a value between 0 and 15 + \param[out] none + \retval none +*/ +void timer_external_clock_mode1_config(uint32_t timer_periph, uint32_t extprescaler, uint32_t extpolarity, uint32_t extfilter) +{ + /* configure TIMER external trigger input */ + timer_external_trigger_config(timer_periph, extprescaler, extpolarity, extfilter); + TIMER_SMCFG(timer_periph) |= (uint32_t)TIMER_SMCFG_SMC1; +} + +/*! + \brief disable TIMER the external clock mode1 + \param[in] timer_periph: TIMERx(x=0..4) + \param[out] none + \retval none +*/ +void timer_external_clock_mode1_disable(uint32_t timer_periph) +{ + TIMER_SMCFG(timer_periph) &= ~(uint32_t)TIMER_SMCFG_SMC1; +} + +/*! + \brief enable the TIMER interrupt + \param[in] timer_periph: please refer to the following parameters + \param[in] interrupt: specify which interrupt to enable + one or more parameters can be selected which are shown as below: + \arg TIMER_INT_UP: update interrupt enable, TIMERx(x=0..6) + \arg TIMER_INT_CH0: channel 0 interrupt enable, TIMERx(x=0..4) + \arg TIMER_INT_CH1: channel 1 interrupt enable, TIMERx(x=0..4) + \arg TIMER_INT_CH2: channel 2 interrupt enable, TIMERx(x=0..4) + \arg TIMER_INT_CH3: channel 3 interrupt enable, TIMERx(x=0..4) + \arg TIMER_INT_CMT: commutation interrupt enable, TIMERx(x=0) + \arg TIMER_INT_TRG: trigger interrupt enable, TIMERx(x=0..4) + \arg TIMER_INT_BRK: break interrupt enable, TIMERx(x=0) + \param[out] none + \retval none +*/ +void timer_interrupt_enable(uint32_t timer_periph, uint32_t interrupt) +{ + TIMER_DMAINTEN(timer_periph) |= (uint32_t) interrupt; +} + +/*! + \brief disable the TIMER interrupt + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] interrupt: specify which interrupt to disbale + one or more parameters can be selected which are shown as below: + \arg TIMER_INT_UP: update interrupt enable, TIMERx(x=0..6) + \arg TIMER_INT_CH0: channel 0 interrupt enable, TIMERx(x=0..4) + \arg TIMER_INT_CH1: channel 1 interrupt enable, TIMERx(x=0..4) + \arg TIMER_INT_CH2: channel 2 interrupt enable, TIMERx(x=0..4) + \arg TIMER_INT_CH3: channel 3 interrupt enable , TIMERx(x=0..4) + \arg TIMER_INT_CMT: commutation interrupt enable, TIMERx(x=0) + \arg TIMER_INT_TRG: trigger interrupt enable, TIMERx(x=0..4) + \arg TIMER_INT_BRK: break interrupt enable, TIMERx(x=0) + \param[out] none + \retval none +*/ +void timer_interrupt_disable(uint32_t timer_periph, uint32_t interrupt) +{ + TIMER_DMAINTEN(timer_periph) &= (~(uint32_t)interrupt); +} + +/*! + \brief get timer interrupt flag + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] interrupt: the timer interrupt bits + only one parameter can be selected which is shown as below: + \arg TIMER_INT_FLAG_UP: update interrupt flag, TIMERx(x=0..6) + \arg TIMER_INT_FLAG_CH0: channel 0 interrupt flag, TIMERx(x=0..4) + \arg TIMER_INT_FLAG_CH1: channel 1 interrupt flag, TIMERx(x=0..4) + \arg TIMER_INT_FLAG_CH2: channel 2 interrupt flag, TIMERx(x=0..4) + \arg TIMER_INT_FLAG_CH3: channel 3 interrupt flag, TIMERx(x=0..4) + \arg TIMER_INT_FLAG_CMT: channel commutation interrupt flag, TIMERx(x=0) + \arg TIMER_INT_FLAG_TRG: trigger interrupt flag, TIMERx(x=0) + \arg TIMER_INT_FLAG_BRK: break interrupt flag, TIMERx(x=0) + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus timer_interrupt_flag_get(uint32_t timer_periph, uint32_t interrupt) +{ + uint32_t val; + val = (TIMER_DMAINTEN(timer_periph) & interrupt); + if((RESET != (TIMER_INTF(timer_periph) & interrupt)) && (RESET != val)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear TIMER interrupt flag + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] interrupt: the timer interrupt bits + one or more parameters can be selected which are shown as below: + \arg TIMER_INT_FLAG_UP: update interrupt flag, TIMERx(x=0..6) + \arg TIMER_INT_FLAG_CH0: channel 0 interrupt flag, TIMERx(x=0..4) + \arg TIMER_INT_FLAG_CH1: channel 1 interrupt flag, TIMERx(x=0..4) + \arg TIMER_INT_FLAG_CH2: channel 2 interrupt flag, TIMERx(x=0..4) + \arg TIMER_INT_FLAG_CH3: channel 3 interrupt flag, TIMERx(x=0..4) + \arg TIMER_INT_FLAG_CMT: channel commutation interrupt flag, TIMERx(x=0) + \arg TIMER_INT_FLAG_TRG: trigger interrupt flag, TIMERx(x=0..4) + \arg TIMER_INT_FLAG_BRK: break interrupt flag, TIMERx(x=0) + \param[out] none + \retval none +*/ +void timer_interrupt_flag_clear(uint32_t timer_periph, uint32_t interrupt) +{ + TIMER_INTF(timer_periph) = (~(uint32_t)interrupt); +} + +/*! + \brief get TIMER flags + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] flag: the timer interrupt flags + only one parameter can be selected which is shown as below: + \arg TIMER_FLAG_UP: update flag, TIMERx(x=0..6) + \arg TIMER_FLAG_CH0: channel 0 flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CH1: channel 1 flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CH2: channel 2 flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CH3: channel 3 flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CMT: channel commutation flag, TIMERx(x=0) + \arg TIMER_FLAG_TRG: trigger flag, TIMERx(x=0..4) + \arg TIMER_FLAG_BRK: break flag, TIMERx(x=0) + \arg TIMER_FLAG_CH0O: channel 0 overcapture flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CH1O: channel 1 overcapture flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CH2O: channel 2 overcapture flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CH3O: channel 3 overcapture flag, TIMERx(x=0..4) + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus timer_flag_get(uint32_t timer_periph, uint32_t flag) +{ + if(RESET != (TIMER_INTF(timer_periph) & flag)){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear TIMER flags + \param[in] timer_periph: TIMERx(x=0..6) + \param[in] flag: the timer interrupt flags + one or more parameters can be selected which are shown as below: + \arg TIMER_FLAG_UP: update flag, TIMERx(x=0..6) + \arg TIMER_FLAG_CH0: channel 0 flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CH1: channel 1 flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CH2: channel 2 flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CH3: channel 3 flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CMT: channel commutation flag, TIMERx(x=0) + \arg TIMER_FLAG_TRG: trigger flag, TIMERx(x=0..4) + \arg TIMER_FLAG_BRK: break flag, TIMERx(x=0) + \arg TIMER_FLAG_CH0O: channel 0 overcapture flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CH1O: channel 1 overcapture flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CH2O: channel 2 overcapture flag, TIMERx(x=0..4) + \arg TIMER_FLAG_CH3O: channel 3 overcapture flag, TIMERx(x=0..4) + \param[out] none + \retval none +*/ +void timer_flag_clear(uint32_t timer_periph, uint32_t flag) +{ + TIMER_INTF(timer_periph) = (~(uint32_t)flag); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c new file mode 100644 index 0000000..feff1ed --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c @@ -0,0 +1,765 @@ +/*! + \file gd32vf103_usart.c + \brief USART driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 + \version 2019-09-18, V1.0.1, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_usart.h" + +/*! + \brief reset USART/UART + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_deinit(uint32_t usart_periph) +{ + switch(usart_periph){ + case USART0: + /* reset USART0 */ + rcu_periph_reset_enable(RCU_USART0RST); + rcu_periph_reset_disable(RCU_USART0RST); + break; + case USART1: + /* reset USART1 */ + rcu_periph_reset_enable(RCU_USART1RST); + rcu_periph_reset_disable(RCU_USART1RST); + break; + case USART2: + /* reset USART2 */ + rcu_periph_reset_enable(RCU_USART2RST); + rcu_periph_reset_disable(RCU_USART2RST); + break; + case UART3: + /* reset UART3 */ + rcu_periph_reset_enable(RCU_UART3RST); + rcu_periph_reset_disable(RCU_UART3RST); + break; + case UART4: + /* reset UART4 */ + rcu_periph_reset_enable(RCU_UART4RST); + rcu_periph_reset_disable(RCU_UART4RST); + break; + default: + break; + } +} + +/*! + \brief configure USART baud rate value + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] baudval: baud rate value + \param[out] none + \retval none +*/ +void usart_baudrate_set(uint32_t usart_periph, uint32_t baudval) +{ + uint32_t uclk=0U, intdiv=0U, fradiv=0U, udiv=0U; + switch(usart_periph){ + /* get clock frequency */ + case USART0: + /* get USART0 clock */ + uclk=rcu_clock_freq_get(CK_APB2); + break; + case USART1: + /* get USART1 clock */ + uclk=rcu_clock_freq_get(CK_APB1); + break; + case USART2: + /* get USART2 clock */ + uclk=rcu_clock_freq_get(CK_APB1); + break; + case UART3: + /* get UART3 clock */ + uclk=rcu_clock_freq_get(CK_APB1); + break; + case UART4: + /* get UART4 clock */ + uclk=rcu_clock_freq_get(CK_APB1); + break; + default: + break; + } + /* oversampling by 16, configure the value of USART_BAUD */ + udiv = (uclk+baudval/2U)/baudval; + intdiv = udiv & (0x0000fff0U); + fradiv = udiv & (0x0000000fU); + USART_BAUD(usart_periph) = ((USART_BAUD_FRADIV | USART_BAUD_INTDIV) & (intdiv | fradiv)); +} + +/*! + \brief configure USART parity + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] paritycfg: configure USART parity + only one parameter can be selected which is shown as below: + \arg USART_PM_NONE: no parity + \arg USART_PM_ODD: odd parity + \arg USART_PM_EVEN: even parity + \param[out] none + \retval none +*/ +void usart_parity_config(uint32_t usart_periph, uint32_t paritycfg) +{ + /* clear USART_CTL0 PM,PCEN bits */ + USART_CTL0(usart_periph) &= ~(USART_CTL0_PM | USART_CTL0_PCEN); + /* configure USART parity mode */ + USART_CTL0(usart_periph) |= paritycfg ; +} + +/*! + \brief configure USART word length + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] wlen: USART word length configure + only one parameter can be selected which is shown as below: + \arg USART_WL_8BIT: 8 bits + \arg USART_WL_9BIT: 9 bits + \param[out] none + \retval none +*/ +void usart_word_length_set(uint32_t usart_periph, uint32_t wlen) +{ + /* clear USART_CTL0 WL bit */ + USART_CTL0(usart_periph) &= ~USART_CTL0_WL; + /* configure USART word length */ + USART_CTL0(usart_periph) |= wlen; +} + +/*! + \brief configure USART stop bit length + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] stblen: USART stop bit configure + only one parameter can be selected which is shown as below: + \arg USART_STB_1BIT: 1 bit + \arg USART_STB_0_5BIT: 0.5 bit, not available for UARTx(x=3,4) + \arg USART_STB_2BIT: 2 bits + \arg USART_STB_1_5BIT: 1.5 bits, not available for UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_stop_bit_set(uint32_t usart_periph, uint32_t stblen) +{ + /* clear USART_CTL1 STB bits */ + USART_CTL1(usart_periph) &= ~USART_CTL1_STB; + /* configure USART stop bits */ + USART_CTL1(usart_periph) |= stblen; +} + +/*! + \brief enable USART + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_enable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) |= USART_CTL0_UEN; +} + +/*! + \brief disable USART + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_disable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) &= ~(USART_CTL0_UEN); +} + +/*! + \brief configure USART transmitter + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] txconfig: enable or disable USART transmitter + only one parameter can be selected which is shown as below: + \arg USART_TRANSMIT_ENABLE: enable USART transmission + \arg USART_TRANSMIT_DISABLE: disable USART transmission + \param[out] none + \retval none +*/ +void usart_transmit_config(uint32_t usart_periph, uint32_t txconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL0(usart_periph); + ctl &= ~USART_CTL0_TEN; + ctl |= txconfig; + /* configure transfer mode */ + USART_CTL0(usart_periph) = ctl; +} + +/*! + \brief configure USART receiver + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] rxconfig: enable or disable USART receiver + only one parameter can be selected which is shown as below: + \arg USART_RECEIVE_ENABLE: enable USART reception + \arg USART_RECEIVE_DISABLE: disable USART reception + \param[out] none + \retval none +*/ +void usart_receive_config(uint32_t usart_periph, uint32_t rxconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL0(usart_periph); + ctl &= ~USART_CTL0_REN; + ctl |= rxconfig; + /* configure receiver mode */ + USART_CTL0(usart_periph) = ctl; +} + +/*! + \brief USART transmit data function + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] data: data of transmission + \param[out] none + \retval none +*/ +void usart_data_transmit(uint32_t usart_periph, uint32_t data) +{ + USART_DATA(usart_periph) = USART_DATA_DATA & data; +} + +/*! + \brief USART receive data function + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval data of received +*/ +uint16_t usart_data_receive(uint32_t usart_periph) +{ + return (uint16_t)(GET_BITS(USART_DATA(usart_periph), 0U, 8U)); +} + +/*! + \brief configure the address of the USART in wake up by address match mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] addr: address of USART/UART + \param[out] none + \retval none +*/ +void usart_address_config(uint32_t usart_periph, uint8_t addr) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_ADDR); + USART_CTL1(usart_periph) |= (USART_CTL1_ADDR & addr); +} + +/*! + \brief receiver in mute mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_mute_mode_enable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) |= USART_CTL0_RWU; +} + +/*! + \brief receiver in active mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_mute_mode_disable(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) &= ~(USART_CTL0_RWU); +} + +/*! + \brief configure wakeup method in mute mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] wmethod: two methods be used to enter or exit the mute mode + only one parameter can be selected which is shown as below: + \arg USART_WM_IDLE: idle line + \arg USART_WM_ADDR: address mask + \param[out] none + \retval none +*/ +void usart_mute_mode_wakeup_config(uint32_t usart_periph, uint32_t wmethod) +{ + USART_CTL0(usart_periph) &= ~(USART_CTL0_WM); + USART_CTL0(usart_periph) |= wmethod; +} + +/*! + \brief enable LIN mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_lin_mode_enable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) |= USART_CTL1_LMEN; +} + +/*! + \brief disable LIN mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_lin_mode_disable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_LMEN); +} + +/*! + \brief configure lin break frame length + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] lblen: lin break frame length + only one parameter can be selected which is shown as below: + \arg USART_LBLEN_10B: 10 bits + \arg USART_LBLEN_11B: 11 bits + \param[out] none + \retval none +*/ +void usart_lin_break_detection_length_config(uint32_t usart_periph, uint32_t lblen) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_LBLEN); + USART_CTL1(usart_periph) |= (USART_CTL1_LBLEN & lblen); +} + +/*! + \brief send break frame + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_send_break(uint32_t usart_periph) +{ + USART_CTL0(usart_periph) |= USART_CTL0_SBKCMD; +} + +/*! + \brief enable half duplex mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_halfduplex_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_HDEN; +} + +/*! + \brief disable half duplex mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_halfduplex_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_HDEN); +} + +/*! + \brief enable CK pin in synchronous mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_synchronous_clock_enable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) |= USART_CTL1_CKEN; +} + +/*! + \brief disable CK pin in synchronous mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_synchronous_clock_disable(uint32_t usart_periph) +{ + USART_CTL1(usart_periph) &= ~(USART_CTL1_CKEN); +} + +/*! + \brief configure USART synchronous mode parameters + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] clen: CK length + only one parameter can be selected which is shown as below: + \arg USART_CLEN_NONE: there are 7 CK pulses for an 8 bit frame and 8 CK pulses for a 9 bit frame + \arg USART_CLEN_EN: there are 8 CK pulses for an 8 bit frame and 9 CK pulses for a 9 bit frame + \param[in] cph: clock phase + only one parameter can be selected which is shown as below: + \arg USART_CPH_1CK: first clock transition is the first data capture edge + \arg USART_CPH_2CK: second clock transition is the first data capture edge + \param[in] cpl: clock polarity + only one parameter can be selected which is shown as below: + \arg USART_CPL_LOW: steady low value on CK pin + \arg USART_CPL_HIGH: steady high value on CK pin + \param[out] none + \retval none +*/ +void usart_synchronous_clock_config(uint32_t usart_periph, uint32_t clen, uint32_t cph, uint32_t cpl) +{ + uint32_t ctl = 0U; + + /* read USART_CTL1 register */ + ctl = USART_CTL1(usart_periph); + ctl &= ~(USART_CTL1_CLEN | USART_CTL1_CPH | USART_CTL1_CPL); + /* set CK length, CK phase, CK polarity */ + ctl |= (USART_CTL1_CLEN & clen) | (USART_CTL1_CPH & cph) | (USART_CTL1_CPL & cpl); + + USART_CTL1(usart_periph) = ctl; +} + +/*! + \brief configure guard time value in smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] gaut: guard time value + \param[out] none + \retval none +*/ +void usart_guard_time_config(uint32_t usart_periph,uint32_t gaut) +{ + USART_GP(usart_periph) &= ~(USART_GP_GUAT); + USART_GP(usart_periph) |= (USART_GP_GUAT & ((gaut)<<8)); +} + +/*! + \brief enable smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_smartcard_mode_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_SCEN; +} + +/*! + \brief disable smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_smartcard_mode_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_SCEN); +} + +/*! + \brief enable NACK in smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_smartcard_mode_nack_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_NKEN; +} + +/*! + \brief disable NACK in smartcard mode + \param[in] usart_periph: USARTx(x=0,1,2) + \param[out] none + \retval none +*/ +void usart_smartcard_mode_nack_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_NKEN); +} + +/*! + \brief enable IrDA mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_irda_mode_enable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) |= USART_CTL2_IREN; +} + +/*! + \brief disable IrDA mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[out] none + \retval none +*/ +void usart_irda_mode_disable(uint32_t usart_periph) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_IREN); +} + +/*! + \brief configure the peripheral clock prescaler in USART IrDA low-power mode + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] psc: 0x00-0xFF + \param[out] none + \retval none +*/ +void usart_prescaler_config(uint32_t usart_periph, uint8_t psc) +{ + USART_GP(usart_periph) &= ~(USART_GP_PSC); + USART_GP(usart_periph) |= psc; +} + +/*! + \brief configure IrDA low-power + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] irlp: IrDA low-power or normal + only one parameter can be selected which is shown as below: + \arg USART_IRLP_LOW: low-power + \arg USART_IRLP_NORMAL: normal + \param[out] none + \retval none +*/ +void usart_irda_lowpower_config(uint32_t usart_periph, uint32_t irlp) +{ + USART_CTL2(usart_periph) &= ~(USART_CTL2_IRLP); + USART_CTL2(usart_periph) |= (USART_CTL2_IRLP & irlp); +} + +/*! + \brief configure hardware flow control RTS + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] rtsconfig: enable or disable RTS + only one parameter can be selected which is shown as below: + \arg USART_RTS_ENABLE: enable RTS + \arg USART_RTS_DISABLE: disable RTS + \param[out] none + \retval none +*/ +void usart_hardware_flow_rts_config(uint32_t usart_periph, uint32_t rtsconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL2(usart_periph); + ctl &= ~USART_CTL2_RTSEN; + ctl |= rtsconfig; + /* configure RTS */ + USART_CTL2(usart_periph) = ctl; +} + +/*! + \brief configure hardware flow control CTS + \param[in] usart_periph: USARTx(x=0,1,2) + \param[in] ctsconfig: enable or disable CTS + only one parameter can be selected which is shown as below: + \arg USART_CTS_ENABLE: enable CTS + \arg USART_CTS_DISABLE: disable CTS + \param[out] none + \retval none +*/ +void usart_hardware_flow_cts_config(uint32_t usart_periph, uint32_t ctsconfig) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL2(usart_periph); + ctl &= ~USART_CTL2_CTSEN; + ctl |= ctsconfig; + /* configure CTS */ + USART_CTL2(usart_periph) = ctl; +} + +/*! + \brief configure USART DMA reception + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3) + \param[in] dmacmd: enable or disable DMA for reception + only one parameter can be selected which is shown as below: + \arg USART_DENR_ENABLE: DMA enable for reception + \arg USART_DENR_DISABLE: DMA disable for reception + \param[out] none + \retval none +*/ +void usart_dma_receive_config(uint32_t usart_periph, uint32_t dmacmd) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL2(usart_periph); + ctl &= ~USART_CTL2_DENR; + ctl |= dmacmd; + /* configure DMA reception */ + USART_CTL2(usart_periph) = ctl; +} + +/*! + \brief configure USART DMA transmission + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3) + \param[in] dmacmd: enable or disable DMA for transmission + only one parameter can be selected which is shown as below: + \arg USART_DENT_ENABLE: DMA enable for transmission + \arg USART_DENT_DISABLE: DMA disable for transmission + \param[out] none + \retval none +*/ +void usart_dma_transmit_config(uint32_t usart_periph, uint32_t dmacmd) +{ + uint32_t ctl = 0U; + + ctl = USART_CTL2(usart_periph); + ctl &= ~USART_CTL2_DENT; + ctl |= dmacmd; + /* configure DMA transmission */ + USART_CTL2(usart_periph) = ctl; +} + +/*! + \brief get flag in STAT register + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] flag: USART flags, refer to usart_flag_enum + only one parameter can be selected which is shown as below: + \arg USART_FLAG_CTS: CTS change flag + \arg USART_FLAG_LBD: LIN break detected flag + \arg USART_FLAG_TBE: transmit data buffer empty + \arg USART_FLAG_TC: transmission complete + \arg USART_FLAG_RBNE: read data buffer not empty + \arg USART_FLAG_IDLE: IDLE frame detected flag + \arg USART_FLAG_ORERR: overrun error + \arg USART_FLAG_NERR: noise error flag + \arg USART_FLAG_FERR: frame error flag + \arg USART_FLAG_PERR: parity error flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus usart_flag_get(uint32_t usart_periph, usart_flag_enum flag) +{ + if(RESET != (USART_REG_VAL(usart_periph, flag) & BIT(USART_BIT_POS(flag)))){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear flag in STAT register + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] flag: USART flags, refer to usart_flag_enum + only one parameter can be selected which is shown as below: + \arg USART_FLAG_CTS: CTS change flag + \arg USART_FLAG_LBD: LIN break detected flag + \arg USART_FLAG_TC: transmission complete + \arg USART_FLAG_RBNE: read data buffer not empty + \param[out] none + \retval none +*/ +void usart_flag_clear(uint32_t usart_periph, usart_flag_enum flag) +{ + USART_REG_VAL(usart_periph, flag) &= ~BIT(USART_BIT_POS(flag)); +} + +/*! + \brief enable USART interrupt + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] interrupt + only one parameter can be selected which is shown as below: + \arg USART_INT_PERR: parity error interrupt + \arg USART_INT_TBE: transmitter buffer empty interrupt + \arg USART_INT_TC: transmission complete interrupt + \arg USART_INT_RBNE: read data buffer not empty interrupt and overrun error interrupt + \arg USART_INT_IDLE: IDLE line detected interrupt + \arg USART_INT_LBD: LIN break detected interrupt + \arg USART_INT_ERR: error interrupt + \arg USART_INT_CTS: CTS interrupt + \param[out] none + \retval none +*/ +void usart_interrupt_enable(uint32_t usart_periph, uint32_t interrupt) +{ + USART_REG_VAL(usart_periph, interrupt) |= BIT(USART_BIT_POS(interrupt)); +} + +/*! + \brief disable USART interrupt + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] interrupt + only one parameter can be selected which is shown as below: + \arg USART_INT_PERR: parity error interrupt + \arg USART_INT_TBE: transmitter buffer empty interrupt + \arg USART_INT_TC: transmission complete interrupt + \arg USART_INT_RBNE: read data buffer not empty interrupt and overrun error interrupt + \arg USART_INT_IDLE: IDLE line detected interrupt + \arg USART_INT_LBD: LIN break detected interrupt + \arg USART_INT_ERR: error interrupt + \arg USART_INT_CTS: CTS interrupt + \param[out] none + \retval none +*/ +void usart_interrupt_disable(uint32_t usart_periph, uint32_t interrupt) +{ + USART_REG_VAL(usart_periph, interrupt) &= ~BIT(USART_BIT_POS(interrupt)); +} + +/*! + \brief get USART interrupt and flag status + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] int_flag + only one parameter can be selected which is shown as below: + \arg USART_INT_FLAG_PERR: parity error interrupt and flag + \arg USART_INT_FLAG_TBE: transmitter buffer empty interrupt and flag + \arg USART_INT_FLAG_TC: transmission complete interrupt and flag + \arg USART_INT_FLAG_RBNE: read data buffer not empty interrupt and flag + \arg USART_INT_FLAG_RBNE_ORERR: read data buffer not empty interrupt and overrun error flag + \arg USART_INT_FLAG_IDLE: IDLE line detected interrupt and flag + \arg USART_INT_FLAG_LBD: LIN break detected interrupt and flag + \arg USART_INT_FLAG_CTS: CTS interrupt and flag + \arg USART_INT_FLAG_ERR_ORERR: error interrupt and overrun error + \arg USART_INT_FLAG_ERR_NERR: error interrupt and noise error flag + \arg USART_INT_FLAG_ERR_FERR: error interrupt and frame error flag + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus usart_interrupt_flag_get(uint32_t usart_periph, uint32_t int_flag) +{ + uint32_t intenable = 0U, flagstatus = 0U; + /* get the interrupt enable bit status */ + intenable = (USART_REG_VAL(usart_periph, int_flag) & BIT(USART_BIT_POS(int_flag))); + /* get the corresponding flag bit status */ + flagstatus = (USART_REG_VAL2(usart_periph, int_flag) & BIT(USART_BIT_POS2(int_flag))); + + if(flagstatus && intenable){ + return SET; + }else{ + return RESET; + } +} + +/*! + \brief clear USART interrupt flag in STAT register + \param[in] usart_periph: USARTx(x=0,1,2)/UARTx(x=3,4) + \param[in] int_flag: USART interrupt flag + only one parameter can be selected which is shown as below: + \arg USART_INT_FLAG_CTS: CTS change flag + \arg USART_INT_FLAG_LBD: LIN break detected flag + \arg USART_INT_FLAG_TC: transmission complete + \arg USART_INT_FLAG_RBNE: read data buffer not empty + \param[out] none + \retval none +*/ +void usart_interrupt_flag_clear(uint32_t usart_periph, uint32_t int_flag) +{ + USART_REG_VAL2(usart_periph, int_flag) &= ~BIT(USART_BIT_POS2(int_flag)); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c new file mode 100644 index 0000000..e023ede --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c @@ -0,0 +1,146 @@ +/*! + \file gd32vf103_wwdgt.c + \brief WWDGT driver + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103_wwdgt.h" + +/* write value to WWDGT_CTL_CNT bit field */ +#define CTL_CNT(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) +/* write value to WWDGT_CFG_WIN bit field */ +#define CFG_WIN(regval) (BITS(0,6) & ((uint32_t)(regval) << 0)) + +/*! + \brief reset the window watchdog timer configuration + \param[in] none + \param[out] none + \retval none +*/ +void wwdgt_deinit(void) +{ + rcu_periph_reset_enable(RCU_WWDGTRST); + rcu_periph_reset_disable(RCU_WWDGTRST); +} + +/*! + \brief start the window watchdog timer counter + \param[in] none + \param[out] none + \retval none +*/ +void wwdgt_enable(void) +{ + WWDGT_CTL |= WWDGT_CTL_WDGTEN; +} + +/*! + \brief configure the window watchdog timer counter value + \param[in] counter_value: 0x00 - 0x7F + \param[out] none + \retval none +*/ +void wwdgt_counter_update(uint16_t counter_value) +{ + uint32_t reg = 0U; + + reg = (WWDGT_CTL & (~WWDGT_CTL_CNT)); + reg |= CTL_CNT(counter_value); + + WWDGT_CTL = reg; +} + +/*! + \brief configure counter value, window value, and prescaler divider value + \param[in] counter: 0x00 - 0x7F + \param[in] window: 0x00 - 0x7F + \param[in] prescaler: wwdgt prescaler value + only one parameter can be selected which is shown as below: + \arg WWDGT_CFG_PSC_DIV1: the time base of window watchdog counter = (PCLK1/4096)/1 + \arg WWDGT_CFG_PSC_DIV2: the time base of window watchdog counter = (PCLK1/4096)/2 + \arg WWDGT_CFG_PSC_DIV4: the time base of window watchdog counter = (PCLK1/4096)/4 + \arg WWDGT_CFG_PSC_DIV8: the time base of window watchdog counter = (PCLK1/4096)/8 + \param[out] none + \retval none +*/ +void wwdgt_config(uint16_t counter, uint16_t window, uint32_t prescaler) +{ + uint32_t reg_cfg = 0U, reg_ctl = 0U; + + /* clear WIN and PSC bits, clear CNT bit */ + reg_cfg = (WWDGT_CFG &(~(WWDGT_CFG_WIN|WWDGT_CFG_PSC))); + reg_ctl = (WWDGT_CTL &(~WWDGT_CTL_CNT)); + + /* configure WIN and PSC bits, configure CNT bit */ + reg_cfg |= CFG_WIN(window); + reg_cfg |= prescaler; + reg_ctl |= CTL_CNT(counter); + + WWDGT_CTL = reg_ctl; + WWDGT_CFG = reg_cfg; +} + +/*! + \brief enable early wakeup interrupt of WWDGT + \param[in] none + \param[out] none + \retval none +*/ +void wwdgt_interrupt_enable(void) +{ + WWDGT_CFG |= WWDGT_CFG_EWIE; +} + +/*! + \brief check early wakeup interrupt state of WWDGT + \param[in] none + \param[out] none + \retval FlagStatus: SET or RESET +*/ +FlagStatus wwdgt_flag_get(void) +{ + if(WWDGT_STAT & WWDGT_STAT_EWIF){ + return SET; + } + + return RESET; +} + +/*! + \brief clear early wakeup interrupt state of WWDGT + \param[in] none + \param[out] none + \retval none +*/ +void wwdgt_flag_clear(void) +{ + WWDGT_STAT &= (~WWDGT_STAT_EWIF); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/gd32vf103.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/gd32vf103.h new file mode 100644 index 0000000..3aba7a5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/gd32vf103.h @@ -0,0 +1,241 @@ +/*! + \file gd32vf103.h + \brief general definitions for GD32VF103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_H +#define GD32VF103_H + +#ifdef cplusplus + extern "C" { +#endif + + /* IO definitions (access restrictions to peripheral registers) */ + /** + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. + */ + #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 */ + + /* define value of high speed crystal oscillator (HXTAL) in Hz */ + #if !defined HXTAL_VALUE + #ifdef GD32VF103R_START + #define HXTAL_VALUE ((uint32_t)25000000) /*!< value of the external oscillator in Hz */ + #define HXTAL_VALUE_8M HXTAL_VALUE +#elif defined(GD32VF103V_EVAL) || defined(GD32VF103C_START) || defined(GD32VF103T_START) + #define HXTAL_VALUE ((uint32_t)8000000) /*!< value of the external oscillator in Hz */ + #define HXTAL_VALUE_25M HXTAL_VALUE + #else + #error "Please select the target board type used in your application (in gd32vf103.h file)" + #endif + #endif /* high speed crystal oscillator value */ + +/* define startup timeout value of high speed crystal oscillator (HXTAL) */ +#if !defined (HXTAL_STARTUP_TIMEOUT) +#define HXTAL_STARTUP_TIMEOUT ((uint16_t)0xFFFF) +#endif /* high speed crystal oscillator startup timeout */ + +/* define value of internal 8MHz RC oscillator (IRC8M) in Hz */ +#if !defined (IRC8M_VALUE) +#define IRC8M_VALUE ((uint32_t)8000000) +#endif /* internal 8MHz RC oscillator value */ + +/* define startup timeout value of internal 8MHz RC oscillator (IRC8M) */ +#if !defined (IRC8M_STARTUP_TIMEOUT) +#define IRC8M_STARTUP_TIMEOUT ((uint16_t)0x0500) +#endif /* internal 8MHz RC oscillator startup timeout */ + +/* define value of internal 40KHz RC oscillator(IRC40K) in Hz */ +#if !defined (IRC40K_VALUE) +#define IRC40K_VALUE ((uint32_t)40000) +#endif /* internal 40KHz RC oscillator value */ + +/* define value of low speed crystal oscillator (LXTAL)in Hz */ +#if !defined (LXTAL_VALUE) +#define LXTAL_VALUE ((uint32_t)32768) +#endif /* low speed crystal oscillator value */ + +/* define interrupt number */ +typedef enum IRQn +{ + + CLIC_INT_RESERVED = 0, /*!< RISC-V reserved */ + CLIC_INT_SFT = 3, /*!< Software interrupt */ + CLIC_INT_TMR = 7, /*!< CPU Timer interrupt */ + CLIC_INT_BWEI = 17, /*!< Bus Error interrupt */ + CLIC_INT_PMOVI = 18, /*!< Performance Monitor */ + + /* interruput numbers */ + WWDGT_IRQn = 19, /*!< window watchDog timer interrupt */ + LVD_IRQn = 20, /*!< LVD through EXTI line detect interrupt */ + TAMPER_IRQn = 21, /*!< tamper through EXTI line detect */ + RTC_IRQn = 22, /*!< RTC alarm interrupt */ + FMC_IRQn = 23, /*!< FMC interrupt */ + RCU_CTC_IRQn = 24, /*!< RCU and CTC interrupt */ + EXTI0_IRQn = 25, /*!< EXTI line 0 interrupts */ + EXTI1_IRQn = 26, /*!< EXTI line 1 interrupts */ + EXTI2_IRQn = 27, /*!< EXTI line 2 interrupts */ + EXTI3_IRQn = 28, /*!< EXTI line 3 interrupts */ + EXTI4_IRQn = 29, /*!< EXTI line 4 interrupts */ + DMA0_Channel0_IRQn = 30, /*!< DMA0 channel0 interrupt */ + DMA0_Channel1_IRQn = 31, /*!< DMA0 channel1 interrupt */ + DMA0_Channel2_IRQn = 32, /*!< DMA0 channel2 interrupt */ + DMA0_Channel3_IRQn = 33, /*!< DMA0 channel3 interrupt */ + DMA0_Channel4_IRQn = 34, /*!< DMA0 channel4 interrupt */ + DMA0_Channel5_IRQn = 35, /*!< DMA0 channel5 interrupt */ + DMA0_Channel6_IRQn = 36, /*!< DMA0 channel6 interrupt */ + ADC0_1_IRQn = 37, /*!< ADC0 and ADC1 interrupt */ + CAN0_TX_IRQn = 38, /*!< CAN0 TX interrupts */ + CAN0_RX0_IRQn = 39, /*!< CAN0 RX0 interrupts */ + CAN0_RX1_IRQn = 40, /*!< CAN0 RX1 interrupts */ + CAN0_EWMC_IRQn = 41, /*!< CAN0 EWMC interrupts */ + EXTI5_9_IRQn = 42, /*!< EXTI[9:5] interrupts */ + TIMER0_BRK_IRQn = 43, /*!< TIMER0 break interrupts */ + TIMER0_UP_IRQn = 44, /*!< TIMER0 update interrupts */ + TIMER0_TRG_CMT_IRQn = 45, /*!< TIMER0 trigger and commutation interrupts */ + TIMER0_Channel_IRQn = 46, /*!< TIMER0 channel capture compare interrupts */ + TIMER1_IRQn = 47, /*!< TIMER1 interrupt */ + TIMER2_IRQn = 48, /*!< TIMER2 interrupt */ + TIMER3_IRQn = 49, /*!< TIMER3 interrupts */ + I2C0_EV_IRQn = 50, /*!< I2C0 event interrupt */ + I2C0_ER_IRQn = 51, /*!< I2C0 error interrupt */ + I2C1_EV_IRQn = 52, /*!< I2C1 event interrupt */ + I2C1_ER_IRQn = 53, /*!< I2C1 error interrupt */ + SPI0_IRQn = 54, /*!< SPI0 interrupt */ + SPI1_IRQn = 55, /*!< SPI1 interrupt */ + USART0_IRQn = 56, /*!< USART0 interrupt */ + USART1_IRQn = 57, /*!< USART1 interrupt */ + USART2_IRQn = 58, /*!< USART2 interrupt */ + EXTI10_15_IRQn = 59, /*!< EXTI[15:10] interrupts */ + RTC_ALARM_IRQn = 60, /*!< RTC alarm interrupt EXTI */ + USBFS_WKUP_IRQn = 61, /*!< USBFS wakeup interrupt */ + + EXMC_IRQn = 67, /*!< EXMC global interrupt */ + + TIMER4_IRQn = 69, /*!< TIMER4 global interrupt */ + SPI2_IRQn = 70, /*!< SPI2 global interrupt */ + UART3_IRQn = 71, /*!< UART3 global interrupt */ + UART4_IRQn = 72, /*!< UART4 global interrupt */ + TIMER5_IRQn = 73, /*!< TIMER5 global interrupt */ + TIMER6_IRQn = 74, /*!< TIMER6 global interrupt */ + DMA1_Channel0_IRQn = 75, /*!< DMA1 channel0 global interrupt */ + DMA1_Channel1_IRQn = 76, /*!< DMA1 channel1 global interrupt */ + DMA1_Channel2_IRQn = 77, /*!< DMA1 channel2 global interrupt */ + DMA1_Channel3_IRQn = 78, /*!< DMA1 channel3 global interrupt */ + DMA1_Channel4_IRQn = 79, /*!< DMA1 channel3 global interrupt */ + + CAN1_TX_IRQn = 82, /*!< CAN1 TX interrupt */ + CAN1_RX0_IRQn = 83, /*!< CAN1 RX0 interrupt */ + CAN1_RX1_IRQn = 84, /*!< CAN1 RX1 interrupt */ + CAN1_EWMC_IRQn = 85, /*!< CAN1 EWMC interrupt */ + USBFS_IRQn = 86, /*!< USBFS global interrupt */ + + ECLIC_NUM_INTERRUPTS +} IRQn_Type; + +/* includes */ +#include "system_gd32vf103.h" +#include + +/* enum definitions */ +typedef enum {DISABLE = 0, ENABLE = !DISABLE} EventStatus, ControlStatus; +typedef enum {FALSE = 0, TRUE = !FALSE} bool; +typedef enum {RESET = 0, SET = 1,MAX = 0X7FFFFFFF} FlagStatus; +typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrStatus; + +/* bit operations */ +#define REG32(addr) (*(volatile uint32_t *)(uint32_t)(addr)) +#define REG16(addr) (*(volatile uint16_t *)(uint32_t)(addr)) +#define REG8(addr) (*(volatile uint8_t *)(uint32_t)(addr)) +#define BIT(x) ((uint32_t)((uint32_t)0x01U<<(x))) +#define BITS(start, end) ((0xFFFFFFFFUL << (start)) & (0xFFFFFFFFUL >> (31U - (uint32_t)(end)))) +#define GET_BITS(regval, start, end) (((regval) & BITS((start),(end))) >> (start)) + +/* main flash and SRAM memory map */ +#define FLASH_BASE ((uint32_t)0x08000000U) /*!< main FLASH base address */ +#define SRAM_BASE ((uint32_t)0x20000000U) /*!< SRAM0 base address */ +#define OB_BASE ((uint32_t)0x1FFFF800U) /*!< OB base address */ +#define DBG_BASE ((uint32_t)0xE0042000U) /*!< DBG base address */ +#define EXMC_BASE ((uint32_t)0xA0000000U) /*!< EXMC register base address */ + +/* peripheral memory map */ +#define APB1_BUS_BASE ((uint32_t)0x40000000U) /*!< apb1 base address */ +#define APB2_BUS_BASE ((uint32_t)0x40010000U) /*!< apb2 base address */ +#define AHB1_BUS_BASE ((uint32_t)0x40018000U) /*!< ahb1 base address */ +#define AHB3_BUS_BASE ((uint32_t)0x60000000U) /*!< ahb3 base address */ + +/* advanced peripheral bus 1 memory map */ +#define TIMER_BASE (APB1_BUS_BASE + 0x00000000U) /*!< TIMER base address */ +#define RTC_BASE (APB1_BUS_BASE + 0x00002800U) /*!< RTC base address */ +#define WWDGT_BASE (APB1_BUS_BASE + 0x00002C00U) /*!< WWDGT base address */ +#define FWDGT_BASE (APB1_BUS_BASE + 0x00003000U) /*!< FWDGT base address */ +#define SPI_BASE (APB1_BUS_BASE + 0x00003800U) /*!< SPI base address */ +#define USART_BASE (APB1_BUS_BASE + 0x00004400U) /*!< USART base address */ +#define I2C_BASE (APB1_BUS_BASE + 0x00005400U) /*!< I2C base address */ +#define CAN_BASE (APB1_BUS_BASE + 0x00006400U) /*!< CAN base address */ +#define BKP_BASE (APB1_BUS_BASE + 0x00006C00U) /*!< BKP base address */ +#define PMU_BASE (APB1_BUS_BASE + 0x00007000U) /*!< PMU base address */ +#define DAC_BASE (APB1_BUS_BASE + 0x00007400U) /*!< DAC base address */ + +/* advanced peripheral bus 2 memory map */ +#define AFIO_BASE (APB2_BUS_BASE + 0x00000000U) /*!< AFIO base address */ +#define EXTI_BASE (APB2_BUS_BASE + 0x00000400U) /*!< EXTI base address */ +#define GPIO_BASE (APB2_BUS_BASE + 0x00000800U) /*!< GPIO base address */ +#define ADC_BASE (APB2_BUS_BASE + 0x00002400U) /*!< ADC base address */ + +/* advanced high performance bus 1 memory map */ +#define DMA_BASE (AHB1_BUS_BASE + 0x00008000U) /*!< DMA base address */ +#define RCU_BASE (AHB1_BUS_BASE + 0x00009000U) /*!< RCU base address */ +#define FMC_BASE (AHB1_BUS_BASE + 0x0000A000U) /*!< FMC base address */ +#define CRC_BASE (AHB1_BUS_BASE + 0x0000B000U) /*!< CRC base address */ +#define USBFS_BASE (AHB1_BUS_BASE + 0x0FFE8000U) /*!< USBFS base address */ + +/* define marco USE_STDPERIPH_DRIVER */ +#if !defined USE_STDPERIPH_DRIVER +#define USE_STDPERIPH_DRIVER +#endif +#ifdef USE_STDPERIPH_DRIVER +#include "gd32vf103_libopt.h" +#endif /* USE_STDPERIPH_DRIVER */ + +#ifdef cplusplus +} +#endif +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.c new file mode 100644 index 0000000..f787347 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.c @@ -0,0 +1,999 @@ +/*! + \file system_gd32vf103.c + \brief RISC-V Device Peripheral Access Layer Source File for + GD32VF103 Device Series + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* This file refers the RISC-V standard, some adjustments are made according to GigaDevice chips */ + +#include "gd32vf103.h" + +/* system frequency define */ +#define __IRC8M (IRC8M_VALUE) /* internal 8 MHz RC oscillator frequency */ +#define __HXTAL (HXTAL_VALUE) /* high speed crystal oscillator frequency */ +#define __SYS_OSC_CLK (__IRC8M) /* main oscillator frequency */ + +/* select a system clock by uncommenting the following line */ +/* use IRC8M */ +//#define __SYSTEM_CLOCK_48M_PLL_IRC8M (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_72M_PLL_IRC8M (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_108M_PLL_IRC8M (uint32_t)(108000000) + +/********************************************************************/ +//#define __SYSTEM_CLOCK_HXTAL (HXTAL_VALUE) +//#define __SYSTEM_CLOCK_24M_PLL_HXTAL (uint32_t)(24000000) +/********************************************************************/ + +//#define __SYSTEM_CLOCK_36M_PLL_HXTAL (uint32_t)(36000000) +//#define __SYSTEM_CLOCK_48M_PLL_HXTAL (uint32_t)(48000000) +//#define __SYSTEM_CLOCK_56M_PLL_HXTAL (uint32_t)(56000000) +//#define __SYSTEM_CLOCK_72M_PLL_HXTAL (uint32_t)(72000000) +//#define __SYSTEM_CLOCK_96M_PLL_HXTAL (uint32_t)(96000000) +#define __SYSTEM_CLOCK_108M_PLL_HXTAL (uint32_t)(108000000) + +#define SEL_IRC8M 0x00U +#define SEL_HXTAL 0x01U +#define SEL_PLL 0x02U + +/* set the system clock frequency and declare the system clock configuration function */ +#ifdef __SYSTEM_CLOCK_48M_PLL_IRC8M +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_IRC8M; +static void system_clock_48m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_IRC8M; +static void system_clock_72m_irc8m(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_IRC8M; +static void system_clock_108m_irc8m(void); + +#elif defined (__SYSTEM_CLOCK_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_HXTAL; +static void system_clock_hxtal(void); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_24M_PLL_HXTAL; +static void system_clock_24m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_36M_PLL_HXTAL; +static void system_clock_36m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_48M_PLL_HXTAL; +static void system_clock_48m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_56M_PLL_HXTAL; +static void system_clock_56m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_72M_PLL_HXTAL; +static void system_clock_72m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_96M_PLL_HXTAL; +static void system_clock_96m_hxtal(void); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +uint32_t SystemCoreClock = __SYSTEM_CLOCK_108M_PLL_HXTAL; +static void system_clock_108m_hxtal(void); +#else +uint32_t SystemCoreClock = IRC8M_VALUE; +#endif /* __SYSTEM_CLOCK_48M_PLL_IRC8M */ + +/* configure the system clock */ +static void system_clock_config(void); + +/*! + \brief configure the system clock + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_config(void) +{ +#ifdef __SYSTEM_CLOCK_HXTAL + system_clock_hxtal(); +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) + system_clock_24m_hxtal(); +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) + system_clock_36m_hxtal(); +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) + system_clock_48m_hxtal(); +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) + system_clock_56m_hxtal(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) + system_clock_72m_hxtal(); +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) + system_clock_96m_hxtal(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) + system_clock_108m_hxtal(); + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) + system_clock_48m_irc8m(); +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) + system_clock_72m_irc8m(); +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) + system_clock_108m_irc8m(); +#endif /* __SYSTEM_CLOCK_HXTAL */ +} + +/*! + \brief setup the microcontroller system, initialize the system + \param[in] none + \param[out] none + \retval none +*/ +void SystemInit(void) +{ + /* reset the RCC clock configuration to the default reset state */ + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* reset SCS, AHBPSC, APB1PSC, APB2PSC, ADCPSC, CKOUT0SEL bits */ + RCU_CFG0 &= ~(RCU_CFG0_SCS | RCU_CFG0_AHBPSC | RCU_CFG0_APB1PSC | RCU_CFG0_APB2PSC | + RCU_CFG0_ADCPSC | RCU_CFG0_ADCPSC_2 | RCU_CFG0_CKOUT0SEL); + + /* reset HXTALEN, CKMEN, PLLEN bits */ + RCU_CTL &= ~(RCU_CTL_HXTALEN | RCU_CTL_CKMEN | RCU_CTL_PLLEN); + + /* Reset HXTALBPS bit */ + RCU_CTL &= ~(RCU_CTL_HXTALBPS); + + /* reset PLLSEL, PREDV0_LSB, PLLMF, USBFSPSC bits */ + + RCU_CFG0 &= ~(RCU_CFG0_PLLSEL | RCU_CFG0_PREDV0_LSB | RCU_CFG0_PLLMF | + RCU_CFG0_USBFSPSC | RCU_CFG0_PLLMF_4); + RCU_CFG1 = 0x00000000U; + + /* Reset HXTALEN, CKMEN, PLLEN, PLL1EN and PLL2EN bits */ + RCU_CTL &= ~(RCU_CTL_PLLEN | RCU_CTL_PLL1EN | RCU_CTL_PLL2EN | RCU_CTL_CKMEN | RCU_CTL_HXTALEN); + /* disable all interrupts */ + RCU_INT = 0x00FF0000U; + + /* Configure the System clock source, PLL Multiplier, AHB/APBx prescalers and Flash settings */ + system_clock_config(); +} + +/*! + \brief update the SystemCoreClock with current core clock retrieved from cpu registers + \param[in] none + \param[out] none + \retval none +*/ +void SystemCoreClockUpdate(void) +{ + uint32_t scss; + uint32_t pllsel, predv0sel, pllmf, ck_src; + uint32_t predv0, predv1, pll1mf; + + scss = GET_BITS(RCU_CFG0, 2, 3); + + switch (scss) + { + /* IRC8M is selected as CK_SYS */ + case SEL_IRC8M: + SystemCoreClock = IRC8M_VALUE; + break; + + /* HXTAL is selected as CK_SYS */ + case SEL_HXTAL: + SystemCoreClock = HXTAL_VALUE; + break; + + /* PLL is selected as CK_SYS */ + case SEL_PLL: + /* PLL clock source selection, HXTAL or IRC8M/2 */ + pllsel = (RCU_CFG0 & RCU_CFG0_PLLSEL); + + + if(RCU_PLLSRC_IRC8M_DIV2 == pllsel){ + /* PLL clock source is IRC8M/2 */ + ck_src = IRC8M_VALUE / 2U; + }else{ + /* PLL clock source is HXTAL */ + ck_src = HXTAL_VALUE; + + predv0sel = (RCU_CFG1 & RCU_CFG1_PREDV0SEL); + + /* source clock use PLL1 */ + if(RCU_PREDV0SRC_CKPLL1 == predv0sel){ + predv1 = ((RCU_CFG1 & RCU_CFG1_PREDV1) >> 4) + 1U; + pll1mf = ((RCU_CFG1 & RCU_CFG1_PLL1MF) >> 8) + 2U; + if(17U == pll1mf){ + pll1mf = 20U; + } + ck_src = (ck_src / predv1) * pll1mf; + } + predv0 = (RCU_CFG1 & RCU_CFG1_PREDV0) + 1U; + ck_src /= predv0; + } + + /* PLL multiplication factor */ + pllmf = GET_BITS(RCU_CFG0, 18, 21); + + if((RCU_CFG0 & RCU_CFG0_PLLMF_4)){ + pllmf |= 0x10U; + } + + if(pllmf >= 15U){ + pllmf += 1U; + }else{ + pllmf += 2U; + } + + SystemCoreClock = ck_src * pllmf; + + if(15U == pllmf){ + /* PLL source clock multiply by 6.5 */ + SystemCoreClock = ck_src * 6U + ck_src / 2U; + } + + break; + + /* IRC8M is selected as CK_SYS */ + default: + SystemCoreClock = IRC8M_VALUE; + break; + } +} + +#ifdef __SYSTEM_CLOCK_HXTAL +/*! + \brief configure the system clock to HXTAL + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* select HXTAL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_HXTAL; + + /* wait until HXTAL is selected as system clock */ + while(0 == (RCU_CFG0 & RCU_SCSS_HXTAL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_24M_PLL_HXTAL) +/*! + \brief configure the system clock to 24M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_24m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 6 = 24 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL6); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_36M_PLL_HXTAL) +/*! + \brief configure the system clock to 36M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_36m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 9 = 36 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL9); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_HXTAL) +/*! + \brief configure the system clock to 48M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL12); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_56M_PLL_HXTAL) +/*! + \brief configure the system clock to 56M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_56m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 14 = 56 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL14); + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_HXTAL) +/*! + \brief configure the system clock to 72M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL18); + + + if(HXTAL_VALUE==25000000){ + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_96M_PLL_HXTAL) +/*! + \brief configure the system clock to 96M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_96m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + if(HXTAL_VALUE==25000000){ + + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV1 | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PLL1_MUL8 | RCU_PREDV1_DIV5 | RCU_PREDV0_DIV10); + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while((RCU_CTL & RCU_CTL_PLL1STB) == 0){ + } + + }else if(HXTAL_VALUE==8000000){ + /* CK_PLL = (CK_PREDIV0) * 24 = 96 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL24); + + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 ); + } + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_HXTAL) +/*! + \brief configure the system clock to 108M by PLL which selects HXTAL(MD/HD/XD:8M; CL:25M) as its clock source + \param[in] none + \param[out] none + \retval none +*/ + +static void system_clock_108m_hxtal(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable HXTAL */ + RCU_CTL |= RCU_CTL_HXTALEN; + + /* wait until HXTAL is stable or the startup time is longer than HXTAL_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_HXTALSTB); + }while((0U == stab_flag) && (HXTAL_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_HXTALSTB)){ + while(1){ + } + } + + /* HXTAL is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_PREDIV0) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= (RCU_PLLSRC_HXTAL | RCU_PLL_MUL27); + + if(HXTAL_VALUE==25000000){ + /* CK_PREDIV0 = (CK_HXTAL)/5 *8 /10 = 4 MHz */ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_CKPLL1 | RCU_PREDV1_DIV5 | RCU_PLL1_MUL8 | RCU_PREDV0_DIV10); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + }else if(HXTAL_VALUE==8000000){ + RCU_CFG1 &= ~(RCU_CFG1_PREDV0SEL | RCU_CFG1_PREDV1 | RCU_CFG1_PLL1MF | RCU_CFG1_PREDV0); + RCU_CFG1 |= (RCU_PREDV0SRC_HXTAL | RCU_PREDV0_DIV2 | RCU_PREDV1_DIV2 | RCU_PLL1_MUL20 | RCU_PLL2_MUL20); + + /* enable PLL1 */ + RCU_CTL |= RCU_CTL_PLL1EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL1STB)){ + } + + /* enable PLL2 */ + RCU_CTL |= RCU_CTL_PLL2EN; + /* wait till PLL1 is ready */ + while(0U == (RCU_CTL & RCU_CTL_PLL2STB)){ + } + + } + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_48M_PLL_IRC8M) +/*! + \brief configure the system clock to 48M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_48m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 12 = 48 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL12; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_72M_PLL_IRC8M) +/*! + \brief configure the system clock to 72M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_72m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 18 = 72 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL18; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#elif defined (__SYSTEM_CLOCK_108M_PLL_IRC8M) +/*! + \brief configure the system clock to 108M by PLL which selects IRC8M as its clock source + \param[in] none + \param[out] none + \retval none +*/ +static void system_clock_108m_irc8m(void) +{ + uint32_t timeout = 0U; + uint32_t stab_flag = 0U; + + /* enable IRC8M */ + RCU_CTL |= RCU_CTL_IRC8MEN; + + /* wait until IRC8M is stable or the startup time is longer than IRC8M_STARTUP_TIMEOUT */ + do{ + timeout++; + stab_flag = (RCU_CTL & RCU_CTL_IRC8MSTB); + } + while((0U == stab_flag) && (IRC8M_STARTUP_TIMEOUT != timeout)); + + /* if fail */ + if(0U == (RCU_CTL & RCU_CTL_IRC8MSTB)){ + while(1){ + } + } + + /* IRC8M is stable */ + /* AHB = SYSCLK */ + RCU_CFG0 |= RCU_AHB_CKSYS_DIV1; + /* APB2 = AHB/1 */ + RCU_CFG0 |= RCU_APB2_CKAHB_DIV1; + /* APB1 = AHB/2 */ + RCU_CFG0 |= RCU_APB1_CKAHB_DIV2; + + /* CK_PLL = (CK_IRC8M/2) * 27 = 108 MHz */ + RCU_CFG0 &= ~(RCU_CFG0_PLLMF | RCU_CFG0_PLLMF_4); + RCU_CFG0 |= RCU_PLL_MUL27; + + /* enable PLL */ + RCU_CTL |= RCU_CTL_PLLEN; + + /* wait until PLL is stable */ + while(0U == (RCU_CTL & RCU_CTL_PLLSTB)){ + } + + /* select PLL as system clock */ + RCU_CFG0 &= ~RCU_CFG0_SCS; + RCU_CFG0 |= RCU_CKSYSSRC_PLL; + + /* wait until PLL is selected as system clock */ + while(0U == (RCU_CFG0 & RCU_SCSS_PLL)){ + } +} + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h new file mode 100644 index 0000000..9626310 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.h @@ -0,0 +1,60 @@ +/*! + \file system_gd32vf103.h + \brief RISC-V Device Peripheral Access Layer Header File for + GD32VF103 Device Series + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* This file refers the RISC-V standard, some adjustments are made according to GigaDevice chips */ + +#ifndef SYSTEM_GD32VF103_H +#define SYSTEM_GD32VF103_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* system clock frequency (core clock) */ +extern uint32_t SystemCoreClock; + +/* function declarations */ +/* initialize the system and update the SystemCoreClock variable */ +extern void SystemInit(void); +/* update the SystemCoreClock with current core clock retrieved from cpu registers */ +extern void SystemCoreClockUpdate(void); + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_GD32VF103_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h new file mode 100644 index 0000000..70563ec --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_core.h @@ -0,0 +1,117 @@ +/*! + \file drv_usb_core.h + \brief USB core low level driver header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __DRV_USB_CORE_H +#define __DRV_USB_CORE_H + +#include "drv_usb_regs.h" +#include "usb_ch9_std.h" + +#define USB_FS_EP0_MAX_LEN 64U /* maximum packet size of EndPoint0 */ + +#define HC_MAX_PACKET_COUNT 140U /* maximum packet count */ + +#define EP_ID(x) ((uint8_t)((x) & 0x7FU)) /* endpoint number */ +#define EP_DIR(x) ((uint8_t)((x) >> 7)) /* endpoint direction */ + +enum _usb_eptype { + USB_EPTYPE_CTRL = 0U, /*!< control endpoint type */ + USB_EPTYPE_ISOC = 1U, /*!< isochronous endpoint type */ + USB_EPTYPE_BULK = 2U, /*!< bulk endpoint type */ + USB_EPTYPE_INTR = 3U, /*!< interrupt endpoint type */ + USB_EPTYPE_MASK = 3U, /*!< endpoint type mask */ +}; + +typedef enum +{ + USB_OTG_OK = 0, /*!< USB OTG status OK*/ + USB_OTG_FAIL /*!< USB OTG status fail*/ +} usb_otg_status; + +typedef enum +{ + USB_OK = 0, /*!< USB status OK*/ + USB_FAIL /*!< USB status fail*/ +} usb_status; + +typedef enum +{ + USB_USE_FIFO, /*!< USB use FIFO transfer mode */ + USB_USE_DMA /*!< USB use DMA transfer mode */ +} usb_transfer_mode; + +typedef struct +{ + uint8_t core_enum; /*!< USB core type */ + uint8_t core_speed; /*!< USB core speed */ + uint8_t num_pipe; /*!< USB host channel numbers */ + uint8_t num_ep; /*!< USB device endpoint numbers */ + uint8_t transfer_mode; /*!< USB transfer mode */ + uint8_t phy_itf; /*!< USB core PHY interface */ + uint8_t sof_enable; /*!< USB SOF output */ + uint8_t low_power; /*!< USB low power */ +} usb_core_basic; + +/* function declarations */ + +/* config core capabilities */ +usb_status usb_basic_init (usb_core_basic *usb_basic, + usb_core_regs *usb_regs, + usb_core_enum usb_core); + +/*initializes the USB controller registers and prepares the core device mode or host mode operation*/ +usb_status usb_core_init (usb_core_basic usb_basic, usb_core_regs *usb_regs); + +/* read a packet from the Rx FIFO associated with the endpoint */ +void *usb_rxfifo_read (usb_core_regs *core_regs, uint8_t *dest_buf, uint16_t byte_count); + +/* write a packet into the Tx FIFO associated with the endpoint */ +usb_status usb_txfifo_write (usb_core_regs *usb_regs, + uint8_t *src_buf, + uint8_t fifo_num, + uint16_t byte_count); + +/* flush a Tx FIFO or all Tx FIFOs */ +usb_status usb_txfifo_flush (usb_core_regs *usb_regs, uint8_t fifo_num); + +/* flush the entire Rx FIFO */ +usb_status usb_rxfifo_flush (usb_core_regs *usb_regs); + +/* get the global interrupts */ +static inline uint32_t usb_coreintr_get(usb_core_regs *usb_regs) +{ + return usb_regs->gr->GINTEN & usb_regs->gr->GINTF; +} + +#endif /* __DRV_USB_CORE_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h new file mode 100644 index 0000000..6b85712 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_dev.h @@ -0,0 +1,217 @@ +/*! + \file drv_usb_dev.h + \brief USB device low level driver header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __DRV_USB_DEV_H +#define __DRV_USB_DEV_H + +#include "drv_usb_core.h" + +enum usb_ctl_status { + USB_CTL_IDLE = 0U, /*!< USB control transfer idle state */ + USB_CTL_DATA_IN, /*!< USB control transfer data in state */ + USB_CTL_LAST_DATA_IN, /*!< USB control transfer last data in state */ + USB_CTL_DATA_OUT, /*!< USB control transfer data out state */ + USB_CTL_LAST_DATA_OUT, /*!< USB control transfer last data out state */ + USB_CTL_STATUS_IN, /*!< USB control transfer status in state*/ + USB_CTL_STATUS_OUT /*!< USB control transfer status out state */ +}; + +#define EP_IN(x) ((uint8_t)(0x80U | (x))) /*!< device IN endpoint */ +#define EP_OUT(x) ((uint8_t)(x)) /*!< device OUT endpoint */ + +/* USB descriptor */ +typedef struct _usb_desc { + uint8_t *dev_desc; /*!< device descriptor */ + uint8_t *config_desc; /*!< config descriptor */ + uint8_t *bos_desc; /*!< BOS descriptor */ + + void* const *strings; /*!< string descriptor */ +} usb_desc; + +/* USB power management */ +typedef struct _usb_pm { + uint8_t power_mode; /*!< power mode */ + uint8_t power_low; /*!< power low */ + uint8_t dev_remote_wakeup; /*!< remote wakeup */ + uint8_t remote_wakeup_on; /*!< remote wakeup on */ +} usb_pm; + +/* USB control information */ +typedef struct _usb_control { + usb_req req; /*!< USB standard device request */ + + uint8_t ctl_state; /*!< USB control transfer state */ + uint8_t ctl_zlp; /*!< zero lenth package */ +} usb_control; + +typedef struct +{ + struct { + uint8_t num: 4; /*!< the endpoint number.it can be from 0 to 6 */ + uint8_t pad: 3; /*!< padding between number and direction */ + uint8_t dir: 1; /*!< the endpoint direction */ + } ep_addr; + + uint8_t ep_type; /*!< USB endpoint type */ + uint8_t ep_stall; /*!< USB endpoint stall status */ + + uint8_t frame_num; /*!< number of frame */ + uint16_t max_len; /*!< Maximum packet lenth */ + + /* transaction level variables */ + uint8_t *xfer_buf; /*!< transmit buffer */ + uint32_t xfer_len; /*!< transmit buffer length */ + uint32_t xfer_count; /*!< transmit buffer count */ + + uint32_t remain_len; /*!< remain packet lenth */ + + uint32_t dma_addr; /*!< DMA address */ +} usb_transc; + +typedef struct _usb_core_driver usb_dev; + +typedef struct _usb_class_core +{ + uint8_t command; /*!< device class request command */ + uint8_t alter_set; /*!< alternative set */ + + uint8_t (*init) (usb_dev *udev, uint8_t config_index); /*!< initialize handler */ + uint8_t (*deinit) (usb_dev *udev, uint8_t config_index); /*!< de-initialize handler */ + + uint8_t (*req_proc) (usb_dev *udev, usb_req *req); /*!< device request handler */ + + uint8_t (*data_in) (usb_dev *udev, uint8_t ep_num); /*!< device data in handler */ + uint8_t (*data_out) (usb_dev *udev, uint8_t ep_num); /*!< device data out handler */ + + uint8_t (*SOF) (usb_dev *udev); /*!< Start of frame handler */ + + uint8_t (*incomplete_isoc_in) (usb_dev *udev); /*!< Incomplete synchronization IN transfer handler */ + uint8_t (*incomplete_isoc_out) (usb_dev *udev); /*!< Incomplete synchronization OUT transfer handler */ +} usb_class_core; + +typedef struct _usb_perp_dev +{ + uint8_t config; /*!< configuration */ + uint8_t dev_addr; /*!< device address */ + + __IO uint8_t cur_status; /*!< current status */ + __IO uint8_t backup_status; /*!< backup status */ + + usb_transc transc_in[USBFS_MAX_TX_FIFOS]; /*!< endpoint IN transaction */ + usb_transc transc_out[USBFS_MAX_TX_FIFOS]; /*!< endpoint OUT transaction */ + + usb_pm pm; /*!< power management */ + usb_desc desc; /*!< USB descriptors */ + usb_control control; /*!< USB control information */ + + usb_class_core *class_core; /*!< class driver */ +} usb_perp_dev; + +typedef struct _usb_core_driver +{ + usb_core_basic bp; /*!< USB basic parameters */ + usb_core_regs regs; /*!< USB registers */ + usb_perp_dev dev; /*!< USB peripheral device */ +} usb_core_driver; + +/* function declarations */ + +/* initialize USB core registers for device mode */ +usb_status usb_devcore_init (usb_core_driver *udev); + +/* enable the USB device mode interrupts */ +usb_status usb_devint_enable (usb_core_driver *udev); + +/* active the usb transaction */ +usb_status usb_transc_active (usb_core_driver *udev, usb_transc *transc); + +/* deactive the usb transaction */ +usb_status usb_transc_deactivate (usb_core_driver *udev, usb_transc *transc); + +/* configure usb transaction to start IN transfer */ +usb_status usb_transc_inxfer (usb_core_driver *udev, usb_transc *transc); + +/* configure usb transaction to start OUT transfer */ +usb_status usb_transc_outxfer (usb_core_driver *udev, usb_transc *transc); + +/* set the usb transaction STALL status */ +usb_status usb_transc_stall (usb_core_driver *udev, usb_transc *transc); + +/* clear the usb transaction STALL status */ +usb_status usb_transc_clrstall (usb_core_driver *udev, usb_transc *transc); + +/* read device all OUT endpoint interrupt register */ +uint32_t usb_oepintnum_read (usb_core_driver *udev); + +/* read device OUT endpoint interrupt flag register */ +uint32_t usb_oepintr_read (usb_core_driver *udev, uint8_t ep_num); + +/* read device all IN endpoint interrupt register */ +uint32_t usb_iepintnum_read (usb_core_driver *udev); + +/* read device IN endpoint interrupt flag register */ +uint32_t usb_iepintr_read (usb_core_driver *udev, uint8_t ep_num); + +/* config the USB device to be disconnected */ +void usb_dev_disconnect (usb_core_driver *udev); + +/* config the USB device to be connected */ +void usb_dev_connect (usb_core_driver *udev); + +/* set the USB device address */ +void usb_devaddr_set (usb_core_driver *pudev, uint8_t dev_addr); + +/* configures OUT endpoint 0 to receive SETUP packets */ +void usb_ctlep_startout (usb_core_driver *udev); + +/* active remote wakeup signalling */ +void usb_rwkup_active (usb_core_driver *udev); + +/* reset remote wakeup signalling */ +void usb_rwkup_reset (usb_core_driver *udev); + +/* set remote wakeup signalling */ +void usb_rwkup_set (usb_core_driver *udev); + +/* active USB core clock */ +void usb_clock_active (usb_core_driver *udev); + +/* usb device suspend */ +void usb_dev_suspend (usb_core_driver *udev); + +/* stop the device and clean up fifos */ +void usb_dev_stop (usb_core_driver *udev); + +#endif /* __DRV_USB_DEV_H */ + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_host.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_host.h new file mode 100644 index 0000000..e31f3e5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_host.h @@ -0,0 +1,175 @@ +/*! + \file drv_usb_host.h + \brief USB host mode low level driver header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __DRV_USB_HOST_H +#define __DRV_USB_HOST_H + +#include "drv_usb_regs.h" +#include "usb_ch9_std.h" +#include "drv_usb_core.h" + +typedef enum _usb_pipe_status +{ + PIPE_IDLE = 0U, + PIPE_XF, + PIPE_HALTED, + PIPE_NAK, + PIPE_NYET, + PIPE_STALL, + PIPE_TRACERR, + PIPE_BBERR, + PIPE_REQOVR, + PIPE_DTGERR, +} usb_pipe_staus; + +typedef enum _usb_pipe_mode +{ + PIPE_PERIOD = 0U, + PIPE_NON_PERIOD = 1U +} usb_pipe_mode; + +typedef enum _usb_urb_state +{ + URB_IDLE = 0U, + URB_DONE, + URB_NOTREADY, + URB_ERROR, + URB_STALL +} usb_urb_state; + +typedef struct _usb_pipe +{ + uint8_t in_used; + uint8_t dev_addr; + uint32_t dev_speed; + + struct { + uint8_t num; + uint8_t dir; + uint8_t type; + uint16_t mps; + } ep; + + uint8_t ping; + uint32_t DPID; + + uint8_t *xfer_buf; + uint32_t xfer_len; + uint32_t xfer_count; + + uint8_t data_toggle_in; + uint8_t data_toggle_out; + + __IO uint32_t err_count; + __IO usb_pipe_staus pp_status; + __IO usb_urb_state urb_state; +} usb_pipe; + + +typedef struct _usb_host_drv +{ + uint8_t rx_buf[512U]; + __IO uint32_t connect_status; + __IO uint32_t port_enabled; + __IO uint32_t backup_xfercount[USBFS_MAX_TX_FIFOS]; + + usb_pipe pipe[USBFS_MAX_TX_FIFOS]; +} usb_host_drv; + +typedef struct _usb_core_driver +{ + usb_core_basic bp; + + usb_core_regs regs; + + usb_host_drv host; +} usb_core_driver; + +/* initializes USB core for host mode */ +usb_status usb_host_init (usb_core_driver *pudev); + +/* initialize host pipe */ +usb_status usb_pipe_init (usb_core_driver *pudev, uint8_t pipe_num); + +/* prepare host pipe for transferring packets */ +usb_status usb_pipe_xfer (usb_core_driver *pudev, uint8_t pipe_num); + +/* halt host pipe */ +usb_status usb_pipe_halt (usb_core_driver *pudev, uint8_t pipe_num); + +/* configure host pipe to do ping operation */ +usb_status usb_pipe_ping (usb_core_driver *pudev, uint8_t pipe_num); + +/* reset host port */ +uint32_t usb_port_reset (usb_core_driver *pudev); + +/* control the VBUS to power */ +void usb_portvbus_switch (usb_core_driver *pudev, uint8_t state); + +/* stop the USB host and clean up FIFO */ +void usb_host_stop (usb_core_driver *pudev); + +//__STATIC_INLINE uint8_t usb_frame_even (usb_core_driver *pudev) +uint32_t usb_frame_even (usb_core_driver *pudev); +//{ + // return !(pudev->regs.hr->HFINFR & 0x01U); +//} + +//__STATIC_INLINE void usb_phyclock_config (usb_core_driver *pudev, uint8_t clock) +void usb_phyclock_config (usb_core_driver *pudev, uint8_t clock) ; +//{ + //pudev->regs.hr->HCTL &= ~HCTL_CLKSEL; + // pudev->regs.hr->HCTL |= clock; +//} + +uint32_t usb_port_read (usb_core_driver *pudev); +//inline uint32_t usb_port_read (usb_core_driver *pudev) +//{ + // return *pudev->regs.HPCS & ~(HPCS_PE | HPCS_PCD | HPCS_PEDC); +//} + +uint32_t usb_curspeed_get (usb_core_driver *pudev); + +//inline uint32_t usb_curspeed_get (usb_core_driver *pudev) +//{ + // return *pudev->regs.HPCS & HPCS_PS; +//} + +//__STATIC_INLINE uint32_t usb_curframe_get (usb_core_driver *pudev) +uint32_t usb_curframe_get (usb_core_driver *pudev); +//{ + // return (pudev->regs.hr->HFINFR & 0xFFFFU); +//} + +#endif /* __DRV_USB_HOST_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h new file mode 100644 index 0000000..058efa8 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_hw.h @@ -0,0 +1,62 @@ +/*! + \file drv_usb_hw.h + \brief usb hardware configuration header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __DRV_USB_HW_H +#define __DRV_USB_HW_H + +#include "usb_conf.h" + +/* configure USB clock */ +void usb_rcu_config (void); + +/* configure USB interrupt */ +void usb_intr_config (void); + +/* initializes delay unit using Timer2 */ +void usb_timer_init (void); + +/* delay in micro seconds */ +void usb_udelay (const uint32_t usec); + +/* delay in milli seconds */ +void usb_mdelay (const uint32_t msec); + +#ifdef USE_HOST_MODE +/* configure USB VBus */ + void usb_vbus_config (void); +/* drive usb VBus */ + void usb_vbus_drive (uint8_t State); +#endif /* USE_HOST_MODE */ + +#endif /* __DRV_USB_HW_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h new file mode 100644 index 0000000..451fd6f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usb_regs.h @@ -0,0 +1,666 @@ +/*! + \file drv_usb_regs.h + \brief USB cell registers definition and handle macros + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __DRV_USB_REGS_H +#define __DRV_USB_REGS_H + +#include "usb_conf.h" + +#define USBHS_REG_BASE 0x40040000L /*!< base address of USBHS registers */ +#define USBFS_REG_BASE 0x50000000L /*!< base address of USBFS registers */ + +#define USBFS_MAX_TX_FIFOS 15 /*!< FIFO number */ + +#define USBFS_MAX_PACKET_SIZE 64U /*!< USBFS max packet size */ +#define USBFS_MAX_CHANNEL_COUNT 8U /*!< USBFS host channel count */ +#define USBFS_MAX_EP_COUNT 4U /*!< USBFS device endpoint count */ +#define USBFS_MAX_FIFO_WORDLEN 320U /*!< USBFS max fifo size in words */ + +#define USBHS_MAX_PACKET_SIZE 512U /*!< USBHS max packet size */ +#define USBHS_MAX_CHANNEL_COUNT 12U /*!< USBHS host channel count */ +#define USBHS_MAX_EP_COUNT 6U /*!< USBHS device endpoint count */ +#define USBHS_MAX_FIFO_WORDLEN 1280U /*!< USBHS max fifo size in words */ + +#define USB_DATA_FIFO_OFFSET 0x1000U /*!< USB data fifo offset */ +#define USB_DATA_FIFO_SIZE 0x1000U /*!< USB data fifo size */ + +typedef enum +{ + USB_CORE_ENUM_HS = 0, /*!< USB core type is HS */ + USB_CORE_ENUM_FS = 1 /*!< USB core type is FS */ +} usb_core_enum; + +enum usb_reg_offset { + USB_REG_OFFSET_CORE = 0x0000U, /*!< global OTG control and status register */ + USB_REG_OFFSET_DEV = 0x0800U, /*!< device mode control and status registers */ + USB_REG_OFFSET_EP = 0x0020U, + USB_REG_OFFSET_EP_IN = 0x0900U, /*!< device IN endpoint 0 control register */ + USB_REG_OFFSET_EP_OUT = 0x0B00U, /*!< device OUT endpoint 0 control register */ + USB_REG_OFFSET_HOST = 0x0400U, /*!< host control register */ + USB_REG_OFFSET_CH = 0x0020U, + USB_REG_OFFSET_PORT = 0x0440U, /*!< host port control and status register */ + USB_REG_OFFSET_CH_INOUT = 0x0500U, /*!< Host channel-x control registers */ + USB_REG_OFFSET_PWRCLKCTL = 0x0E00U, /*!< power and clock register */ +}; + +typedef struct +{ + __IO uint32_t GOTGCS; /*!< USB global OTG control and status register 000h */ + __IO uint32_t GOTGINTF; /*!< USB global OTG interrupt flag register 004h */ + __IO uint32_t GAHBCS; /*!< USB global AHB control and status register 008h */ + __IO uint32_t GUSBCS; /*!< USB global USB control and status register 00Ch */ + __IO uint32_t GRSTCTL; /*!< USB global reset control register 010h */ + __IO uint32_t GINTF; /*!< USB global interrupt flag register 014h */ + __IO uint32_t GINTEN; /*!< USB global interrupt enable register 018h */ + __IO uint32_t GRSTATR; /*!< USB receive status debug read register 01Ch */ + __IO uint32_t GRSTATP; /*!< USB receive status and pop register 020h */ + __IO uint32_t GRFLEN; /*!< USB global receive FIFO length register 024h */ + __IO uint32_t DIEP0TFLEN_HNPTFLEN; /*!< USB device IN endpoint 0/host non-periodic transmit FIFO length register 028h */ + __IO uint32_t HNPTFQSTAT; /*!< USB host non-periodic FIFO/queue status register 02Ch */ + uint32_t Reserved30[2]; /*!< Reserved 030h */ + __IO uint32_t GCCFG; /*!< USB global core configuration register 038h */ + __IO uint32_t CID; /*!< USB core ID register 03Ch */ + uint32_t Reserved40[48]; /*!< Reserved 040h-0FFh */ + __IO uint32_t HPTFLEN; /*!< USB host periodic transmit FIFO length register 100h */ + __IO uint32_t DIEPTFLEN[15]; /*!< USB device IN endpoint transmit FIFO length register 104h */ +} usb_gr; + + +typedef struct +{ + __IO uint32_t HCTL; /*!< USB host control register 400h */ + __IO uint32_t HFT; /*!< USB host frame interval register 404h */ + __IO uint32_t HFINFR; /*!< USB host frame information remaining register 408h */ + uint32_t Reserved40C; /*!< Reserved 40Ch */ + __IO uint32_t HPTFQSTAT; /*!< USB host periodic transmit FIFO/queue status register 410h */ + __IO uint32_t HACHINT; /*!< USB host all channels interrupt register 414h */ + __IO uint32_t HACHINTEN; /*!< USB host all channels interrupt enable register 418h */ +} usb_hr; + +typedef struct +{ + __IO uint32_t HCHCTL; /*!< USB host channel control register 500h */ + __IO uint32_t HCHSTCTL; /*!< Reserved 504h */ + __IO uint32_t HCHINTF; /*!< USB host channel interrupt flag register 508h */ + __IO uint32_t HCHINTEN; /*!< USB host channel interrupt enable register 50Ch */ + __IO uint32_t HCHLEN; /*!< USB host channel transfer length register 510h */ + __IO uint32_t HCHDMAADDR; /*!< USB host channel-x DMA address register 514h*/ + uint32_t Reserved[2]; +} usb_pr; + +typedef struct +{ + __IO uint32_t DCFG; /*!< USB device configuration register 800h */ + __IO uint32_t DCTL; /*!< USB device control register 804h */ + __IO uint32_t DSTAT; /*!< USB device status register 808h */ + uint32_t Reserved0C; /*!< Reserved 80Ch */ + __IO uint32_t DIEPINTEN; /*!< USB device IN endpoint common interrupt enable register 810h */ + __IO uint32_t DOEPINTEN; /*!< USB device OUT endpoint common interrupt enable register 814h */ + __IO uint32_t DAEPINT; /*!< USB device all endpoints interrupt register 818h */ + __IO uint32_t DAEPINTEN; /*!< USB device all endpoints interrupt enable register 81Ch */ + uint32_t Reserved20; /*!< Reserved 820h */ + uint32_t Reserved24; /*!< Reserved 824h */ + __IO uint32_t DVBUSDT; /*!< USB device VBUS discharge time register 828h */ + __IO uint32_t DVBUSPT; /*!< USB device VBUS pulsing time register 82Ch */ + __IO uint32_t DTHRCTL; /*!< dev thr 830h */ + __IO uint32_t DIEPFEINTEN; /*!< USB Device IN endpoint FIFO empty interrupt enable register 834h */ + __IO uint32_t DEP1INT; /*!< USB device endpoint 1 interrupt register 838h */ + __IO uint32_t DEP1INTEN; /*!< USB device endpoint 1 interrupt enable register 83Ch */ + uint32_t Reserved40; /*!< Reserved 840h */ + __IO uint32_t DIEP1INTEN; /*!< USB device IN endpoint-1 interrupt enable register 844h */ + uint32_t Reserved48[15]; /*!< Reserved 848-880h */ + __IO uint32_t DOEP1INTEN; /*!< USB device OUT endpoint-1 interrupt enable register 884h */ +} usb_dr; + +typedef struct +{ + __IO uint32_t DIEPCTL; /*!< USB device IN endpoint control register 900h + (EpNum * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved 900h + (EpNum * 20h) + 04h */ + __IO uint32_t DIEPINTF; /*!< USB device IN endpoint interrupt flag register 900h + (EpNum * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved 900h + (EpNum * 20h) + 0Ch */ + __IO uint32_t DIEPLEN; /*!< USB device IN endpoint transfer length register 900h + (EpNum * 20h) + 10h */ + __IO uint32_t DIEPDMAADDR; /*!< Device IN endpoint-x DMA address register 900h + (EpNum * 20h) + 14h */ + __IO uint32_t DIEPTFSTAT; /*!< USB device IN endpoint transmit FIFO status register 900h + (EpNum * 20h) + 18h */ +} usb_erin; + +typedef struct +{ + __IO uint32_t DOEPCTL; /*!< USB device IN endpoint control register B00h + (EpNum * 20h) + 00h */ + uint32_t Reserved04; /*!< Reserved B00h + (EpNum * 20h) + 04h */ + __IO uint32_t DOEPINTF; /*!< USB device IN endpoint interrupt flag register B00h + (EpNum * 20h) + 08h */ + uint32_t Reserved0C; /*!< Reserved B00h + (EpNum * 20h) + 0Ch */ + __IO uint32_t DOEPLEN; /*!< USB device IN endpoint transfer length register B00h + (EpNum * 20h) + 10h */ + __IO uint32_t DOEPDMAADDR; /*!< Device OUT endpoint-x DMA address register B00h + (EpNum * 20h) + 0Ch */ +} usb_erout; + +typedef struct _usb_regs +{ + usb_gr *gr; /*!< USBFS global registers */ + usb_dr *dr; /*!< Device control and status registers */ + usb_hr *hr; /*!< Host control and status registers */ + usb_erin *er_in[6]; /*!< USB device IN endpoint register */ + usb_erout *er_out[6]; /*!< USB device OUT endpoint register */ + usb_pr *pr[15]; /*!< USB Host channel-x control register */ + + __IO uint32_t *HPCS; /*!< USB host port control and status register */ + __IO uint32_t *DFIFO[USBFS_MAX_TX_FIFOS]; + __IO uint32_t *PWRCLKCTL; /*!< USB power and clock control register */ +} usb_core_regs; + +/* global OTG control and status register bits definitions */ +#define GOTGCS_BSV BIT(19) /*!< B-Session Valid */ +#define GOTGCS_ASV BIT(18) /*!< A-session valid */ +#define GOTGCS_DI BIT(17) /*!< debounce interval */ +#define GOTGCS_CIDPS BIT(16) /*!< id pin status */ +#define GOTGCS_DHNPEN BIT(11) /*!< device HNP enable */ +#define GOTGCS_HHNPEN BIT(10) /*!< host HNP enable */ +#define GOTGCS_HNPREQ BIT(9) /*!< HNP request */ +#define GOTGCS_HNPS BIT(8) /*!< HNP successes */ +#define GOTGCS_SRPREQ BIT(1) /*!< SRP request */ +#define GOTGCS_SRPS BIT(0) /*!< SRP successes */ + +/* global OTG interrupt flag register bits definitions */ +#define GOTGINTF_DF BIT(19) /*!< debounce finish */ +#define GOTGINTF_ADTO BIT(18) /*!< A-device timeout */ +#define GOTGINTF_HNPDET BIT(17) /*!< host negotiation request detected */ +#define GOTGINTF_HNPEND BIT(9) /*!< HNP end */ +#define GOTGINTF_SRPEND BIT(8) /*!< SRP end */ +#define GOTGINTF_SESEND BIT(2) /*!< session end */ + +/* global AHB control and status register bits definitions */ +#define GAHBCS_PTXFTH BIT(8) /*!< periodic Tx FIFO threshold */ +#define GAHBCS_TXFTH BIT(7) /*!< tx FIFO threshold */ +#define GAHBCS_DMAEN BIT(5) /*!< DMA function Enable */ +#define GAHBCS_BURST BITS(1, 4) /*!< the AHB burst type used by DMA */ +#define GAHBCS_GINTEN BIT(0) /*!< global interrupt enable */ + +/* global USB control and status register bits definitions */ +#define GUSBCS_FDM BIT(30) /*!< force device mode */ +#define GUSBCS_FHM BIT(29) /*!< force host mode */ +#define GUSBCS_ULPIEOI BIT(21) /*!< ULPI external over-current indicator */ +#define GUSBCS_ULPIEVD BIT(20) /*!< ULPI external VBUS driver */ +#define GUSBCS_UTT BITS(10, 13) /*!< USB turnaround time */ +#define GUSBCS_HNPCEN BIT(9) /*!< HNP capability enable */ +#define GUSBCS_SRPCEN BIT(8) /*!< SRP capability enable */ +#define GUSBCS_EMBPHY BIT(6) /*!< embedded PHY selected */ +#define GUSBCS_TOC BITS(0, 2) /*!< timeout calibration */ + +/* global reset control register bits definitions */ +#define GRSTCTL_DMAIDL BIT(31) /*!< DMA idle state */ +#define GRSTCTL_DMABSY BIT(30) /*!< DMA busy */ +#define GRSTCTL_TXFNUM BITS(6, 10) /*!< tx FIFO number */ +#define GRSTCTL_TXFF BIT(5) /*!< tx FIFO flush */ +#define GRSTCTL_RXFF BIT(4) /*!< rx FIFO flush */ +#define GRSTCTL_HFCRST BIT(2) /*!< host frame counter reset */ +#define GRSTCTL_HCSRST BIT(1) /*!< HCLK soft reset */ +#define GRSTCTL_CSRST BIT(0) /*!< core soft reset */ + +/* global interrupt flag register bits definitions */ +#define GINTF_WKUPIF BIT(31) /*!< wakeup interrupt flag */ +#define GINTF_SESIF BIT(30) /*!< session interrupt flag */ +#define GINTF_DISCIF BIT(29) /*!< disconnect interrupt flag */ +#define GINTF_IDPSC BIT(28) /*!< id pin status change */ +#define GINTF_PTXFEIF BIT(26) /*!< periodic tx FIFO empty interrupt flag */ +#define GINTF_HCIF BIT(25) /*!< host channels interrupt flag */ +#define GINTF_HPIF BIT(24) /*!< host port interrupt flag */ +#define GINTF_PXNCIF BIT(21) /*!< periodic transfer not complete interrupt flag */ +#define GINTF_ISOONCIF BIT(21) /*!< isochronous OUT transfer not complete interrupt flag */ +#define GINTF_ISOINCIF BIT(20) /*!< isochronous IN transfer not complete interrupt flag */ +#define GINTF_OEPIF BIT(19) /*!< OUT endpoint interrupt flag */ +#define GINTF_IEPIF BIT(18) /*!< IN endpoint interrupt flag */ +#define GINTF_EOPFIF BIT(15) /*!< end of periodic frame interrupt flag */ +#define GINTF_ISOOPDIF BIT(14) /*!< isochronous OUT packet dropped interrupt flag */ +#define GINTF_ENUMFIF BIT(13) /*!< enumeration finished */ +#define GINTF_RST BIT(12) /*!< USB reset */ +#define GINTF_SP BIT(11) /*!< USB suspend */ +#define GINTF_ESP BIT(10) /*!< early suspend */ +#define GINTF_GONAK BIT(7) /*!< global OUT NAK effective */ +#define GINTF_GNPINAK BIT(6) /*!< global IN non-periodic NAK effective */ +#define GINTF_NPTXFEIF BIT(5) /*!< non-periodic tx FIFO empty interrupt flag */ +#define GINTF_RXFNEIF BIT(4) /*!< rx FIFO non-empty interrupt flag */ +#define GINTF_SOF BIT(3) /*!< start of frame */ +#define GINTF_OTGIF BIT(2) /*!< OTG interrupt flag */ +#define GINTF_MFIF BIT(1) /*!< mode fault interrupt flag */ +#define GINTF_COPM BIT(0) /*!< current operation mode */ + +/* global interrupt enable register bits definitions */ +#define GINTEN_WKUPIE BIT(31) /*!< wakeup interrupt enable */ +#define GINTEN_SESIE BIT(30) /*!< session interrupt enable */ +#define GINTEN_DISCIE BIT(29) /*!< disconnect interrupt enable */ +#define GINTEN_IDPSCIE BIT(28) /*!< id pin status change interrupt enable */ +#define GINTEN_PTXFEIE BIT(26) /*!< periodic tx FIFO empty interrupt enable */ +#define GINTEN_HCIE BIT(25) /*!< host channels interrupt enable */ +#define GINTEN_HPIE BIT(24) /*!< host port interrupt enable */ +#define GINTEN_IPXIE BIT(21) /*!< periodic transfer not complete interrupt enable */ +#define GINTEN_ISOONCIE BIT(21) /*!< isochronous OUT transfer not complete interrupt enable */ +#define GINTEN_ISOINCIE BIT(20) /*!< isochronous IN transfer not complete interrupt enable */ +#define GINTEN_OEPIE BIT(19) /*!< OUT endpoints interrupt enable */ +#define GINTEN_IEPIE BIT(18) /*!< IN endpoints interrupt enable */ +#define GINTEN_EOPFIE BIT(15) /*!< end of periodic frame interrupt enable */ +#define GINTEN_ISOOPDIE BIT(14) /*!< isochronous OUT packet dropped interrupt enable */ +#define GINTEN_ENUMFIE BIT(13) /*!< enumeration finish enable */ +#define GINTEN_RSTIE BIT(12) /*!< USB reset interrupt enable */ +#define GINTEN_SPIE BIT(11) /*!< USB suspend interrupt enable */ +#define GINTEN_ESPIE BIT(10) /*!< early suspend interrupt enable */ +#define GINTEN_GONAKIE BIT(7) /*!< global OUT NAK effective interrupt enable */ +#define GINTEN_GNPINAKIE BIT(6) /*!< global non-periodic IN NAK effective interrupt enable */ +#define GINTEN_NPTXFEIE BIT(5) /*!< non-periodic Tx FIFO empty interrupt enable */ +#define GINTEN_RXFNEIE BIT(4) /*!< receive FIFO non-empty interrupt enable */ +#define GINTEN_SOFIE BIT(3) /*!< start of frame interrupt enable */ +#define GINTEN_OTGIE BIT(2) /*!< OTG interrupt enable */ +#define GINTEN_MFIE BIT(1) /*!< mode fault interrupt enable */ + +/* global receive status read and pop register bits definitions */ +#define GRSTATRP_RPCKST BITS(17, 20) /*!< received packet status */ +#define GRSTATRP_DPID BITS(15, 16) /*!< data PID */ +#define GRSTATRP_BCOUNT BITS(4, 14) /*!< byte count */ +#define GRSTATRP_CNUM BITS(0, 3) /*!< channel number */ +#define GRSTATRP_EPNUM BITS(0, 3) /*!< endpoint number */ + +/* global receive FIFO length register bits definitions */ +#define GRFLEN_RXFD BITS(0, 15) /*!< rx FIFO depth */ + +/* host non-periodic transmit FIFO length register bits definitions */ +#define HNPTFLEN_HNPTXFD BITS(16, 31) /*!< non-periodic Tx FIFO depth */ +#define HNPTFLEN_HNPTXRSAR BITS(0, 15) /*!< non-periodic Tx RAM start address */ + +/** + * @brief USB IN endpoint 0 transmit FIFO length register bits definitions + */ +#define DIEP0TFLEN_IEP0TXFD BITS(16, 31) /*!< IN Endpoint 0 Tx FIFO depth */ +#define DIEP0TFLEN_IEP0TXRSAR BITS(0, 15) /*!< IN Endpoint 0 TX RAM start address */ + +/* host non-periodic transmit FIFO/queue status register bits definitions */ +#define HNPTFQSTAT_NPTXRQTOP BITS(24, 30) /*!< top entry of the non-periodic Tx request queue */ +#define HNPTFQSTAT_NPTXRQS BITS(16, 23) /*!< non-periodic Tx request queue space */ +#define HNPTFQSTAT_NPTXFS BITS(0, 15) /*!< non-periodic Tx FIFO space */ +#define HNPTFQSTAT_CNUM BITS(27, 30) /*!< channel number*/ +#define HNPTFQSTAT_EPNUM BITS(27, 30) /*!< endpoint number */ +#define HNPTFQSTAT_TYPE BITS(25, 26) /*!< token type */ +#define HNPTFQSTAT_TMF BIT(24) /*!< terminate flag */ + +/* global core configuration register bits definitions */ +#define GCCFG_VBUSIG BIT(21) /*!< vbus ignored */ +#define GCCFG_SOFOEN BIT(20) /*!< SOF output enable */ +#define GCCFG_VBUSBCEN BIT(19) /*!< the VBUS B-device comparer enable */ +#define GCCFG_VBUSACEN BIT(18) /*!< the VBUS A-device comparer enable */ +#define GCCFG_PWRON BIT(16) /*!< power on */ + +/* core ID register bits definitions */ +#define CID_CID BITS(0, 31) /*!< core ID */ + +/* host periodic transmit FIFO length register bits definitions */ +#define HPTFLEN_HPTXFD BITS(16, 31) /*!< host periodic Tx FIFO depth */ +#define HPTFLEN_HPTXFSAR BITS(0, 15) /*!< host periodic Tx RAM start address */ + +/* device IN endpoint transmit FIFO length register bits definitions */ +#define DIEPTFLEN_IEPTXFD BITS(16, 31) /*!< IN endpoint Tx FIFO x depth */ +#define DIEPTFLEN_IEPTXRSAR BITS(0, 15) /*!< IN endpoint FIFOx Tx x RAM start address */ + +/* host control register bits definitions */ +#define HCTL_SPDFSLS BIT(2) /*!< speed limited to FS and LS */ +#define HCTL_CLKSEL BITS(0, 1) /*!< clock select for USB clock */ + +/* host frame interval register bits definitions */ +#define HFT_FRI BITS(0, 15) /*!< frame interval */ + +/* host frame information remaining register bits definitions */ +#define HFINFR_FRT BITS(16, 31) /*!< frame remaining time */ +#define HFINFR_FRNUM BITS(0, 15) /*!< frame number */ + +/* host periodic transmit FIFO/queue status register bits definitions */ +#define HPTFQSTAT_PTXREQT BITS(24, 31) /*!< top entry of the periodic Tx request queue */ +#define HPTFQSTAT_PTXREQS BITS(16, 23) /*!< periodic Tx request queue space */ +#define HPTFQSTAT_PTXFS BITS(0, 15) /*!< periodic Tx FIFO space */ +#define HPTFQSTAT_OEFRM BIT(31) /*!< odd/eveb frame */ +#define HPTFQSTAT_CNUM BITS(27, 30) /*!< channel number */ +#define HPTFQSTAT_EPNUM BITS(27, 30) /*!< endpoint number */ +#define HPTFQSTAT_TYPE BITS(25, 26) /*!< token type */ +#define HPTFQSTAT_TMF BIT(24) /*!< terminate flag */ + + +#define TFQSTAT_TXFS BITS(0, 15) +#define TFQSTAT_CNUM BITS(27, 30) + +/* host all channels interrupt register bits definitions */ +#define HACHINT_HACHINT BITS(0, 11) /*!< host all channel interrupts */ + +/* host all channels interrupt enable register bits definitions */ +#define HACHINTEN_CINTEN BITS(0, 11) /*!< channel interrupt enable */ + +/* host port control and status register bits definitions */ +#define HPCS_PS BITS(17, 18) /*!< port speed */ +#define HPCS_PP BIT(12) /*!< port power */ +#define HPCS_PLST BITS(10, 11) /*!< port line status */ +#define HPCS_PRST BIT(8) /*!< port reset */ +#define HPCS_PSP BIT(7) /*!< port suspend */ +#define HPCS_PREM BIT(6) /*!< port resume */ +#define HPCS_PEDC BIT(3) /*!< port enable/disable change */ +#define HPCS_PE BIT(2) /*!< port enable */ +#define HPCS_PCD BIT(1) /*!< port connect detected */ +#define HPCS_PCST BIT(0) /*!< port connect status */ + +/* host channel-x control register bits definitions */ +#define HCHCTL_CEN BIT(31) /*!< channel enable */ +#define HCHCTL_CDIS BIT(30) /*!< channel disable */ +#define HCHCTL_ODDFRM BIT(29) /*!< odd frame */ +#define HCHCTL_DAR BITS(22, 28) /*!< device address */ +#define HCHCTL_MPC BITS(20, 21) /*!< multiple packet count */ +#define HCHCTL_EPTYPE BITS(18, 19) /*!< endpoint type */ +#define HCHCTL_LSD BIT(17) /*!< low-speed device */ +#define HCHCTL_EPDIR BIT(15) /*!< endpoint direction */ +#define HCHCTL_EPNUM BITS(11, 14) /*!< endpoint number */ +#define HCHCTL_MPL BITS(0, 10) /*!< maximum packet length */ + +/* host channel-x split transaction register bits definitions */ +#define HCHSTCTL_SPLEN BIT(31) /*!< enable high-speed split transaction */ +#define HCHSTCTL_CSPLT BIT(16) /*!< complete-split enable */ +#define HCHSTCTL_ISOPCE BITS(14, 15) /*!< isochronous OUT payload continuation encoding */ +#define HCHSTCTL_HADDR BITS(7, 13) /*!< HUB address */ +#define HCHSTCTL_PADDR BITS(0, 6) /*!< port address */ + +/* host channel-x interrupt flag register bits definitions */ +#define HCHINTF_DTER BIT(10) /*!< data toggle error */ +#define HCHINTF_REQOVR BIT(9) /*!< request queue overrun */ +#define HCHINTF_BBER BIT(8) /*!< babble error */ +#define HCHINTF_USBER BIT(7) /*!< USB bus Error */ +#define HCHINTF_NYET BIT(6) /*!< NYET */ +#define HCHINTF_ACK BIT(5) /*!< ACK */ +#define HCHINTF_NAK BIT(4) /*!< NAK */ +#define HCHINTF_STALL BIT(3) /*!< STALL */ +#define HCHINTF_DMAER BIT(2) /*!< DMA error */ +#define HCHINTF_CH BIT(1) /*!< channel halted */ +#define HCHINTF_TF BIT(0) /*!< transfer finished */ + +/* host channel-x interrupt enable register bits definitions */ +#define HCHINTEN_DTERIE BIT(10) /*!< data toggle error interrupt enable */ +#define HCHINTEN_REQOVRIE BIT(9) /*!< request queue overrun interrupt enable */ +#define HCHINTEN_BBERIE BIT(8) /*!< babble error interrupt enable */ +#define HCHINTEN_USBERIE BIT(7) /*!< USB bus error interrupt enable */ +#define HCHINTEN_NYETIE BIT(6) /*!< NYET interrupt enable */ +#define HCHINTEN_ACKIE BIT(5) /*!< ACK interrupt enable */ +#define HCHINTEN_NAKIE BIT(4) /*!< NAK interrupt enable */ +#define HCHINTEN_STALLIE BIT(3) /*!< STALL interrupt enable */ +#define HCHINTEN_DMAERIE BIT(2) /*!< DMA error interrupt enable */ +#define HCHINTEN_CHIE BIT(1) /*!< channel halted interrupt enable */ +#define HCHINTEN_TFIE BIT(0) /*!< transfer finished interrupt enable */ + +/* host channel-x transfer length register bits definitions */ +#define HCHLEN_PING BIT(31) /*!< PING token request */ +#define HCHLEN_DPID BITS(29, 30) /*!< data PID */ +#define HCHLEN_PCNT BITS(19, 28) /*!< packet count */ +#define HCHLEN_TLEN BITS(0, 18) /*!< transfer length */ + +/* host channel-x DMA address register bits definitions */ +#define HCHDMAADDR_DMAADDR BITS(0, 31) /*!< DMA address */ + + +#define PORT_SPEED(x) (((uint32_t)(x) << 17) & HPCS_PS) /*!< Port speed */ + +#define PORT_SPEED_HIGH PORT_SPEED(0) /*!< high speed */ +#define PORT_SPEED_FULL PORT_SPEED(1) /*!< full speed */ +#define PORT_SPEED_LOW PORT_SPEED(2) /*!< low speed */ + +#define PIPE_CTL_DAR(x) (((uint32_t)(x) << 22) & HCHCTL_DAR) /*!< device address */ +#define PIPE_CTL_EPTYPE(x) (((uint32_t)(x) << 18) & HCHCTL_EPTYPE) /*!< endpoint type */ +#define PIPE_CTL_EPNUM(x) (((uint32_t)(x) << 11) & HCHCTL_EPNUM) /*!< endpoint number */ +#define PIPE_CTL_EPDIR(x) (((uint32_t)(x) << 15) & HCHCTL_EPDIR) /*!< endpoint direction */ +#define PIPE_CTL_EPMPL(x) (((uint32_t)(x) << 0) & HCHCTL_MPL) /*!< maximum packet length */ +#define PIPE_CTL_LSD(x) (((uint32_t)(x) << 17) & HCHCTL_LSD) /*!< low-Speed device */ + +#define PIPE_XFER_PCNT(x) (((uint32_t)(x) << 19) & HCHLEN_PCNT) /*!< packet count */ +#define PIPE_XFER_DPID(x) (((uint32_t)(x) << 29) & HCHLEN_DPID) /*!< data PID */ + +#define PIPE_DPID_DATA0 PIPE_XFER_DPID(0) /*!< DATA0 */ +#define PIPE_DPID_DATA1 PIPE_XFER_DPID(2) /*!< DATA1 */ +#define PIPE_DPID_DATA2 PIPE_XFER_DPID(1) /*!< DATA2 */ +#define PIPE_DPID_SETUP PIPE_XFER_DPID(3) /*!< MDATA (non-control)/SETUP (control) */ + +extern const uint32_t PIPE_DPID[]; + +/* device configuration registers bits definitions */ +#define DCFG_EOPFT BITS(11, 12) /*!< end of periodic frame time */ +#define DCFG_DAR BITS(4, 10) /*!< device address */ +#define DCFG_NZLSOH BIT(2) /*!< non-zero-length status OUT handshake */ +#define DCFG_DS BITS(0, 1) /*!< device speed */ + +/* device control registers bits definitions */ +#define DCTL_POIF BIT(11) /*!< power-on initialization finished */ +#define DCTL_CGONAK BIT(10) /*!< clear global OUT NAK */ +#define DCTL_SGONAK BIT(9) /*!< set global OUT NAK */ +#define DCTL_CGINAK BIT(8) /*!< clear global IN NAK */ +#define DCTL_SGINAK BIT(7) /*!< set global IN NAK */ +#define DCTL_GONS BIT(3) /*!< global OUT NAK status */ +#define DCTL_GINS BIT(2) /*!< global IN NAK status */ +#define DCTL_SD BIT(1) /*!< soft disconnect */ +#define DCTL_RWKUP BIT(0) /*!< remote wakeup */ + +/* device status registers bits definitions */ +#define DSTAT_FNRSOF BITS(8, 21) /*!< the frame number of the received SOF. */ +#define DSTAT_ES BITS(1, 2) /*!< enumerated speed */ +#define DSTAT_SPST BIT(0) /*!< suspend status */ + +/* device IN endpoint common interrupt enable registers bits definitions */ +#define DIEPINTEN_NAKEN BIT(13) /*!< NAK handshake sent by USBHS interrupt enable bit */ +#define DIEPINTEN_TXFEEN BIT(7) /*!< transmit FIFO empty interrupt enable bit */ +#define DIEPINTEN_IEPNEEN BIT(6) /*!< IN endpoint NAK effective interrupt enable bit */ +#define DIEPINTEN_EPTXFUDEN BIT(4) /*!< endpoint Tx FIFO underrun interrupt enable bit */ +#define DIEPINTEN_CITOEN BIT(3) /*!< control In Timeout interrupt enable bit */ +#define DIEPINTEN_EPDISEN BIT(1) /*!< endpoint disabled interrupt enable bit */ +#define DIEPINTEN_TFEN BIT(0) /*!< transfer finished interrupt enable bit */ + +/* device OUT endpoint common interrupt enable registers bits definitions */ +#define DOEPINTEN_NYETEN BIT(14) /*!< NYET handshake is sent interrupt enable bit */ +#define DOEPINTEN_BTBSTPEN BIT(6) /*!< back-to-back SETUP packets interrupt enable bit */ +#define DOEPINTEN_EPRXFOVREN BIT(4) /*!< endpoint Rx FIFO overrun interrupt enable bit */ +#define DOEPINTEN_STPFEN BIT(3) /*!< SETUP phase finished interrupt enable bit */ +#define DOEPINTEN_EPDISEN BIT(1) /*!< endpoint disabled interrupt enable bit */ +#define DOEPINTEN_TFEN BIT(0) /*!< transfer finished interrupt enable bit */ + +/* device all endpoints interrupt registers bits definitions */ +#define DAEPINT_OEPITB BITS(16, 21) /*!< device all OUT endpoint interrupt bits */ +#define DAEPINT_IEPITB BITS(0, 5) /*!< device all IN endpoint interrupt bits */ + +/* device all endpoints interrupt enable registers bits definitions */ +#define DAEPINTEN_OEPIE BITS(16, 21) /*!< OUT endpoint interrupt enable */ +#define DAEPINTEN_IEPIE BITS(0, 3) /*!< IN endpoint interrupt enable */ + +/* device Vbus discharge time registers bits definitions */ +#define DVBUSDT_DVBUSDT BITS(0, 15) /*!< device VBUS discharge time */ + +/* device Vbus pulsing time registers bits definitions */ +#define DVBUSPT_DVBUSPT BITS(0, 11) /*!< device VBUS pulsing time */ + +/* device IN endpoint FIFO empty interrupt enable register bits definitions */ +#define DIEPFEINTEN_IEPTXFEIE BITS(0, 5) /*!< IN endpoint Tx FIFO empty interrupt enable bits */ + +/* device endpoint 0 control register bits definitions */ +#define DEP0CTL_EPEN BIT(31) /*!< endpoint enable */ +#define DEP0CTL_EPD BIT(30) /*!< endpoint disable */ +#define DEP0CTL_SNAK BIT(27) /*!< set NAK */ +#define DEP0CTL_CNAK BIT(26) /*!< clear NAK */ +#define DIEP0CTL_TXFNUM BITS(22, 25) /*!< tx FIFO number */ +#define DEP0CTL_STALL BIT(21) /*!< STALL handshake */ +#define DOEP0CTL_SNOOP BIT(20) /*!< snoop mode */ +#define DEP0CTL_EPTYPE BITS(18, 19) /*!< endpoint type */ +#define DEP0CTL_NAKS BIT(17) /*!< NAK status */ +#define DEP0CTL_EPACT BIT(15) /*!< endpoint active */ +#define DEP0CTL_MPL BITS(0, 1) /*!< maximum packet length */ + +/* device endpoint x control register bits definitions */ +#define DEPCTL_EPEN BIT(31) /*!< endpoint enable */ +#define DEPCTL_EPD BIT(30) /*!< endpoint disable */ +#define DEPCTL_SODDFRM BIT(29) /*!< set odd frame */ +#define DEPCTL_SD1PID BIT(29) /*!< set DATA1 PID */ +#define DEPCTL_SEVNFRM BIT(28) /*!< set even frame */ +#define DEPCTL_SD0PID BIT(28) /*!< set DATA0 PID */ +#define DEPCTL_SNAK BIT(27) /*!< set NAK */ +#define DEPCTL_CNAK BIT(26) /*!< clear NAK */ +#define DIEPCTL_TXFNUM BITS(22, 25) /*!< tx FIFO number */ +#define DEPCTL_STALL BIT(21) /*!< STALL handshake */ +#define DOEPCTL_SNOOP BIT(20) /*!< snoop mode */ +#define DEPCTL_EPTYPE BITS(18, 19) /*!< endpoint type */ +#define DEPCTL_NAKS BIT(17) /*!< NAK status */ +#define DEPCTL_EOFRM BIT(16) /*!< even/odd frame */ +#define DEPCTL_DPID BIT(16) /*!< endpoint data PID */ +#define DEPCTL_EPACT BIT(15) /*!< endpoint active */ +#define DEPCTL_MPL BITS(0, 10) /*!< maximum packet length */ + +/* device IN endpoint-x interrupt flag register bits definitions */ +#define DIEPINTF_NAK BIT(13) /*!< NAK handshake sent by USBHS */ +#define DIEPINTF_TXFE BIT(7) /*!< transmit FIFO empty */ +#define DIEPINTF_IEPNE BIT(6) /*!< IN endpoint NAK effective */ +#define DIEPINTF_EPTXFUD BIT(4) /*!< endpoint Tx FIFO underrun */ +#define DIEPINTF_CITO BIT(3) /*!< control In Timeout interrupt */ +#define DIEPINTF_EPDIS BIT(1) /*!< endpoint disabled */ +#define DIEPINTF_TF BIT(0) /*!< transfer finished */ + +/* device OUT endpoint-x interrupt flag register bits definitions */ +#define DOEPINTF_NYET BIT(14) /*!< NYET handshake is sent */ +#define DOEPINTF_BTBSTP BIT(6) /*!< back-to-back SETUP packets */ +#define DOEPINTF_EPRXFOVR BIT(4) /*!< endpoint Rx FIFO overrun */ +#define DOEPINTF_STPF BIT(3) /*!< SETUP phase finished */ +#define DOEPINTF_EPDIS BIT(1) /*!< endpoint disabled */ +#define DOEPINTF_TF BIT(0) /*!< transfer finished */ + +/* device IN endpoint 0 transfer length register bits definitions */ +#define DIEP0LEN_PCNT BITS(19, 20) /*!< packet count */ +#define DIEP0LEN_TLEN BITS(0, 6) /*!< transfer length */ + +/* device OUT endpoint 0 transfer length register bits definitions */ +#define DOEP0LEN_STPCNT BITS(29, 30) /*!< SETUP packet count */ +#define DOEP0LEN_PCNT BIT(19) /*!< packet count */ +#define DOEP0LEN_TLEN BITS(0, 6) /*!< transfer length */ + +/* device OUT endpoint-x transfer length register bits definitions */ +#define DOEPLEN_RXDPID BITS(29, 30) /*!< received data PID */ +#define DOEPLEN_STPCNT BITS(29, 30) /*!< SETUP packet count */ +#define DIEPLEN_MCNT BITS(29, 30) /*!< multi count */ +#define DEPLEN_PCNT BITS(19, 28) /*!< packet count */ +#define DEPLEN_TLEN BITS(0, 18) /*!< transfer length */ + +/* device IN endpoint-x DMA address register bits definitions */ +#define DIEPDMAADDR_DMAADDR BITS(0, 31) /*!< DMA address */ + +/* device OUT endpoint-x DMA address register bits definitions */ +#define DOEPDMAADDR_DMAADDR BITS(0, 31) /*!< DMA address */ + +/* device IN endpoint-x transmit FIFO status register bits definitions */ +#define DIEPTFSTAT_IEPTFS BITS(0, 15) /*!< IN endpoint Tx FIFO space remaining */ + +/* USB power and clock registers bits definition */ +#define PWRCLKCTL_SHCLK BIT(1) /*!< stop HCLK */ +#define PWRCLKCTL_SUCLK BIT(0) /*!< stop the USB clock */ + +#define RSTAT_GOUT_NAK 1U /* global OUT NAK (triggers an interrupt) */ +#define RSTAT_DATA_UPDT 2U /* OUT data packet received */ +#define RSTAT_XFER_COMP 3U /* OUT transfer completed (triggers an interrupt) */ +#define RSTAT_SETUP_COMP 4U /* SETUP transaction completed (triggers an interrupt) */ +#define RSTAT_SETUP_UPDT 6U /* SETUP data packet received */ + +#define DSTAT_EM_HS_PHY_30MHZ_60MHZ 0U /* USB enumerate speed use high-speed PHY clock in 30MHz or 60MHz */ +#define DSTAT_EM_FS_PHY_30MHZ_60MHZ 1U /* USB enumerate speed use full-speed PHY clock in 30MHz or 60MHz */ +#define DSTAT_EM_LS_PHY_6MHZ 2U /* USB enumerate speed use low-speed PHY clock in 6MHz */ +#define DSTAT_EM_FS_PHY_48MHZ 3U /* USB enumerate speed use full-speed PHY clock in 48MHz */ + +#define DPID_DATA0 0U /* device endpoint data PID is DATA0 */ +#define DPID_DATA1 2U /* device endpoint data PID is DATA1 */ +#define DPID_DATA2 1U /* device endpoint data PID is DATA2 */ +#define DPID_MDATA 3U /* device endpoint data PID is MDATA */ + +#define GAHBCS_DMAINCR(regval) (GAHBCS_BURST & ((regval) << 1U)) /*!< AHB burst type used by DMA*/ + +#define DMA_INCR0 GAHBCS_DMAINCR(0U) /*!< single burst type used by DMA*/ +#define DMA_INCR1 GAHBCS_DMAINCR(1U) /*!< 4-beat incrementing burst type used by DMA*/ +#define DMA_INCR4 GAHBCS_DMAINCR(3U) /*!< 8-beat incrementing burst type used by DMA*/ +#define DMA_INCR8 GAHBCS_DMAINCR(5U) /*!< 16-beat incrementing burst type used by DMA*/ +#define DMA_INCR16 GAHBCS_DMAINCR(7U) /*!< 32-beat incrementing burst type used by DMA*/ + +#define DCFG_PFRI(regval) (DCFG_EOPFT & ((regval) << 11U)) /*!< end of periodic frame time configuration */ + +#define FRAME_INTERVAL_80 DCFG_PFRI(0U) /*!< 80% of the frame time */ +#define FRAME_INTERVAL_85 DCFG_PFRI(1U) /*!< 85% of the frame time */ +#define FRAME_INTERVAL_90 DCFG_PFRI(2U) /*!< 90% of the frame time */ +#define FRAME_INTERVAL_95 DCFG_PFRI(3U) /*!< 95% of the frame time */ + +#define DCFG_DEVSPEED(regval) (DCFG_DS & ((regval) << 0U)) /*!< device speed configuration */ + +#define USB_SPEED_EXP_HIGH DCFG_DEVSPEED(0U) /*!< device external PHY high speed */ +#define USB_SPEED_EXP_FULL DCFG_DEVSPEED(1U) /*!< device external PHY full speed */ +#define USB_SPEED_INP_FULL DCFG_DEVSPEED(3U) /*!< device internal PHY full speed */ + +#define DEP0_MPL(regval) (DEP0CTL_MPL & ((regval) << 0U)) /*!< maximum packet length configuration */ + +#define EP0MPL_64 DEP0_MPL(0U) /*!< maximum packet length 64 bytes */ +#define EP0MPL_32 DEP0_MPL(1U) /*!< maximum packet length 32 bytes */ +#define EP0MPL_16 DEP0_MPL(2U) /*!< maximum packet length 16 bytes */ +#define EP0MPL_8 DEP0_MPL(3U) /*!< maximum packet length 8 bytes */ + +#define DOEP0_TLEN(regval) (DOEP0LEN_TLEN & ((regval) << 0)) /*!< Transfer length */ +#define DOEP0_PCNT(regval) (DOEP0LEN_PCNT & ((regval) << 19)) /*!< Packet count */ +#define DOEP0_STPCNT(regval) (DOEP0LEN_STPCNT & ((regval) << 29)) /*!< SETUP packet count */ + +#define USB_ULPI_PHY 1 /*!< ULPI interface external PHY */ +#define USB_EMBEDDED_PHY 2 /*!< Embedded PHY */ + +#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 /*!< device mode */ +#define HOST_MODE 1 /*!< host mode */ +#define OTG_MODE 2 /*!< OTG mode */ + +#define HCTL_30_60MHZ 0 /*!< USB clock 30-60MHZ */ +#define HCTL_48MHZ 1 /*!< USB clock 48MHZ */ +#define HCTL_6MHZ 2 /*!< USB clock 6MHZ */ + +enum USB_SPEED { + USB_SPEED_UNKNOWN = 0, /*!< USB speed unknown */ + USB_SPEED_LOW, /*!< USB speed low */ + USB_SPEED_FULL, /*!< USB speed full */ + USB_SPEED_HIGH /*!< USB speed high */ +}; + +#define EP0_OUT ((uint8_t)0x00) /*!< endpoint out 0 */ +#define EP0_IN ((uint8_t)0x80) /*!< endpoint in 0 */ +#define EP1_OUT ((uint8_t)0x01) /*!< endpoint out 1 */ +#define EP1_IN ((uint8_t)0x81) /*!< endpoint in 1 */ +#define EP2_OUT ((uint8_t)0x02) /*!< endpoint out 2 */ +#define EP2_IN ((uint8_t)0x82) /*!< endpoint in 2 */ +#define EP3_OUT ((uint8_t)0x03) /*!< endpoint out 3 */ +#define EP3_IN ((uint8_t)0x83) /*!< endpoint in 3 */ + +#endif /* __DRV_USB_REGS_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h new file mode 100644 index 0000000..594b3ba --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usbd_int.h @@ -0,0 +1,52 @@ +/*! + \file drv_usbd_int.h + \brief USB device mode interrupt header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __DRV_USBD_INT_H +#define __DRV_USBD_INT_H + +#include "drv_usb_core.h" +#include "drv_usb_dev.h" + +/* USB device-mode interrupts global service routine handler */ +void usbd_isr (usb_core_driver *udev); + +#ifdef USB_HS_DEDICATED_EP1_ENABLED + +uint32_t USBD_OTG_EP1IN_ISR_Handler (usb_core_driver *udev); +uint32_t USBD_OTG_EP1OUT_ISR_Handler (usb_core_driver *udev); + +#endif + +#endif /* __DRV_USBD_INT_H */ + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usbh_int.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usbh_int.h new file mode 100644 index 0000000..5af6e9c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/drv_usbh_int.h @@ -0,0 +1,49 @@ +/*! + \file drv_usbh_int.h.h + \brief USB host mode interrupt management header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __DRV_USBH_INT_H +#define __DRV_USBH_INT_H + +#include "drv_usb_host.h" + +typedef struct _usbh_int_cb +{ + uint8_t (*SOF) (usb_core_driver *pudev); +} usbh_int_cb; + +extern usbh_int_cb *usbh_int_fop; + +uint32_t usbh_isr (usb_core_driver *pudev); + +#endif /* __DRV_USBH_INT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h new file mode 100644 index 0000000..834e751 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usb_ch9_std.h @@ -0,0 +1,237 @@ +/*! + \file usb_ch9_std.h + \brief USB 2.0 standard defines + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USB_CH9_STD_H +#define __USB_CH9_STD_H + +#include "usb_conf.h" + +#define USB_DEV_QUALIFIER_DESC_LEN 0x0AU /*!< USB device qualifier descriptor length */ +#define USB_DEV_DESC_LEN 0x12U /*!< USB device descriptor length */ +#define USB_CFG_DESC_LEN 0x09U /*!< USB configuration descriptor length */ +#define USB_ITF_DESC_LEN 0x09U /*!< USB interface descriptor length */ +#define USB_EP_DESC_LEN 0x07U /*!< USB endpoint descriptor length */ +#define USB_OTG_DESC_LEN 0x03U /*!< USB device OTG descriptor length */ + +#define USB_SETUP_PACKET_LEN 0x08U /*!< USB setup packet length */ + +/* bit 7 of bmRequestType: data phase transfer direction */ +#define USB_TRX_MASK 0x80U /*!< USB transfer direction mask */ +#define USB_TRX_OUT 0x00U /*!< USB transfer OUT direction */ +#define USB_TRX_IN 0x80U /*!< USB transfer IN direction */ + +/* bit 6..5 of bmRequestType: request type */ +#define USB_REQTYPE_STRD 0x00U /*!< USB standard request */ +#define USB_REQTYPE_CLASS 0x20U /*!< USB class request */ +#define USB_REQTYPE_VENDOR 0x40U /*!< USB vendor request */ +#define USB_REQTYPE_MASK 0x60U /*!< USB request mask */ + +#define USBD_BUS_POWERED 0x00U /*!< USB bus power supply */ +#define USBD_SELF_POWERED 0x01U /*!< USB self power supply */ + +#define USB_STATUS_REMOTE_WAKEUP 2U /*!< USB is in remote wakeup status */ +#define USB_STATUS_SELF_POWERED 1U /*!< USB is in self powered status */ + +/* bit 4..0 of bmRequestType: recipient type */ +enum _usb_recp_type { + USB_RECPTYPE_DEV = 0x0U, /*!< USB device request type */ + USB_RECPTYPE_ITF = 0x1U, /*!< USB interface request type */ + USB_RECPTYPE_EP = 0x2U, /*!< USB endpoint request type */ + USB_RECPTYPE_MASK = 0x3U /*!< USB request type mask */ +}; + +/* bRequest value */ +enum _usb_request { + USB_GET_STATUS = 0x0U, /*!< USB get status request */ + USB_CLEAR_FEATURE = 0x1U, /*!< USB clear feature request */ + USB_RESERVED2 = 0x2U, + USB_SET_FEATURE = 0x3U, /*!< USB set feature request */ + USB_RESERVED4 = 0x4U, + USB_SET_ADDRESS = 0x5U, /*!< USB set address request */ + USB_GET_DESCRIPTOR = 0x6U, /*!< USB get descriptor request */ + USB_SET_DESCRIPTOR = 0x7U, /*!< USB set descriptor request */ + USB_GET_CONFIGURATION = 0x8U, /*!< USB get configuration request */ + USB_SET_CONFIGURATION = 0x9U, /*!< USB set configuration request */ + USB_GET_INTERFACE = 0xAU, /*!< USB get interface request */ + USB_SET_INTERFACE = 0xBU, /*!< USB set interface request */ + USB_SYNCH_FRAME = 0xCU /*!< USB synchronize frame request */ +}; + +/* descriptor types of USB specifications */ +enum _usb_desctype { + USB_DESCTYPE_DEV = 0x1U, /*!< USB device descriptor type */ + USB_DESCTYPE_CONFIG = 0x2U, /*!< USB configuration descriptor type */ + USB_DESCTYPE_STR = 0x3U, /*!< USB string descriptor type */ + USB_DESCTYPE_ITF = 0x4U, /*!< USB interface descriptor type */ + USB_DESCTYPE_EP = 0x5U, /*!< USB endpoint descriptor type */ + USB_DESCTYPE_DEV_QUALIFIER = 0x6U, /*!< USB device qualtfier descriptor type */ + USB_DESCTYPE_OTHER_SPD_CONFIG = 0x7U, /*!< USB other speed configuration descriptor type */ + USB_DESCTYPE_ITF_POWER = 0x8U, /*!< USB interface power descriptor type */ + USB_DESCTYPE_BOS = 0xFU /*!< USB BOS descriptor type */ +}; + +/* USB Endpoint Descriptor bmAttributes bit definitions */ +/* bits 1..0 : transfer type */ +enum _usbx_type { + USB_EP_ATTR_CTL = 0x0U, /*!< USB control transfer type */ + USB_EP_ATTR_ISO = 0x1U, /*!< USB Isochronous transfer type */ + USB_EP_ATTR_BULK = 0x2U, /*!< USB Bulk transfer type */ + USB_EP_ATTR_INT = 0x3U /*!< USB Interrupt transfer type */ +}; + +/* bits 3..2 : Sync type (only if ISOCHRONOUS) */ +#define USB_EP_ATTR_NOSYNC 0x00 /* No Synchronization */ +#define USB_EP_ATTR_ASYNC 0x04 /* Asynchronous */ +#define USB_EP_ATTR_ADAPTIVE 0x08 /* Adaptive */ +#define USB_EP_ATTR_SYNC 0x0C /* Synchronous */ +#define USB_EP_ATTR_SYNCTYPE 0x0C /* Synchronous type */ + +/* bits 5..4 : usage type (only if ISOCHRONOUS) */ +#define USB_EP_ATTR_DATA 0x00 /* Data endpoint */ +#define USB_EP_ATTR_FEEDBACK 0x10 /* Feedback endpoint */ +#define USB_EP_ATTR_IMPLICIT_FEEDBACK_DATA 0x20 /* Implicit feedback Data endpoint */ +#define USB_EP_ATTR_USAGETYPE 0x30 /* Usage type */ + +#define FEATURE_SELECTOR_EP 0x00 /* USB endpoint feature selector */ +#define FEATURE_SELECTOR_DEV 0x01 /* USB device feature selector */ + +#define BYTE_SWAP(addr) (((uint16_t)(*((uint8_t *)(addr)))) + \ + (uint16_t)(((uint16_t)(*(((uint8_t *)(addr)) + 1U))) << 8U)) + +#define BYTE_LOW(x) ((uint8_t)((x) & 0x00FFU)) +#define BYTE_HIGH(x) ((uint8_t)(((x) & 0xFF00U) >> 8U)) + +#define USB_MIN(a, b) (((a) < (b)) ? (a) : (b)) + +#define USB_DEFAULT_CONFIG 0U + +/* USB classes */ +#define USB_CLASS_HID 0x03U /*!< USB HID class */ +#define USB_CLASS_MSC 0x08U /*!< USB MSC class */ + +/* use the following values when USB host need to get descriptor */ +#define USBH_DESC(x) (((x)<< 8U) & 0xFF00U) + +/* as per usb specs 9.2.6.4 :standard request with data request timeout: 5sec + standard request with no data stage timeout : 50ms */ +#define DATA_STAGE_TIMEOUT 5000U /*!< USB data stage timeout*/ +#define NODATA_STAGE_TIMEOUT 50U /*!< USB no data stage timeout*/ + +#pragma pack(1) + +/* USB standard device request structure */ +typedef struct _usb_req { + uint8_t bmRequestType; /*!< type of request */ + uint8_t bRequest; /*!< request of setup packet */ + uint16_t wValue; /*!< value of setup packet */ + uint16_t wIndex; /*!< index of setup packet */ + uint16_t wLength; /*!< length of setup packet */ +} usb_req; + +/* USB setup packet define */ +typedef union _usb_setup { + uint8_t data[8]; + + usb_req req; +} usb_setup; + +/* USB descriptor defines */ + +typedef struct _usb_desc_header { + uint8_t bLength; /*!< size of the descriptor */ + uint8_t bDescriptorType; /*!< type of the descriptor */ +} usb_desc_header; + +typedef struct _usb_desc_dev { + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint16_t bcdUSB; /*!< BCD of the supported USB specification */ + uint8_t bDeviceClass; /*!< USB device class */ + uint8_t bDeviceSubClass; /*!< USB device subclass */ + uint8_t bDeviceProtocol; /*!< USB device protocol */ + uint8_t bMaxPacketSize0; /*!< size of the control (address 0) endpoint's bank in bytes */ + uint16_t idVendor; /*!< vendor ID for the USB product */ + uint16_t idProduct; /*!< unique product ID for the USB product */ + uint16_t bcdDevice; /*!< product release (version) number */ + uint8_t iManufacturer; /*!< string index for the manufacturer's name */ + uint8_t iProduct; /*!< string index for the product name/details */ + uint8_t iSerialNumber; /*!< string index for the product's globally unique hexadecimal serial number */ + uint8_t bNumberConfigurations; /*!< total number of configurations supported by the device */ +} usb_desc_dev; + +typedef struct _usb_desc_config { + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint16_t wTotalLength; /*!< size of the configuration descriptor header,and all sub descriptors inside the configuration */ + uint8_t bNumInterfaces; /*!< total number of interfaces in the configuration */ + uint8_t bConfigurationValue; /*!< configuration index of the current configuration */ + uint8_t iConfiguration; /*!< index of a string descriptor describing the configuration */ + uint8_t bmAttributes; /*!< configuration attributes */ + uint8_t bMaxPower; /*!< maximum power consumption of the device while in the current configuration */ +} usb_desc_config; + +typedef struct _usb_desc_itf { + usb_desc_header header; /*!< descriptor header, including type and size */ + + uint8_t bInterfaceNumber; /*!< index of the interface in the current configuration */ + uint8_t bAlternateSetting; /*!< alternate setting for the interface number */ + uint8_t bNumEndpoints; /*!< total number of endpoints in the interface */ + uint8_t bInterfaceClass; /*!< interface class ID */ + uint8_t bInterfaceSubClass; /*!< interface subclass ID */ + uint8_t bInterfaceProtocol; /*!< interface protocol ID */ + uint8_t iInterface; /*!< index of the string descriptor describing the interface */ +} usb_desc_itf; + +typedef struct _usb_desc_ep { + usb_desc_header header; /*!< descriptor header, including type and size. */ + + uint8_t bEndpointAddress; /*!< logical address of the endpoint */ + uint8_t bmAttributes; /*!< endpoint attributes */ + uint16_t wMaxPacketSize; /*!< size of the endpoint bank, in bytes */ + + uint8_t bInterval; /*!< polling interval in milliseconds for the endpoint if it is an INTERRUPT or ISOCHRONOUS type */ +#ifdef AUDIO_ENDPOINT + uint8_t bRefresh; /*!< reset to 0 */ + uint8_t bSynchAddress; /*!< reset to 0 */ +#endif +} usb_desc_ep; + +typedef struct _usb_desc_LANGID { + usb_desc_header header; /*!< descriptor header, including type and size. */ + uint16_t wLANGID; /*!< LANGID code */ +} usb_desc_LANGID; + +#pragma pack() + +#endif /* __USB_CH9_STD_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h new file mode 100644 index 0000000..c4ec47a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbd_core.h @@ -0,0 +1,95 @@ +/*! + \file usbd_core.h + \brief USB device mode core functions protype + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_CORE_H +#define __USBD_CORE_H + + +#include "drv_usb_core.h" +#include "drv_usb_dev.h" + +typedef enum +{ + USBD_OK = 0, /*!< status OK */ + USBD_BUSY, /*!< status busy */ + USBD_FAIL, /*!< status fail */ +} usbd_status; + +enum _usbd_status { + USBD_DEFAULT = 1, /*!< default status */ + USBD_ADDRESSED = 2, /*!< address send status */ + USBD_CONFIGURED = 3, /*!< configured status */ + USBD_SUSPENDED = 4 /*!< suspended status */ +}; + +/* function declarations */ + +/* device connect */ +void usbd_connect (usb_core_driver *udev); + +/* device disconnect */ +void usbd_disconnect (usb_core_driver *udev); + +/* set USB device address */ +void usbd_addr_set (usb_core_driver *udev, uint8_t addr); + +/* initailizes the USB device-mode stack and load the class driver */ +void usbd_init (usb_core_driver *udev, usb_core_enum core, usb_class_core *class_core); + +/* endpoint initialization */ +uint32_t usbd_ep_setup (usb_core_driver *udev, const usb_desc_ep *ep_desc); + +/* configure the endpoint when it is disabled */ +uint32_t usbd_ep_clear (usb_core_driver *udev, uint8_t ep_addr); + +/* endpoint prepare to receive data */ +uint32_t usbd_ep_recev (usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t len); + +/* endpoint prepare to transmit data */ +uint32_t usbd_ep_send (usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t len); + +/* set an endpoint to STALL status */ +uint32_t usbd_ep_stall (usb_core_driver *udev, uint8_t ep_addr); + +/* clear endpoint STALLed status */ +uint32_t usbd_ep_stall_clear (usb_core_driver *udev, uint8_t ep_addr); + +/* flush the endpoint FIFOs */ +uint32_t usbd_fifo_flush (usb_core_driver *udev, uint8_t ep_addr); + +/* get the received data length */ +uint16_t usbd_rxcount_get (usb_core_driver *udev, uint8_t ep_num); + +#endif /* __USBD_CORE_H */ + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h new file mode 100644 index 0000000..676b961 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbd_enum.h @@ -0,0 +1,114 @@ +/*! + \file usbd_enum.h + \brief USB enumeration definitions + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_ENUM_H +#define __USBD_ENUM_H + +#include "usbd_core.h" +#include "usbd_conf.h" +#include + +#ifndef NULL + #define NULL 0U +#endif + +typedef enum _usb_reqsta { + REQ_SUPP = 0x0U, /* request support */ + REQ_NOTSUPP = 0x1U /* request not support */ +} usb_reqsta; + +/* string descriptor index */ +enum _str_index +{ + STR_IDX_LANGID = 0x0U, /* language ID string index */ + STR_IDX_MFC = 0x1U, /* manufacturer string index */ + STR_IDX_PRODUCT = 0x2U, /* product string index */ + STR_IDX_SERIAL = 0x3U, /* serial string index */ + STR_IDX_CONFIG = 0x4U, /* configuration string index */ + STR_IDX_ITF = 0x5U, /* interface string index */ + STR_IDX_MAX = 0x6U /* string maximum index */ +}; + +typedef enum _usb_pwrsta { + USB_PWRSTA_SELF_POWERED = 0x1U, /* USB is in self powered status */ + USB_PWRSTA_REMOTE_WAKEUP = 0x2U, /* USB is in remote wakeup status */ +} usb_pwrsta; + +typedef enum _usb_feature +{ + USB_FEATURE_EP_HALT = 0x0U, /* USB has endpoint halt feature */ + USB_FEATURE_REMOTE_WAKEUP = 0x1U, /* USB has endpoint remote wakeup feature */ + USB_FEATURE_TEST_MODE = 0x2U /* USB has endpoint test mode feature */ +} usb_feature; + +#define ENG_LANGID 0x0409U /* english language ID */ +#define CHN_LANGID 0x0804U /* chinese language ID */ + +/* USB device exported macros */ +#define CTL_EP(ep) (((ep) == 0x00U) || ((ep) == 0x80U)) + +#define WIDE_STRING(string) _WIDE_STRING(string) +#define _WIDE_STRING(string) L##string + +#define USBD_STRING_DESC(string) \ + (void *)&(const struct { \ + uint8_t _len; \ + uint8_t _type; \ + wchar_t _data[sizeof(string)]; \ + }) { \ + sizeof(WIDE_STRING(string)) + 2U - 2U, \ + USB_DESCTYPE_STR, \ + WIDE_STRING(string) \ + } + +/* function declarations */ + +/* handle USB standard device request */ +usb_reqsta usbd_standard_request (usb_core_driver *udev, usb_req *req); + +/* handle USB device class request */ +usb_reqsta usbd_class_request (usb_core_driver *udev, usb_req *req); + +/* handle USB vendor request */ +usb_reqsta usbd_vendor_request (usb_core_driver *udev, usb_req *req); + +/* handle USB enumeration error */ +void usbd_enum_error (usb_core_driver *udev, usb_req *req); + +/* convert hex 32bits value into unicode char */ +void int_to_unicode (uint32_t value, uint8_t *pbuf, uint8_t len); + +#endif /* __USBD_ENUM_H */ + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h new file mode 100644 index 0000000..d5cccbd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbd_transc.h @@ -0,0 +1,64 @@ +/*! + \file usbd_transc.h + \brief USB transaction core functions prototype + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_TRANSC_H +#define __USBD_TRANSC_H + +#include "usbd_core.h" + +/* function declarations */ + +/* USB send data in the control transaction */ +usbd_status usbd_ctl_send (usb_core_driver *udev); + +/* USB receive data in control transaction */ +usbd_status usbd_ctl_recev (usb_core_driver *udev); + +/* USB send control transaction status */ +usbd_status usbd_ctl_status_send (usb_core_driver *udev); + +/* USB control receive status */ +usbd_status usbd_ctl_status_recev (usb_core_driver *udev); + +/* USB setup stage processing */ +uint8_t usbd_setup_transc (usb_core_driver *udev); + +/* data out stage processing */ +uint8_t usbd_out_transc (usb_core_driver *udev, uint8_t ep_num)__attribute__((optimize("O0"))); + +/* data in stage processing */ +uint8_t usbd_in_transc (usb_core_driver *udev, uint8_t ep_num)__attribute__((optimize("O0"))); + +#endif /* __USBD_TRANSC_H */ + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_core.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_core.h new file mode 100644 index 0000000..6ea1344 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_core.h @@ -0,0 +1,219 @@ +/*! + \file usbh_core.h + \brief USB host core state machine header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBH_CORE_H +#define __USBH_CORE_H + +#include "usbh_conf.h" +#include "drv_usb_host.h" + +#define MSC_CLASS 0x08U +#define HID_CLASS 0x03U +#define MSC_PROTOCOL 0x50U +#define CBI_PROTOCOL 0x01U + +#define USBH_MAX_ERROR_COUNT 3U + +#define USBH_DEV_ADDR_DEFAULT 0U +#define USBH_DEV_ADDR 1U + +typedef enum +{ + USBH_OK = 0U, + USBH_BUSY, + USBH_FAIL, + USBH_NOT_SUPPORTED, + USBH_UNRECOVERED_ERROR, + USBH_SPEED_UNKNOWN_ERROR, + USBH_APPLY_DEINIT +} usbh_status; + +/* USB host global operation state */ +typedef enum +{ + HOST_DEFAULT = 0U, + HOST_DETECT_DEV_SPEED, + HOST_DEV_ATTACHED, + HOST_DEV_DETACHED, + HOST_ENUM, + HOST_CLASS_ENUM, + HOST_CLASS_HANDLER, + HOST_USER_INPUT, + HOST_SUSPENDED, + HOST_ERROR +} usb_host_state; + +/* USB host enumeration state */ +typedef enum +{ + ENUM_DEFAULT = 0U, + ENUM_GET_DEV_DESC, + ENUM_SET_ADDR, + ENUM_GET_CFG_DESC, + ENUM_GET_CFG_DESC_SET, + ENUM_GET_STR_DESC, + ENUM_SET_CONFIGURATION, + ENUM_DEV_CONFIGURED +} usbh_enum_state; + +/* USB host control transfer state */ +typedef enum +{ + CTL_IDLE = 0U, + CTL_SETUP, + CTL_DATA_IN, + CTL_DATA_OUT, + CTL_STATUS_IN, + CTL_STATUS_OUT, + CTL_ERROR, + CTL_FINISH +} usbh_ctl_state; + +/* user action state */ +typedef enum +{ + USBH_USER_NO_RESP = 0U, + USBH_USER_RESP_OK = 1U, +} usbh_user_status; + +/* control transfer information */ +typedef struct _usbh_control +{ + uint8_t pipe_in_num; + uint8_t pipe_out_num; + uint8_t max_len; + uint8_t error_count; + + uint8_t *buf; + uint16_t ctl_len; + uint16_t timer; + + usb_setup setup; + usbh_ctl_state ctl_state; +} usbh_control; + +/* USB device property */ +typedef struct +{ + uint8_t addr; + uint32_t speed; + + usb_desc_dev dev_desc; + usb_desc_config cfg_desc; + usb_desc_itf itf_desc[USBH_MAX_INTERFACES_NUM]; + usb_desc_ep ep_desc[USBH_MAX_INTERFACES_NUM][USBH_MAX_EP_NUM]; +} usb_dev_prop; + +/** + * @brief Device class callbacks + */ +typedef struct +{ + usbh_status (*class_init) (usb_core_driver *pudev, void *phost); + void (*class_deinit) (usb_core_driver *pudev, void *phost); + usbh_status (*class_requests) (usb_core_driver *pudev, void *phost); + usbh_status (*class_machine) (usb_core_driver *pudev, void *phost); +} usbh_class_cb; + +/** + * @brief User callbacks + */ +typedef struct +{ + void (*dev_init) (void); + void (*dev_deinit) (void); + void (*dev_attach) (void); + void (*dev_reset) (void); + void (*dev_detach) (void); + void (*dev_over_currented) (void); + void (*dev_speed_detected) (uint32_t dev_speed); + void (*dev_devdesc_assigned) (void *dev_desc); + void (*dev_address_set) (void); + + void (*dev_cfgdesc_assigned) (usb_desc_config *cfg_desc, + usb_desc_itf *itf_desc, + usb_desc_ep *ep_desc); + + void (*dev_mfc_str) (void *mfc_str); + void (*dev_prod_str) (void *prod_str); + void (*dev_seral_str) (void *serial_str); + void (*dev_enumerated) (void); + usbh_user_status (*dev_user_input) (void); + int (*dev_user_app) (void); + void (*dev_not_supported) (void); + void (*dev_error) (void); +} usbh_user_cb; + +/** + * @brief Host information + */ +typedef struct +{ + usb_host_state cur_state; /*!< host state machine value */ + usb_host_state backup_state; /*!< backup of previous state machine value */ + usbh_enum_state enum_state; /*!< enumeration state machine */ + usbh_control control; /*!< USB host control state machine */ + usb_dev_prop dev_prop; /*!< USB device properity */ + + usbh_class_cb *class_cb; /*!< USB class callback */ + usbh_user_cb *usr_cb; /*!< USB user callback */ +} usbh_host; + + +/* USB host stack initializations */ +void usbh_init (usb_core_driver *pudev, usb_core_enum core, usbh_host *puhost); + +/* de-initialize USB host */ +usbh_status usbh_deinit (usb_core_driver *pudev, usbh_host *puhost); + +/* USB host core main state machine process */ +void usbh_core_task (usb_core_driver *pudev, usbh_host *puhost); + +/* handle the error on USB host side */ +void usbh_error_handler (usbh_host *puhost, usbh_status ErrType); + +/* get USB URB state */ +static inline usb_urb_state usbh_urbstate_get (usb_core_driver *pudev, uint8_t pp_num) +{ + return pudev->host.pipe[pp_num].urb_state; +} + +/* get USB transfer data count */ +static inline uint32_t usbh_xfercount_get (usb_core_driver *pudev, uint8_t pp_num) +{ + return pudev->host.backup_xfercount[pp_num]; +} + +#endif /* __USBH_CORE_H */ + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_enum.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_enum.h new file mode 100644 index 0000000..b82eae2 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_enum.h @@ -0,0 +1,78 @@ +/*! + \file usbh_enum.h + \brief USB host mode USB enumeration header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBH_ENUM_H +#define __USBH_ENUM_H + +#include "usb_conf.h" +#include "usbh_core.h" + +/* get the next descriptor header */ +usb_desc_header *usbh_nextdesc_get (uint8_t *pbuf, uint16_t *ptr); + +/* configure USB control status parameters */ +void usbh_ctlstate_config (usbh_host *puhost, uint8_t *buf, uint16_t len); + +/* get device descriptor from the USB device */ +usbh_status usbh_devdesc_get (usb_core_driver *pudev, usbh_host *puhost, uint8_t len); + +/* get configuration descriptor from the USB device */ +usbh_status usbh_cfgdesc_get (usb_core_driver *pudev, usbh_host *puhost, uint16_t len); + +/* get string descriptor from the USB device */ +usbh_status usbh_strdesc_get (usb_core_driver *pudev, + usbh_host *puhost, + uint8_t str_index, + uint8_t *buf, + uint16_t len); + +/* set the configuration value to the connected device */ +usbh_status usbh_setcfg (usb_core_driver *pudev, usbh_host *puhost, uint16_t config); + +/* set the address to the connected device */ +usbh_status usbh_setaddress (usb_core_driver *pudev, usbh_host *puhost, uint8_t dev_addr); + +/* clear or disable a specific feature */ +usbh_status usbh_clrfeature (usb_core_driver *pudev, + usbh_host *puhost, + uint8_t ep_num, + uint8_t pp_num); + +/* set the interface value to the connected device */ +usbh_status usbh_setinterface (usb_core_driver *pudev, + usbh_host *puhost, + uint8_t ep_num, + uint8_t alter_setting); + +#endif /* __USBH_ENUM_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_pipe.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_pipe.h new file mode 100644 index 0000000..a0d12e7 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_pipe.h @@ -0,0 +1,70 @@ +/*! + \file usbh_pipe.h + \brief USB host mode pipe header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBH_PIPE_H +#define __USBH_PIPE_H + +#include "usbh_core.h" + +#define HC_MAX 8U + +#define HC_OK 0x0000U +#define HC_USED 0x8000U +#define HC_ERROR 0xFFFFU +#define HC_USED_MASK 0x7FFFU + +/* allocate a new pipe */ +uint8_t usbh_pipe_allocate (usb_core_driver *pudev, uint8_t ep_addr); + +/* delete all USB host pipe */ +uint8_t usbh_pipe_delete (usb_core_driver *pudev); + +/* free a pipe */ +uint8_t usbh_pipe_free (usb_core_driver *pudev, uint8_t pp_num); + +/* create a pipe */ +uint8_t usbh_pipe_create (usb_core_driver *pudev, + usb_dev_prop *udev, + uint8_t pp_num, + uint8_t ep_type, + uint16_t ep_mpl); + +/* modify a pipe */ +uint8_t usbh_pipe_update (usb_core_driver *pudev, + uint8_t pp_num, + uint8_t dev_addr, + uint32_t dev_speed, + uint16_t ep_mpl); + +#endif /* __USBH_PIPE_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_transc.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_transc.h new file mode 100644 index 0000000..f76d132 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Include/usbh_transc.h @@ -0,0 +1,54 @@ +/*! + \file usbh_transc.h + \brief USB host mode transactions header file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBH_TRANSC_H +#define __USBH_TRANSC_H + +#include "usb_conf.h" +#include "usbh_core.h" + +/* send the setup packet to the USB device */ +usbh_status usbh_ctlsetup_send (usb_core_driver *pudev, uint8_t *buf, uint8_t pp_num); + +/* send a data packet to the USB device */ +usbh_status usbh_data_send (usb_core_driver *pudev, uint8_t *buf, uint8_t pp_num, uint16_t len); + +/* receive a data packet from the USB device */ +usbh_status usbh_data_recev (usb_core_driver *pudev, uint8_t *buf, uint8_t pp_num, uint16_t len); + +/* USB control transfer handler */ +usbh_status usbh_ctl_handler (usb_core_driver *pudev, usbh_host *puhost); + +#endif /* __USBH_TRANSC_H */ + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c new file mode 100644 index 0000000..b4cff05 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_core.c @@ -0,0 +1,319 @@ +/*! + \file drv_usb_core.c + \brief USB core driver which can operate in host and device mode + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_core.h" +#include "drv_usb_hw.h" + +/*! + \brief config USB core to soft reset + \param[in] usb_regs: USB core registers + \param[out] none + \retval none +*/ +static void usb_core_reset (usb_core_regs *usb_regs) +{ + /* enable core soft reset */ + usb_regs->gr->GRSTCTL |= GRSTCTL_CSRST; + + /* wait for the core to be soft reset */ + while (usb_regs->gr->GRSTCTL & GRSTCTL_CSRST); + + /* wait for addtional 3 PHY clocks */ + usb_udelay(3); +} + +/*! + \brief config USB core basic + \param[in] usb_basic: pointer to usb capabilities + \param[in] usb_regs: USB core registers + \param[in] usb_core: USB core + \param[out] none + \retval operation status +*/ +usb_status usb_basic_init (usb_core_basic *usb_basic, + usb_core_regs *usb_regs, + usb_core_enum usb_core) +{ + uint32_t i = 0, reg_base = 0; + + /* config USB default transfer mode as FIFO mode */ + usb_basic->transfer_mode = USB_USE_FIFO; + + /* USB default speed is full-speed */ + usb_basic->core_speed = USB_SPEED_FULL; + + usb_basic->core_enum = usb_core; + + switch (usb_core) { + case USB_CORE_ENUM_HS: + reg_base = USBHS_REG_BASE; + + /* set the host channel numbers */ + usb_basic->num_pipe = USBHS_MAX_CHANNEL_COUNT; + + /* set the device endpoint numbers */ + usb_basic->num_ep = USBHS_MAX_EP_COUNT; + +#ifdef USB_ULPI_PHY_ENABLED + usb_basic->phy_itf = USB_ULPI_PHY; +#else + usb_basic->phy_itf = USB_EMBEDDED_PHY; +#endif /* USB_ULPI_PHY_ENABLED */ + +#ifdef USB_HS_INTERNAL_DMA_ENABLED + bp->transfer_mode = USB_USE_DMA; +#endif /* USB_HS_INTERNAL_DMA_ENABLED */ + break; + + case USB_CORE_ENUM_FS: + reg_base = USBFS_REG_BASE; + + /* set the host channel numbers */ + usb_basic->num_pipe = USBFS_MAX_CHANNEL_COUNT; + + /* set the device endpoint numbers */ + usb_basic->num_ep = USBFS_MAX_EP_COUNT; + + /* USBFS core use embedded physical layer */ + usb_basic->phy_itf = USB_EMBEDDED_PHY; + break; + + default: + return USB_FAIL; + } + + usb_basic->sof_enable = USB_SOF_OUTPUT; + usb_basic->low_power = USB_LOW_POWER; + + /* assign main registers address */ + *usb_regs = (usb_core_regs) { + .gr = (usb_gr*) (reg_base + USB_REG_OFFSET_CORE), + .hr = (usb_hr*) (reg_base + USB_REG_OFFSET_HOST), + .dr = (usb_dr*) (reg_base + USB_REG_OFFSET_DEV), + + .HPCS = (uint32_t*) (reg_base + USB_REG_OFFSET_PORT), + .PWRCLKCTL = (uint32_t*) (reg_base + USB_REG_OFFSET_PWRCLKCTL) + }; + + /* assign device endpoint registers address */ + for (i = 0; i < usb_basic->num_ep; i++) { + usb_regs->er_in[i] = (usb_erin *) \ + (reg_base + USB_REG_OFFSET_EP_IN + (i * USB_REG_OFFSET_EP)); + + usb_regs->er_out[i] = (usb_erout *)\ + (reg_base + USB_REG_OFFSET_EP_OUT + (i * USB_REG_OFFSET_EP)); + } + + /* assign host pipe registers address */ + for (i = 0; i < usb_basic->num_pipe; i++) { + usb_regs->pr[i] = (usb_pr *) \ + (reg_base + USB_REG_OFFSET_CH_INOUT + (i * USB_REG_OFFSET_CH)); + + usb_regs->DFIFO[i] = (uint32_t *) \ + (reg_base + USB_DATA_FIFO_OFFSET + (i * USB_DATA_FIFO_SIZE)); + } + + return USB_OK; +} + +/*! + \brief initializes the USB controller registers and + prepares the core device mode or host mode operation + \param[in] bp: usb capabilities + \param[in] core_regs: usb core registers + \param[out] none + \retval operation status +*/ +usb_status usb_core_init (usb_core_basic usb_basic, usb_core_regs *usb_regs) +{ + uint32_t reg_value = usb_regs->gr->GCCFG; + + /* disable USB global interrupt */ + usb_regs->gr->GAHBCS &= ~GAHBCS_GINTEN; + + if (USB_ULPI_PHY == usb_basic.phy_itf) { + reg_value &= ~GCCFG_PWRON; + + if (usb_basic.sof_enable) { + reg_value |= GCCFG_SOFOEN; + } + + usb_regs->gr->GCCFG = GCCFG_SOFOEN; + + /* init the ULPI interface */ + usb_regs->gr->GUSBCS &= ~(GUSBCS_EMBPHY | GUSBCS_ULPIEOI); + +#ifdef USBHS_EXTERNAL_VBUS_ENABLED + /* use external VBUS driver */ + usb_regs->gr->GUSBCS |= GUSBCS_ULPIEVD; +#else + /* use internal VBUS driver */ + usb_regs->gr->GUSBCS &= ~GUSBCS_ULPIEVD; +#endif + + /* soft reset the core */ + usb_core_reset (usb_regs); + } else { + usb_regs->gr->GUSBCS |= GUSBCS_EMBPHY; + + /* soft reset the core */ + usb_core_reset (usb_regs); + + /* active the transceiver and enable vbus sensing */ + reg_value = GCCFG_PWRON | GCCFG_VBUSACEN | GCCFG_VBUSBCEN; + +#ifndef VBUS_SENSING_ENABLED + reg_value |= GCCFG_VBUSIG; +#endif /* VBUS_SENSING_ENABLED */ + + /* enable SOF output */ + if (usb_basic.sof_enable) { + reg_value |= GCCFG_SOFOEN; + } + + usb_regs->gr->GCCFG = reg_value; + + usb_mdelay(20); + } + + if (USB_USE_DMA == usb_basic.transfer_mode) { + usb_regs->gr->GAHBCS |= GAHBCS_DMAEN; + usb_regs->gr->GAHBCS &= ~GAHBCS_BURST; + usb_regs->gr->GAHBCS |= DMA_INCR8; + } + +#ifdef USE_OTG_MODE + + /* enable USB OTG features */ + usb_regs->gr->GUSBCS |= GUSBCS_HNPCAP | GUSBCS_SRPCAP; + + /* enable the USB wakeup and suspend interrupts */ + usb_regs->gr->GINTF = 0xBFFFFFFFU; + + usb_regs->gr->GINTEN = GINTEN_WKUPIE | GINTEN_SPIE | \ + GINTEN_OTGIE | GINTEN_SESIE | GINTEN_CIDPSCIE; + +#endif /* USE_OTG_MODE */ + + return USB_OK; +} + +/*! + \brief write a packet into the Tx FIFO associated with the endpoint + \param[in] core_regs: usb core registers + \param[in] src_buf: pointer to source buffer + \param[in] fifo_num: FIFO number which is in (0..3) + \param[in] byte_count: packet byte count + \param[out] none + \retval operation status +*/ +usb_status usb_txfifo_write (usb_core_regs *usb_regs, + uint8_t *src_buf, + uint8_t fifo_num, + uint16_t byte_count) +{ + uint32_t word_count = (byte_count + 3U) / 4U; + + __IO uint32_t *fifo = usb_regs->DFIFO[fifo_num]; + + while (word_count-- > 0) { + *fifo = *((__packed uint32_t *)src_buf); + + src_buf += 4U; + } + + return USB_OK; +} + +/*! + \brief read a packet from the Rx FIFO associated with the endpoint + \param[in] core_regs: usb core registers + \param[in] dest_buf: pointer to destination buffer + \param[in] byte_count: packet byte count + \param[out] none + \retval void type pointer +*/ +void *usb_rxfifo_read (usb_core_regs *usb_regs, uint8_t *dest_buf, uint16_t byte_count) +{ + uint32_t word_count = (byte_count + 3U) / 4U; + + __IO uint32_t *fifo = usb_regs->DFIFO[0]; + + while (word_count-- > 0) { + *(__packed uint32_t *)dest_buf = *fifo; + + dest_buf += 4U; + } + + return ((void *)dest_buf); +} + +/*! + \brief flush a Tx FIFO or all Tx FIFOs + \param[in] core_regs: pointer to usb core registers + \param[in] fifo_num: FIFO number which is in (0..3) + \param[out] none + \retval operation status +*/ +usb_status usb_txfifo_flush (usb_core_regs *usb_regs, uint8_t fifo_num) +{ + usb_regs->gr->GRSTCTL = ((uint32_t)fifo_num << 6U) | GRSTCTL_TXFF; + + /* wait for Tx FIFO flush bit is set */ + while (usb_regs->gr->GRSTCTL & GRSTCTL_TXFF); + + /* wait for 3 PHY clocks*/ + usb_udelay(3); + + return USB_OK; +} + +/*! + \brief flush the entire Rx FIFO + \param[in] core_regs: pointer to usb core registers + \param[out] none + \retval operation status +*/ +usb_status usb_rxfifo_flush (usb_core_regs *usb_regs) +{ + usb_regs->gr->GRSTCTL = GRSTCTL_RXFF; + + /* wait for Rx FIFO flush bit is set */ + while (usb_regs->gr->GRSTCTL & GRSTCTL_RXFF); + + /* wait for 3 PHY clocks */ + usb_udelay(3); + + return USB_OK; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c new file mode 100644 index 0000000..5988ec5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_dev.c @@ -0,0 +1,749 @@ +/*! + \file drv_usb_dev.c + \brief USB device mode low level driver + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "drv_usb_hw.h" +#include "drv_usb_core.h" +#include "drv_usb_dev.h" + +/* endpoint 0 max packet length */ +static const uint8_t EP0_MAXLEN[4] = { + [DSTAT_EM_HS_PHY_30MHZ_60MHZ] = EP0MPL_64, + [DSTAT_EM_FS_PHY_30MHZ_60MHZ] = EP0MPL_64, + [DSTAT_EM_FS_PHY_48MHZ] = EP0MPL_64, + [DSTAT_EM_LS_PHY_6MHZ] = EP0MPL_8 +}; + +#ifdef USB_FS_CORE + +/* USB endpoint Tx FIFO size */ +static uint16_t USBFS_TX_FIFO_SIZE[USBFS_MAX_EP_COUNT] = +{ + (uint16_t)TX0_FIFO_FS_SIZE, + (uint16_t)TX1_FIFO_FS_SIZE, + (uint16_t)TX2_FIFO_FS_SIZE, + (uint16_t)TX3_FIFO_FS_SIZE +}; + +#elif defined(USB_HS_CORE) + +uint16_t USBHS_TX_FIFO_SIZE[USBHS_MAX_EP_COUNT] = +{ + (uint16_t)TX0_FIFO_HS_SIZE, + (uint16_t)TX1_FIFO_HS_SIZE, + (uint16_t)TX2_FIFO_HS_SIZE, + (uint16_t)TX3_FIFO_HS_SIZE, + (uint16_t)TX4_FIFO_HS_SIZE, + (uint16_t)TX5_FIFO_HS_SIZE +}; + +#endif /* USBFS_CORE */ + +/*! + \brief initialize USB core registers for device mode + \param[in] udev: pointer to usb device + \param[out] none + \retval operation status +*/ +usb_status usb_devcore_init (usb_core_driver *udev) +{ + uint32_t i, ram_addr = 0; + + /* force to peripheral mode */ + udev->regs.gr->GUSBCS &= ~(GUSBCS_FDM | GUSBCS_FHM); + udev->regs.gr->GUSBCS |= GUSBCS_FDM; + // udev->regs.gr->GUSBCS &= ~(GUSBCS_FHM); + + /* restart the Phy Clock (maybe don't need to...) */ + *udev->regs.PWRCLKCTL = 0U; + + /* config periodic frame interval to default value */ + udev->regs.dr->DCFG &= ~DCFG_EOPFT; + udev->regs.dr->DCFG |= FRAME_INTERVAL_80; + + udev->regs.dr->DCFG &= ~DCFG_DS; + +#ifdef USB_FS_CORE + if (udev->bp.core_enum == USB_CORE_ENUM_FS) { + /* set full-speed PHY */ + udev->regs.dr->DCFG |= USB_SPEED_INP_FULL; + + /* set Rx FIFO size */ + udev->regs.gr->GRFLEN = RX_FIFO_FS_SIZE; + + /* set endpoint 0 Tx FIFO length and RAM address */ + udev->regs.gr->DIEP0TFLEN_HNPTFLEN = ((uint32_t)TX0_FIFO_FS_SIZE << 16) | \ + ((uint32_t)RX_FIFO_FS_SIZE); + + ram_addr = RX_FIFO_FS_SIZE; + + /* set endpoint 1 to 3's Tx FIFO length and RAM address */ + for (i = 1; i < USBFS_MAX_EP_COUNT; i++) { + ram_addr += USBFS_TX_FIFO_SIZE[i - 1]; + + udev->regs.gr->DIEPTFLEN[i - 1] = ((uint32_t)USBFS_TX_FIFO_SIZE[i] << 16U) | \ + ram_addr; + } + } +#endif + +#ifdef USB_HS_CORE + if (udev->bp.core == USB_CORE_HS) { + if (udev->bp.core_phy == USB_ULPI_PHY) { + udev->regs.dr->DCFG |= USB_SPEED_EXP_HIGH; + } else {/* set High speed phy in Full speed mode */ + udev->regs.dr->DCFG |= USB_SPEED_EXP_FULL; + } + + /* Set Rx FIFO size */ + udev->regs.gr->GRFLEN &= ~GRFLEN_RXFD; + udev->regs.gr->GRFLEN |= RX_FIFO_HS_SIZE; + + /* Set endpoint 0 Tx FIFO length and RAM address */ + udev->regs.gr->DIEP0TFLEN_HNPTFLEN = ((uint32_t)TX0_FIFO_HS_SIZE << 16) | \ + RX_FIFO_HS_SIZE; + + ram_addr = RX_FIFO_HS_SIZE; + + /* Set endpoint 1 to 3's Tx FIFO length and RAM address */ + for (i = 1; i < USBHS_MAX_EP_COUNT; i++) { + ram_addr += USBHS_TX_FIFO_SIZE[i - 1]; + + udev->regs.gr->DIEPTFLEN[i - 1] = ((uint32_t)USBHS_TX_FIFO_SIZE[i] << 16) | \ + ram_addr; + } + } +#endif + + /* make sure all FIFOs are flushed */ + + /* flush all Tx FIFOs */ + usb_txfifo_flush (&udev->regs, 0x10); + + /* flush entire Rx FIFO */ + usb_rxfifo_flush (&udev->regs); + + /* clear all pending device interrupts */ + udev->regs.dr->DIEPINTEN = 0U; + udev->regs.dr->DOEPINTEN = 0U; + udev->regs.dr->DAEPINT = 0xFFFFFFFFU; + udev->regs.dr->DAEPINTEN = 0U; + + /* configure all IN/OUT endpoints */ + for (i = 0; i < udev->bp.num_ep; i++) { + if (udev->regs.er_in[i]->DIEPCTL & DEPCTL_EPEN) { + udev->regs.er_in[i]->DIEPCTL |= DEPCTL_EPD | DEPCTL_SNAK; + } else { + udev->regs.er_in[i]->DIEPCTL = 0U; + } + + /* set IN endpoint transfer length to 0 */ + udev->regs.er_in[i]->DIEPLEN = 0U; + + /* clear all pending IN endpoint interrupts */ + udev->regs.er_in[i]->DIEPINTF = 0xFFU; + + if (udev->regs.er_out[i]->DOEPCTL & DEPCTL_EPEN) { + udev->regs.er_out[i]->DOEPCTL |= DEPCTL_EPD | DEPCTL_SNAK; + } else { + udev->regs.er_out[i]->DOEPCTL = 0U; + } + + /* set OUT endpoint transfer length to 0 */ + udev->regs.er_out[i]->DOEPLEN = 0U; + + /* clear all pending OUT endpoint interrupts */ + udev->regs.er_out[i]->DOEPINTF = 0xFFU; + } + + usb_devint_enable (udev); + + return USB_OK; +} + +/*! + \brief enable the USB device mode interrupts + \param[in] udev: pointer to usb device + \param[out] none + \retval operation status +*/ +usb_status usb_devint_enable (usb_core_driver *udev) +{ + /* clear any pending USB OTG interrupts */ + udev->regs.gr->GOTGINTF = 0xFFFFFFFFU; + + /* clear any pending interrupts */ + udev->regs.gr->GINTF = 0xBFFFFFFFU; + + /* enable the USB wakeup and suspend interrupts */ + udev->regs.gr->GINTEN = GINTEN_WKUPIE | GINTEN_SPIE; + + /* enable device_mode-related interrupts */ + if (USB_USE_FIFO == udev->bp.transfer_mode) { + udev->regs.gr->GINTEN |= GINTEN_RXFNEIE; + } + udev->regs.gr->GINTEN |= GINTEN_RSTIE | GINTEN_ENUMFIE | GINTEN_IEPIE |\ + GINTEN_OEPIE | GINTEN_SOFIE | GINTEN_MFIE; + +#ifdef VBUS_SENSING_ENABLED + udev->regs.gr->GINTEN |= GINTEN_SESIE | GINTEN_OTGIE; +#endif /* VBUS_SENSING_ENABLED */ + + /* enable USB global interrupt */ + udev->regs.gr->GAHBCS |= GAHBCS_GINTEN; + + return USB_OK; +} + +/*! + \brief config the USB device to be disconnected + \param[in] udev: pointer to usb device + \param[out] none + \retval operation status +*/ +void usb_dev_disconnect (usb_core_driver *udev) +{ + udev->regs.dr->DCTL |= DCTL_SD; +} + +/*! + \brief config the USB device to be connected + \param[in] udev: pointer to usb device + \param[out] none + \retval operation status +*/ +void usb_dev_connect (usb_core_driver *udev) +{ + udev->regs.dr->DCTL &= ~DCTL_SD; +} + +/*! + \brief set the USB device address + \param[in] udev: pointer to usb device + \param[in] dev_addr: device address for setting + \param[out] none + \retval operation status +*/ +void usb_devaddr_set (usb_core_driver *udev, uint8_t dev_addr) +{ + udev->regs.dr->DCFG &= ~DCFG_DAR; + udev->regs.dr->DCFG |= dev_addr << 4; +} + +/*! + \brief active the usb transaction + \param[in] udev: pointer to usb device + \param[in] transc: the usb transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_active (usb_core_driver *udev, usb_transc *transc) +{ + __IO uint32_t *reg_addr = NULL; + + __IO uint32_t epinten = 0U; + + /* get the endpoint number */ + uint8_t ep_num = transc->ep_addr.num; + + /* enable endpoint interrupt number */ + if (transc->ep_addr.dir) { + reg_addr = &udev->regs.er_in[ep_num]->DIEPCTL; + + epinten = 1 << ep_num; + } else { + reg_addr = &udev->regs.er_out[ep_num]->DOEPCTL; + + epinten = 1 << (16 + ep_num); + } + + /* if the endpoint is not active, need change the endpoint control register */ + if (!(*reg_addr & DEPCTL_EPACT)) { + *reg_addr &= ~(DEPCTL_MPL | DEPCTL_EPTYPE | DIEPCTL_TXFNUM); + + /* set endpoint maximum packet length */ + if (0U == ep_num) { + *reg_addr |= EP0_MAXLEN[udev->regs.dr->DSTAT & DSTAT_ES]; + } else { + *reg_addr |= transc->max_len; + } + + /* activate endpoint */ + *reg_addr |= (transc->ep_type << 18) | (ep_num << 22) | DEPCTL_SD0PID | DEPCTL_EPACT; + } + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if ((ep_num == 1) && (udev->bp.core == USB_HS_CORE_ID)) { + udev->regs.dr->DEP1INTEN |= epinten; + } + else +#endif + { + /* enable the interrupts for this endpoint */ + udev->regs.dr->DAEPINTEN |= epinten; + } + + return USB_OK; +} + +/*! + \brief deactive the usb transaction + \param[in] udev: pointer to usb device + \param[in] transc: the usb transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_deactivate(usb_core_driver *udev, usb_transc *transc) +{ + uint32_t epinten = 0U; + + uint8_t ep_num = transc->ep_addr.num; + + /* disable endpoint interrupt number */ + if (transc->ep_addr.dir) { + epinten = 1 << ep_num; + + udev->regs.er_in[ep_num]->DIEPCTL &= ~DEPCTL_EPACT; + } else { + epinten = 1 << (ep_num + 16); + + udev->regs.er_out[ep_num]->DOEPCTL &= ~DEPCTL_EPACT; + } + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + if ((ep_num == 1) && (udev->bp.core == USB_CORE_HS)) { + udev->regs.dr->DEP1INTEN &= ~epinten; + } + else +#endif + { + /* disable the interrupts for this endpoint */ + udev->regs.dr->DAEPINTEN &= ~epinten; + } + + return USB_OK; +} + +/*! + \brief configure usb transaction to start IN transfer + \param[in] udev: pointer to usb device + \param[in] transc: the usb IN transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_inxfer (usb_core_driver *udev, usb_transc *transc) +{ + usb_status status = USB_OK; + + uint8_t ep_num = transc->ep_addr.num; + + __IO uint32_t epctl = udev->regs.er_in[ep_num]->DIEPCTL; + __IO uint32_t eplen = udev->regs.er_in[ep_num]->DIEPLEN; + + eplen &= ~(DEPLEN_TLEN | DEPLEN_PCNT); + + /* zero length packet or endpoint 0 */ + if (0U == transc->xfer_len) { + /* set transfer packet count to 1 */ + eplen |= 1 << 19; + } else { + /* set transfer packet count */ + if (0U == ep_num) { + transc->xfer_len = USB_MIN(transc->xfer_len, transc->max_len); + + eplen |= 1 << 19; + } else { + eplen |= ((transc->xfer_len - 1 + transc->max_len) / transc->max_len) << 19; + } + + /* set endpoint transfer length */ + eplen |= transc->xfer_len; + + if (transc->ep_type == USB_EPTYPE_ISOC) { + eplen |= DIEPLEN_MCNT; + } + } + + udev->regs.er_in[ep_num]->DIEPLEN = eplen; + + if (USB_USE_DMA == udev->bp.transfer_mode) { + udev->regs.er_in[ep_num]->DIEPDMAADDR = transc->dma_addr; + } + + if (transc->ep_type == USB_EPTYPE_ISOC) { + if (((udev->regs.dr->DSTAT & DSTAT_FNRSOF) >> 8) & 0x1) { + epctl |= DEPCTL_SD1PID; + } else { + epctl |= DEPCTL_SD0PID; + } + } + + /* enable the endpoint and clear the NAK */ + epctl |= DEPCTL_CNAK | DEPCTL_EPEN; + + udev->regs.er_in[ep_num]->DIEPCTL = epctl; + + if (transc->ep_type != USB_EPTYPE_ISOC) { + /* enable the Tx FIFO empty interrupt for this endpoint */ + if (transc->xfer_len > 0) { + udev->regs.dr->DIEPFEINTEN |= 1 << ep_num; + } + } else { + usb_txfifo_write (&udev->regs, transc->xfer_buf, ep_num, transc->xfer_len); + } + + return status; +} + +/*! + \brief configure usb transaction to start OUT transfer + \param[in] udev: pointer to usb device + \param[in] transc: the usb OUT transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_outxfer (usb_core_driver *udev, usb_transc *transc) +{ + usb_status status = USB_OK; + + uint8_t ep_num = transc->ep_addr.num; + + uint32_t epctl = udev->regs.er_out[ep_num]->DOEPCTL; + uint32_t eplen = udev->regs.er_out[ep_num]->DOEPLEN; + + eplen &= ~(DEPLEN_TLEN | DEPLEN_PCNT); + + /* zero length packet or endpoint 0 */ + if ((0U == transc->xfer_len) || (0U == ep_num)) { + /* set the transfer length to max packet size */ + eplen |= transc->max_len; + + /* set the transfer packet count to 1 */ + eplen |= 1U << 19; + } else { + /* configure the transfer size and packet count as follows: + * pktcnt = N + * xfersize = N * maxpacket + */ + uint32_t packet_count = (transc->xfer_len + transc->max_len - 1) / transc->max_len; + + eplen |= packet_count << 19; + eplen |= packet_count * transc->max_len; + } + + udev->regs.er_out[ep_num]->DOEPLEN = eplen; + + if (USB_USE_DMA == udev->bp.transfer_mode) { + udev->regs.er_out[ep_num]->DOEPDMAADDR = transc->dma_addr; + } + + if (transc->ep_type == USB_EPTYPE_ISOC) { + if (transc->frame_num) { + epctl |= DEPCTL_SD1PID; + } else { + epctl |= DEPCTL_SD0PID; + } + } + + /* enable the endpoint and clear the NAK */ + epctl |= DEPCTL_EPEN | DEPCTL_CNAK; + + udev->regs.er_out[ep_num]->DOEPCTL = epctl; + + return status; +} + +/*! + \brief set the usb transaction STALL status + \param[in] udev: pointer to usb device + \param[in] transc: the usb transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_stall (usb_core_driver *udev, usb_transc *transc) +{ + __IO uint32_t *reg_addr = NULL; + + uint8_t ep_num = transc->ep_addr.num; + + if (transc->ep_addr.dir) { + reg_addr = &(udev->regs.er_in[ep_num]->DIEPCTL); + + /* set the endpoint disable bit */ + if (*reg_addr & DEPCTL_EPEN) { + *reg_addr |= DEPCTL_EPD; + } + } else { + /* set the endpoint stall bit */ + reg_addr = &(udev->regs.er_out[ep_num]->DOEPCTL); + } + + /* set the endpoint stall bit */ + *reg_addr |= DEPCTL_STALL; + + return USB_OK; +} + +/*! + \brief clear the usb transaction STALL status + \param[in] udev: pointer to usb device + \param[in] transc: the usb transaction + \param[out] none + \retval status +*/ +usb_status usb_transc_clrstall(usb_core_driver *udev, usb_transc *transc) +{ + __IO uint32_t *reg_addr = NULL; + + uint8_t ep_num = transc->ep_addr.num; + + if (transc->ep_addr.dir) { + reg_addr = &(udev->regs.er_in[ep_num]->DIEPCTL); + } else { + reg_addr = &(udev->regs.er_out[ep_num]->DOEPCTL); + } + + /* clear the endpoint stall bits */ + *reg_addr &= ~DEPCTL_STALL; + + /* reset data PID of the periodic endpoints */ + if ((transc->ep_type == USB_EPTYPE_INTR) || (transc->ep_type == USB_EPTYPE_BULK)) { + *reg_addr |= DEPCTL_SD0PID; + } + + return USB_OK; +} + +/*! + \brief read device all OUT endpoint interrupt register + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +uint32_t usb_oepintnum_read (usb_core_driver *udev) +{ + uint32_t value = udev->regs.dr->DAEPINT; + + value &= udev->regs.dr->DAEPINTEN; + + return (value & DAEPINT_OEPITB) >> 16; +} + +/*! + \brief read device OUT endpoint interrupt flag register + \param[in] udev: pointer to usb device + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +uint32_t usb_oepintr_read (usb_core_driver *udev, uint8_t ep_num) +{ + uint32_t value = udev->regs.er_out[ep_num]->DOEPINTF; + + value &= udev->regs.dr->DOEPINTEN; + + return value; +} + +/*! + \brief read device all IN endpoint interrupt register + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +uint32_t usb_iepintnum_read (usb_core_driver *udev) +{ + uint32_t value = udev->regs.dr->DAEPINT; + + value &= udev->regs.dr->DAEPINTEN; + + return value & DAEPINT_IEPITB; +} + + +/*! + \brief read device IN endpoint interrupt flag register + \param[in] udev: pointer to usb device + \param[in] ep_num: endpoint number + \param[out] none + \retval none +*/ +uint32_t usb_iepintr_read (usb_core_driver *udev, uint8_t ep_num) +{ + uint32_t value = 0U, fifoemptymask = 0U, commonintmask = 0U; + + commonintmask = udev->regs.dr->DIEPINTEN; + fifoemptymask = udev->regs.dr->DIEPFEINTEN; + + /* check FIFO empty interrupt enable bit */ + commonintmask |= ((fifoemptymask >> ep_num) & 0x1U) << 7; + + value = udev->regs.er_in[ep_num]->DIEPINTF & commonintmask; + + return value; +} + +/*! + \brief configures OUT endpoint 0 to receive SETUP packets + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_ctlep_startout (usb_core_driver *udev) +{ + /* set OUT endpoint 0 receive length to 24 bytes, 1 packet and 3 setup packets */ + udev->regs.er_out[0]->DOEPLEN = DOEP0_TLEN(8U * 3U) | DOEP0_PCNT(1U) | DOEP0_STPCNT(3U); + + if (USB_USE_DMA == udev->bp.transfer_mode) { + udev->regs.er_out[0]->DOEPDMAADDR = (uint32_t)&udev->dev.control.req; + + /* endpoint enable */ + udev->regs.er_out[0]->DOEPCTL |= DEPCTL_EPACT | DEPCTL_EPEN; + } +} + +/*! + \brief set remote wakeup signalling + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_rwkup_set (usb_core_driver *udev) +{ + if (udev->dev.pm.dev_remote_wakeup) { + /* enable remote wakeup signaling */ + udev->regs.dr->DCTL |= DCTL_RWKUP; + } +} + +/*! + \brief reset remote wakeup signalling + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_rwkup_reset (usb_core_driver *udev) +{ + if (udev->dev.pm.dev_remote_wakeup) { + /* disable remote wakeup signaling */ + udev->regs.dr->DCTL &= ~DCTL_RWKUP; + } +} + +/*! + \brief active remote wakeup signalling + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_rwkup_active (usb_core_driver *udev) +{ + if (udev->dev.pm.dev_remote_wakeup) { + if (udev->regs.dr->DSTAT & DSTAT_SPST) { + if (udev->bp.low_power) { + /* ungate USB core clock */ + *udev->regs.PWRCLKCTL &= ~(PWRCLKCTL_SHCLK | PWRCLKCTL_SUCLK); + } + + /* active remote wakeup signaling */ + udev->regs.dr->DCTL |= DCTL_RWKUP; + + usb_mdelay(5); + + udev->regs.dr->DCTL &= ~DCTL_RWKUP; + } + } +} + +/*! + \brief active USB core clock + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_clock_active (usb_core_driver *udev) +{ + if (udev->bp.low_power) { + if (udev->regs.dr->DSTAT & DSTAT_SPST) { + /* un-gate USB Core clock */ + *udev->regs.PWRCLKCTL &= ~(PWRCLKCTL_SHCLK | PWRCLKCTL_SUCLK); + } + } +} + +/*! + \brief usb device suspend + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_dev_suspend (usb_core_driver *udev) +{ + __IO uint32_t devstat = udev->regs.dr->DSTAT; + + if ((udev->bp.low_power) && (devstat & DSTAT_SPST)) { + /* switch-off the USB clocks */ + *udev->regs.PWRCLKCTL |= PWRCLKCTL_SHCLK; + + /* enter DEEP_SLEEP mode with LDO in low power mode */ + pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD); + } +} + +/*! + \brief stop the device and clean up fifos + \param[in] udev: pointer to usb device + \param[out] none + \retval none +*/ +void usb_dev_stop (usb_core_driver *udev) +{ + uint32_t i; + + udev->dev.cur_status = 1; + + /* clear all interrupt flag and enable bits */ + for (i = 0; i < udev->bp.num_ep; i++) { + udev->regs.er_in[i]->DIEPINTF = 0xFFU; + udev->regs.er_out[i]->DOEPINTF = 0xFFU; + } + + udev->regs.dr->DIEPINTEN = 0U; + udev->regs.dr->DOEPINTEN = 0U; + udev->regs.dr->DAEPINTEN = 0U; + udev->regs.dr->DAEPINT = 0xFFFFFFFFU; + + /* flush the FIFO */ + usb_rxfifo_flush (&udev->regs); + usb_txfifo_flush (&udev->regs, 0x10); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_host.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_host.c new file mode 100644 index 0000000..747d40c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usb_host.c @@ -0,0 +1,514 @@ +/*! + \file drv_usb_host.c + \brief USB host mode low level driver + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "../Include/drv_usb_hw.h" +#include "../Include/drv_usb_core.h" +#include "../Include/drv_usb_host.h" + +const uint32_t PIPE_DPID[] = { + PIPE_DPID_DATA0, + PIPE_DPID_DATA1 +}; + +//__STATIC_INLINE uint8_t usb_frame_even (usb_core_driver *pudev) +uint32_t usb_frame_even (usb_core_driver *pudev) +{ + return !(pudev->regs.hr->HFINFR & 0x01U); +} + +//__STATIC_INLINE void usb_phyclock_config (usb_core_driver *pudev, uint8_t clock) +void usb_phyclock_config (usb_core_driver *pudev, uint8_t clock) +{ + pudev->regs.hr->HCTL &= ~HCTL_CLKSEL; + pudev->regs.hr->HCTL |= clock; +} + +//__STATIC_INLINE uint32_t usb_port_read (usb_core_driver *pudev) +uint32_t usb_port_read (usb_core_driver *pudev) +{ + return *pudev->regs.HPCS & ~(HPCS_PE | HPCS_PCD | HPCS_PEDC); +} + +//__STATIC_INLINE uint32_t usb_curspeed_get (usb_core_driver *pudev) + +uint32_t usb_curspeed_get (usb_core_driver *pudev) +{ + return *pudev->regs.HPCS & HPCS_PS; +} + +uint32_t usb_curframe_get (usb_core_driver *pudev) +{ + return (pudev->regs.hr->HFINFR & 0xFFFFU); +} + +/*! + \brief initializes USB core for host mode + \param[in] pudev: pointer to selected usb host + \param[out] none + \retval operation status +*/ +usb_status usb_host_init (usb_core_driver *pudev) +{ + uint32_t i = 0, inten = 0U; + + uint32_t nptxfifolen = 0U; + uint32_t ptxfifolen = 0U; + + pudev->regs.gr->GUSBCS &= ~GUSBCS_FDM; + pudev->regs.gr->GUSBCS |= GUSBCS_FHM; + + /* restart the PHY Clock */ + *pudev->regs.PWRCLKCTL = 0U; + + /* initialize host configuration register */ + if (USB_ULPI_PHY == pudev->bp.phy_itf) { + usb_phyclock_config (pudev, HCTL_30_60MHZ); + } else { + usb_phyclock_config (pudev, HCTL_48MHZ); + } + + usb_port_reset (pudev); + + /* support FS/LS only */ + pudev->regs.hr->HCTL &= ~HCTL_SPDFSLS; + + /* configure data FIFOs size */ +#ifdef USB_FS_CORE + if (USB_CORE_ENUM_FS == pudev->bp.core_enum) { + /* set Rx FIFO size */ + pudev->regs.gr->GRFLEN = USB_RX_FIFO_FS_SIZE; + + /* set non-periodic Tx FIFO size and address */ + nptxfifolen |= USB_RX_FIFO_FS_SIZE; + nptxfifolen |= USB_HTX_NPFIFO_FS_SIZE << 16U; + pudev->regs.gr->DIEP0TFLEN_HNPTFLEN = nptxfifolen; + + /* set periodic Tx FIFO size and address */ + ptxfifolen |= USB_RX_FIFO_FS_SIZE + USB_HTX_PFIFO_FS_SIZE; + ptxfifolen |= USB_HTX_PFIFO_FS_SIZE << 16U; + pudev->regs.gr->HPTFLEN = ptxfifolen; + } +#endif /* USB_FS_CORE */ + +#ifdef USB_HS_CORE + if (USB_CORE_HS == pudev->cfg.core) { + /* set Rx FIFO size */ + pudev->regs.gr->GRFLEN = USBHS_RX_FIFO_SIZE; + + /* set non-periodic Tx FIFO size and address */ + nptxfifolen |= USBHS_RX_FIFO_SIZE; + nptxfifolen |= USBHS_HTX_NPFIFO_SIZE; + pudev->regs.gr->DIEP0TFLEN_HNPTFLEN = nptxfifolen; + + /* set periodic Tx FIFO size and address */ + ptxfifolen |= USBHS_RX_FIFO_SIZE + USBHS_HTX_PFIFO_SIZE; + ptxfifolen |= USBHS_HTX_PFIFO_SIZE; + pudev->regs.gr->HPTFLEN = ptxfifolen; + } +#endif + +#ifdef USE_OTG_MODE + + /* clear host set hnp enable in the usb_otg control register */ + pudev->regs.gr->GOTGCS &= ~GOTGCS_HHNPEN; + +#endif + + /* disable all interrupts */ + pudev->regs.gr->GINTEN = 0U; + + /* clear any pending USB OTG interrupts */ + pudev->regs.gr->GOTGINTF = 0xFFFFFFFFU; + + /* enable the USB wakeup and suspend interrupts */ + pudev->regs.gr->GINTF = 0xBFFFFFFFU; + + /* make sure the FIFOs are flushed */ + + /* flush all Tx FIFOs in device or host mode */ + usb_txfifo_flush (&pudev->regs, 0x10U); + + /* flush the entire Rx FIFO */ + usb_rxfifo_flush (&pudev->regs); + + /* clear all pending host channel interrupts */ + for (i = 0U; i < pudev->bp.num_pipe; i++) { + pudev->regs.pr[i]->HCHINTF = 0xFFFFFFFFU; + pudev->regs.pr[i]->HCHINTEN = 0U; + } + +#ifndef USE_OTG_MODE + usb_portvbus_switch (pudev, 1U); +#endif /* USE_OTG_MODE */ + + pudev->regs.gr->GINTEN = GINTEN_WKUPIE | GINTEN_SPIE; + + /* enable host_mode-related interrupts */ + if (USB_USE_FIFO == pudev->bp.transfer_mode) { + inten = GINTEN_RXFNEIE; + } + + inten |= GINTEN_HPIE | GINTEN_HCIE | GINTEN_ISOINCIE; + + pudev->regs.gr->GINTEN |= inten; + + inten = GINTEN_DISCIE | GINTEN_SOFIE; + + pudev->regs.gr->GINTEN &= ~inten; + + pudev->regs.gr->GAHBCS |= GAHBCS_GINTEN; + + return USB_OK; +} + +/*! + \brief control the VBUS to power + \param[in] pudev: pointer to selected usb host + \param[in] state: VBUS state + \param[out] none + \retval none +*/ +void usb_portvbus_switch (usb_core_driver *pudev, uint8_t state) +{ + uint32_t port = 0U; + + /* enable or disable the external charge pump */ + usb_vbus_drive (state); + + /* turn on the host port power. */ + port = usb_port_read (pudev); + + if (!(port & HPCS_PP) && (1U == state)) { + port |= HPCS_PP; + } + + if ((port & HPCS_PP) && (0U == state)) { + port &= ~HPCS_PP; + } + + *pudev->regs.HPCS = port; + + usb_mdelay (200U); +} + +/*! + \brief reset host port + \param[in] pudev: pointer to usb device + \param[out] none + \retval operation status +*/ +uint32_t usb_port_reset (usb_core_driver *pudev) +{ + __IO uint32_t port = usb_port_read (pudev); + + *pudev->regs.HPCS = port | HPCS_PRST; + + usb_mdelay (100U); /* see note */ + + *pudev->regs.HPCS = port & ~HPCS_PRST; + + usb_mdelay (20U); + + return 1; +} + +/*! + \brief initialize host pipe + \param[in] pudev: pointer to usb device + \param[in] pipe_num: host pipe number which is in (0..7) + \param[out] none + \retval operation status +*/ +usb_status usb_pipe_init (usb_core_driver *pudev, uint8_t pipe_num) +{ + usb_status status = USB_OK; + + __IO uint32_t pp_ctl = 0U; + __IO uint32_t pp_inten = HCHINTEN_TFIE; + + usb_pipe *pp = &pudev->host.pipe[pipe_num]; + + /* clear old interrupt conditions for this host channel */ + pudev->regs.pr[pipe_num]->HCHINTF = 0xFFFFFFFFU; + + if (USB_USE_DMA == pudev->bp.transfer_mode) { + pp_inten |= HCHINTEN_DMAERIE; + } + + if (pp->ep.dir) { + pp_inten |= HCHINTEN_BBERIE; + } + + /* enable channel interrupts required for this transfer */ + switch (pp->ep.type) { + case USB_EPTYPE_CTRL: + case USB_EPTYPE_BULK: + pp_inten |= HCHINTEN_STALLIE | HCHINTEN_USBERIE \ + | HCHINTEN_DTERIE | HCHINTEN_NAKIE; + + if (!pp->ep.dir) { + pp_inten |= HCHINTEN_NYETIE; + + if (pp->ping) { + pp_inten |= HCHINTEN_ACKIE; + } + } + break; + + case USB_EPTYPE_INTR: + pp_inten |= HCHINTEN_STALLIE | HCHINTEN_USBERIE | HCHINTEN_DTERIE \ + | HCHINTEN_NAKIE | HCHINTEN_REQOVRIE; + break; + + case USB_EPTYPE_ISOC: + pp_inten |= HCHINTEN_REQOVRIE | HCHINTEN_ACKIE; + + if (pp->ep.dir) { + pp_inten |= HCHINTEN_USBERIE; + } + break; + + default: + break; + } + + pudev->regs.pr[pipe_num]->HCHINTEN = pp_inten; + + /* enable the top level host channel interrupt */ + pudev->regs.hr->HACHINTEN |= 1U << pipe_num; + + /* make sure host channel interrupts are enabled */ + pudev->regs.gr->GINTEN |= GINTEN_HCIE; + + /* program the host channel control register */ + pp_ctl |= PIPE_CTL_DAR(pp->dev_addr); + pp_ctl |= PIPE_CTL_EPNUM(pp->ep.num); + pp_ctl |= PIPE_CTL_EPDIR(pp->ep.dir); + pp_ctl |= PIPE_CTL_EPTYPE(pp->ep.type); + pp_ctl |= PIPE_CTL_LSD(pp->dev_speed == PORT_SPEED_LOW); + + pp_ctl |= pp->ep.mps; + pp_ctl |= ((uint32_t)(pp->ep.type == USB_EPTYPE_INTR) << 29U) & HCHCTL_ODDFRM; + + pudev->regs.pr[pipe_num]->HCHCTL = pp_ctl; + + return status; +} + +/*! + \brief prepare host channel for transferring packets + \param[in] pudev: pointer to usb device + \param[in] pipe_num: host pipe number which is in (0..7) + \param[out] none + \retval operation status +*/ +usb_status usb_pipe_xfer (usb_core_driver *pudev, uint8_t pipe_num) +{ + usb_status status = USB_OK; + + uint16_t dword_len = 0U; + uint16_t packet_count = 0U; + + __IO uint32_t pp_ctl = 0U; + + usb_pipe *pp = &pudev->host.pipe[pipe_num]; + + uint16_t max_packet_len = pp->ep.mps; + + /* compute the expected number of packets associated to the transfer */ + if (pp->xfer_len > 0U) { + packet_count = (pp->xfer_len + max_packet_len - 1U) / max_packet_len; + + if (packet_count > HC_MAX_PACKET_COUNT) { + packet_count = HC_MAX_PACKET_COUNT; + pp->xfer_len = packet_count * max_packet_len; + } + } else { + packet_count = 1U; + } + + if (pp->ep.dir) { + pp->xfer_len = packet_count * max_packet_len; + } + + /* initialize the host channel transfer information */ + pudev->regs.pr[pipe_num]->HCHLEN = pp->xfer_len | pp->DPID | PIPE_XFER_PCNT(packet_count); + + if (USB_USE_DMA == pudev->bp.transfer_mode) { + pudev->regs.pr[pipe_num]->HCHDMAADDR = (unsigned int)pp->xfer_buf; + } + + pp_ctl = pudev->regs.pr[pipe_num]->HCHCTL; + + if (usb_frame_even(pudev)) { + pp_ctl |= HCHCTL_ODDFRM; + } else { + pp_ctl &= ~HCHCTL_ODDFRM; + } + + /* set host channel enabled */ + pp_ctl |= HCHCTL_CEN; + pp_ctl &= ~HCHCTL_CDIS; + + pudev->regs.pr[pipe_num]->HCHCTL = pp_ctl; + + if (USB_USE_FIFO == pudev->bp.transfer_mode) { + if ((0U == pp->ep.dir) && (pp->xfer_len > 0U)) { + switch (pp->ep.type) { + /* non-periodic transfer */ + case USB_EPTYPE_CTRL: + case USB_EPTYPE_BULK: + dword_len = (pp->xfer_len + 3U) / 4U; + + /* check if there is enough space in fifo space */ + if (dword_len > (pudev->regs.gr->HNPTFQSTAT & HNPTFQSTAT_NPTXFS)) { + /* need to process data in nptxfempty interrupt */ + pudev->regs.gr->GINTEN |= GINTEN_NPTXFEIE; + } + break; + + /* periodic transfer */ + case USB_EPTYPE_INTR: + case USB_EPTYPE_ISOC: + dword_len = (pp->xfer_len + 3U) / 4U; + + /* check if there is enough space in fifo space */ + if (dword_len > (pudev->regs.hr->HPTFQSTAT & HPTFQSTAT_PTXFS)) { + /* need to process data in ptxfempty interrupt */ + pudev->regs.gr->GINTEN |= GINTEN_PTXFEIE; + } + break; + + default: + break; + } + + /* write packet into the tx fifo. */ + usb_txfifo_write (&pudev->regs, pp->xfer_buf, pipe_num, pp->xfer_len); + } + } + + return status; +} + +/*! + \brief halt pipe + \param[in] pudev: pointer to usb device + \param[in] pipe_num: host pipe number which is in (0..7) + \param[out] none + \retval operation status +*/ +usb_status usb_pipe_halt (usb_core_driver *pudev, uint8_t pipe_num) +{ + __IO uint32_t pp_ctl = pudev->regs.pr[pipe_num]->HCHCTL; + + uint8_t ep_type = (pp_ctl & HCHCTL_EPTYPE) >> 18U; + + pp_ctl |= HCHCTL_CEN | HCHCTL_CDIS; + + switch (ep_type) { + case USB_EPTYPE_CTRL: + case USB_EPTYPE_BULK: + if (0U == (pudev->regs.gr->HNPTFQSTAT & HNPTFQSTAT_NPTXFS)) { + pp_ctl &= ~HCHCTL_CEN; + } + break; + + case USB_EPTYPE_INTR: + case USB_EPTYPE_ISOC: + if (0U == (pudev->regs.hr->HPTFQSTAT & HPTFQSTAT_PTXFS)) { + pp_ctl &= ~HCHCTL_CEN; + } + break; + + default: + break; + } + + pudev->regs.pr[pipe_num]->HCHCTL = pp_ctl; + + return USB_OK; +} + +/*! + \brief configure host pipe to do ping operation + \param[in] pudev: pointer to usb device + \param[in] pipe_num: host pipe number which is in (0..7) + \param[out] none + \retval operation status +*/ +usb_status usb_pipe_ping (usb_core_driver *pudev, uint8_t pipe_num) +{ + uint32_t pp_ctl = 0U; + + pudev->regs.pr[pipe_num]->HCHLEN = HCHLEN_PING | (HCHLEN_PCNT & (1U << 19U)); + + pp_ctl = pudev->regs.pr[pipe_num]->HCHCTL; + + pp_ctl |= HCHCTL_CEN; + pp_ctl &= ~HCHCTL_CDIS; + + pudev->regs.pr[pipe_num]->HCHCTL = pp_ctl; + + return USB_OK; +} + +/*! + \brief stop the USB host and clean up FIFO + \param[in] none + \param[out] none + \retval none +*/ +void usb_host_stop (usb_core_driver *pudev) +{ + uint32_t i; + __IO uint32_t pp_ctl = 0U; + + pudev->regs.hr->HACHINTEN = 0x0U; + pudev->regs.hr->HACHINT = 0xFFFFFFFFU; + + /* flush out any leftover queued requests. */ + for (i = 0U; i < pudev->bp.num_pipe; i++) { + pp_ctl = pudev->regs.pr[i]->HCHCTL; + + pp_ctl &= ~(HCHCTL_CEN | HCHCTL_EPDIR); + pp_ctl |= HCHCTL_CDIS; + + pudev->regs.pr[i]->HCHCTL = pp_ctl; + } + + /* flush the FIFO */ + usb_rxfifo_flush (&pudev->regs); + usb_txfifo_flush (&pudev->regs, 0x10U); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c new file mode 100644 index 0000000..f2c74c9 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usbd_int.c @@ -0,0 +1,595 @@ +/*! + \file drv_usbd_int.c + \brief USB device mode interrupt routines + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "usbd_conf.h" +#include "drv_usbd_int.h" +#include "usbd_transc.h" + +static uint32_t usbd_int_epout (usb_core_driver *udev); +static uint32_t usbd_int_epin (usb_core_driver *udev); +static uint32_t usbd_int_rxfifo (usb_core_driver *udev); +static uint32_t usbd_int_reset (usb_core_driver *udev); +static uint32_t usbd_int_enumfinish (usb_core_driver *udev); +static uint32_t usbd_int_suspend (usb_core_driver *udev); + +static uint32_t usbd_emptytxfifo_write (usb_core_driver *udev, uint32_t ep_num); + +static const uint8_t USB_SPEED[4] = { + [DSTAT_EM_HS_PHY_30MHZ_60MHZ] = USB_SPEED_HIGH, + [DSTAT_EM_FS_PHY_30MHZ_60MHZ] = USB_SPEED_FULL, + [DSTAT_EM_FS_PHY_48MHZ] = USB_SPEED_FULL, + [DSTAT_EM_LS_PHY_6MHZ] = USB_SPEED_LOW +}; + +__IO uint8_t setupc_flag = 0U; + +#ifdef USB_OTG_HS_DEDICATED_EP1_ENABLED + +/*! + \brief USB dedicated OUT endpoint 1 interrupt service routine handler + \param[in] udev: pointer to usb device instance + \param[out] none + \retval operation status +*/ +uint32_t USBD_OTG_EP1OUT_ISR_Handler (usb_core_driver *udev) +{ + uint32_t oepintr = 0U; + uint32_t oeplen = 0U; + + oepintr = udev->regs.er_out[1]->DOEPINTF; + oepintr &= udev->regs.dr->DOEP1INTEN; + + /* Transfer complete */ + if (oepintr & DOEPINTF_TF) + { + /* Clear the bit in DOEPINTn for this interrupt */ + udev->regs.er_out[1]->DOEPINTF = DOEPINTF_TF; + + if (USB_USE_DMA == udev->bp.transfer_mode) + { + oeplen = udev->regs.er_out[1]->DOEPLEN; + + /* ToDo : handle more than one single MPS size packet */ + udev->dev.transc_out[1].xfer_count = udev->dev.transc_out[1].usb_transc - \ + oeplen & DEPLEN_TLEN; + } + + /* RX COMPLETE */ + USBD_DCD_INT_fops->DataOutStage(udev, 1); + } + + return 1; +} + +/*! + \brief USB dedicated IN endpoint 1 interrupt service routine handler + \param[in] udev: pointer to usb device instance + \param[out] none + \retval operation status +*/ +uint32_t USBD_OTG_EP1IN_ISR_Handler (usb_core_driver *udev) +{ + uint32_t inten, intr, emptyen; + + inten = udev->regs.dr->DIEP1INTEN; + emptyen = udev->regs.dr->DIEPFEINTEN; + + inten |= ((emptyen >> 1 ) & 0x1) << 7; + + intr = udev->regs.er_in[1]->DIEPINTF & inten; + + if (intr & DIEPINTF_TF) + { + udev->regs.dr->DIEPFEINTEN &= ~(0x1 << 1); + + udev->regs.er_in[1]->DIEPINTF = DIEPINTF_TF; + + /* TX COMPLETE */ + USBD_DCD_INT_fops->DataInStage(udev, 1); + } + + if (intr & DIEPINTF_TXFE) + { + DCD_WriteEmptyTxFifo(udev, 1); + + udev->regs.er_in[1]->DIEPINTF = DIEPINTF_TXFE; + } + + return 1; +} + +#endif + + +/*! + \brief USB device-mode interrupts global service routine handler + \param[in] udev: pointer to usb device instance + \param[out] none + \retval none +*/ +void usbd_isr (usb_core_driver *udev) +{ + if (HOST_MODE != (udev->regs.gr->GINTF & GINTF_COPM)) { + uint32_t intr = udev->regs.gr->GINTF & udev->regs.gr->GINTEN; + + /* there are no interrupts, avoid spurious interrupt */ + if (!intr) { + return; + } + + /* OUT endpoints interrupts */ + if (intr & GINTF_OEPIF) { + usbd_int_epout (udev); + } + + /* IN endpoints interrupts */ + if (intr & GINTF_IEPIF) { + usbd_int_epin (udev); + } + + /* suspend interrupt */ + if (intr & GINTF_SP) { + usbd_int_suspend (udev); + } + + /* wakeup interrupt */ + if (intr & GINTF_WKUPIF) { + /* inform upper layer by the resume event */ + udev->dev.cur_status = udev->dev.backup_status; + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_WKUPIF; + } + + /* wakeup interrupt */ + if (intr & GINTF_MFIF) { + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_MFIF; + } + + /* start of frame interrupt */ + if (intr & GINTF_SOF) { + if (udev->dev.class_core->SOF) { + udev->dev.class_core->SOF(udev); + } + + if (0U != setupc_flag) { + setupc_flag ++; + + if (setupc_flag >= 3U) { + usbd_setup_transc (udev); + + setupc_flag = 0U; + } + } + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_SOF; + } + + /* receive FIFO not empty interrupt */ + if (intr & GINTF_RXFNEIF) { + usbd_int_rxfifo (udev); + } + + /* USB reset interrupt */ + if (intr & GINTF_RST) { + usbd_int_reset (udev); + } + + /* enumeration has been done interrupt */ + if (intr & GINTF_ENUMFIF) { + usbd_int_enumfinish (udev); + } + + /* incomplete synchronization IN transfer interrupt*/ + if (intr & GINTF_ISOINCIF) { + if (NULL != udev->dev.class_core->incomplete_isoc_in) { + udev->dev.class_core->incomplete_isoc_in(udev); + } + + /* Clear interrupt */ + udev->regs.gr->GINTF = GINTF_ISOINCIF; + } + + /* incomplete synchronization OUT transfer interrupt*/ + if (intr & GINTF_ISOONCIF) { + if (NULL != udev->dev.class_core->incomplete_isoc_out) { + udev->dev.class_core->incomplete_isoc_out(udev); + } + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_ISOONCIF; + } + +#ifdef VBUS_SENSING_ENABLED + + /* Session request interrupt */ + if (intr & GINTF_SESIF) { + udev->regs.gr->GINTF = GINTF_SESIF; + } + + /* OTG mode interrupt */ + if (intr & GINTF_OTGIF) { + if(udev->regs.gr->GOTGINTF & GOTGINTF_SESEND) { + + } + + /* Clear OTG interrupt */ + udev->regs.gr->GINTF = GINTF_OTGIF; + } +#endif + } +} + +/*! + \brief indicates that an OUT endpoint has a pending interrupt + \param[in] udev: pointer to usb device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbd_int_epout (usb_core_driver *udev) +{ + uint32_t epintnum = 0U; + uint32_t ep_num = 0U; + + for (epintnum = usb_oepintnum_read (udev); epintnum; epintnum >>= 1, ep_num++) { + if (epintnum & 0x1) { + __IO uint32_t oepintr = usb_oepintr_read (udev, ep_num); + + /* transfer complete interrupt */ + if (oepintr & DOEPINTF_TF) { + /* clear the bit in DOEPINTF for this interrupt */ + udev->regs.er_out[ep_num]->DOEPINTF = DOEPINTF_TF; + + if (USB_USE_DMA == udev->bp.transfer_mode) { + __IO uint32_t eplen = udev->regs.er_out[ep_num]->DOEPLEN; + + udev->dev.transc_out[ep_num].xfer_count = udev->dev.transc_out[ep_num].max_len - \ + eplen & DEPLEN_TLEN; + } + + /* inform upper layer: data ready */ + usbd_out_transc (udev, ep_num); + + if (USB_USE_DMA == udev->bp.transfer_mode) { + if ((0U == ep_num) && (USB_CTL_STATUS_OUT == udev->dev.control.ctl_state)) { + usb_ctlep_startout (udev); + } + } + } + + /* setup phase finished interrupt (control endpoints) */ + if (oepintr & DOEPINTF_STPF) { + /* inform the upper layer that a setup packet is available */ + if ((0U == ep_num) && (0U != setupc_flag)) { + usbd_setup_transc (udev); + + setupc_flag = 0U; + + udev->regs.er_out[ep_num]->DOEPINTF = DOEPINTF_STPF; + } + } + } + } + + return 1; +} + +/*! + \brief indicates that an IN endpoint has a pending interrupt + \param[in] udev: pointer to usb device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbd_int_epin (usb_core_driver *udev) +{ + uint32_t epintnum = 0U; + uint32_t ep_num = 0U; + + for (epintnum = usb_iepintnum_read (udev); epintnum; epintnum >>= 1, ep_num++) { + if (epintnum & 0x1U) { + __IO uint32_t iepintr = usb_iepintr_read (udev, ep_num); + + if (iepintr & DIEPINTF_TF) { + udev->regs.er_in[ep_num]->DIEPINTF = DIEPINTF_TF; + + /* data transmittion is completed */ + usbd_in_transc (udev, ep_num); + + if (USB_USE_DMA == udev->bp.transfer_mode) { + if ((0U == ep_num) && (USB_CTL_STATUS_IN == udev->dev.control.ctl_state)) { + usb_ctlep_startout (udev); + } + } + } + + if (iepintr & DIEPINTF_TXFE) { + usbd_emptytxfifo_write (udev, ep_num); + + udev->regs.er_in[ep_num]->DIEPINTF = DIEPINTF_TXFE; + } + } + } + + return 1; +} + +/*! + \brief handle the RX status queue level interrupt + \param[in] udev: pointer to usb device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbd_int_rxfifo (usb_core_driver *udev) +{ + usb_transc *transc = NULL; + + uint8_t data_PID = 0; + uint32_t bcount = 0; + + __IO uint32_t devrxstat = 0; + + /* disable the Rx status queue non-empty interrupt */ + udev->regs.gr->GINTEN &= ~GINTEN_RXFNEIE; + + /* get the status from the top of the FIFO */ + devrxstat = udev->regs.gr->GRSTATP; + + transc = &udev->dev.transc_out[devrxstat & GRSTATRP_EPNUM]; + + bcount = (devrxstat & GRSTATRP_BCOUNT) >> 4; + data_PID = (devrxstat & GRSTATRP_DPID) >> 15; + + switch ((devrxstat & GRSTATRP_RPCKST) >> 17) { + case RSTAT_GOUT_NAK: + break; + + case RSTAT_DATA_UPDT: + if (bcount > 0) { + usb_rxfifo_read (&udev->regs, transc->xfer_buf, bcount); + + transc->xfer_buf += bcount; + transc->xfer_count += bcount; + } + break; + + case RSTAT_XFER_COMP: + /* trigger the OUT enpoint interrupt */ + break; + + case RSTAT_SETUP_COMP: + /* trigger the OUT enpoint interrupt */ + break; + + case RSTAT_SETUP_UPDT: + if ((transc->ep_addr.num == 0) && (bcount == 8) && (data_PID == DPID_DATA0)) { + /* copy the setup packet received in FIFO into the setup buffer in RAM */ + usb_rxfifo_read (&udev->regs, (uint8_t *)&udev->dev.control.req, bcount); + + transc->xfer_count += bcount; + + setupc_flag = 1; + } + break; + + default: + break; + } + + /* enable the Rx status queue level interrupt */ + udev->regs.gr->GINTEN |= GINTEN_RXFNEIE; + + return 1; +} + +/*! + \brief handle USB reset interrupt + \param[in] udev: pointer to usb device instance + \param[out] none + \retval status +*/ +static uint32_t usbd_int_reset (usb_core_driver *udev) +{ + uint32_t i; + + /* clear the remote wakeup signaling */ + udev->regs.dr->DCTL &= ~DCTL_RWKUP; + + /* flush the Tx FIFO */ + usb_txfifo_flush (&udev->regs, 0); + + for (i = 0; i < udev->bp.num_ep; i++) { + udev->regs.er_in[i]->DIEPINTF = 0xFFU; + udev->regs.er_out[i]->DOEPINTF = 0xFFU; + } + + /* clear all pending device endpoint interrupts */ + udev->regs.dr->DAEPINT = 0xFFFFFFFFU; + + /* enable endpoint 0 interrupts */ + udev->regs.dr->DAEPINTEN = 1U | (1U << 16); + + /* enable OUT endpoint interrupts */ + udev->regs.dr->DOEPINTEN = DOEPINTEN_STPFEN | DOEPINTEN_TFEN; + + /* enable IN endpoint interrupts */ + udev->regs.dr->DIEPINTEN = DIEPINTEN_TFEN; + + /* reset device address */ + udev->regs.dr->DCFG &= ~DCFG_DAR; + udev->dev.dev_addr = 0U; + + /* configure endpoint 0 to receive SETUP packets */ + usb_ctlep_startout (udev); + + /* clear USB reset interrupt */ + udev->regs.gr->GINTF = GINTF_RST; + + udev->dev.transc_out[0] = (usb_transc) { + .ep_type = USB_EPTYPE_CTRL, + .max_len = USB_FS_EP0_MAX_LEN + }; + + usb_transc_active (udev, &udev->dev.transc_out[0]); + + udev->dev.transc_in[0] = (usb_transc) { + .ep_addr = { + .dir = 1 + }, + + .ep_type = USB_EPTYPE_CTRL, + .max_len = USB_FS_EP0_MAX_LEN + }; + + usb_transc_active (udev, &udev->dev.transc_in[0]); + + /* upon reset call usr call back */ + udev->dev.cur_status = USBD_DEFAULT; + + return 1; +} + +/*! + \brief handle USB speed enumeration finish interrupt + \param[in] udev: pointer to usb device instance + \param[out] none + \retval status +*/ +static uint32_t usbd_int_enumfinish (usb_core_driver *udev) +{ + uint8_t enum_speed = (uint8_t)((udev->regs.dr->DSTAT & DSTAT_ES) >> 1U); + + udev->regs.dr->DCTL &= ~DCTL_CGINAK; + udev->regs.dr->DCTL |= DCTL_CGINAK; + + udev->regs.gr->GUSBCS &= ~GUSBCS_UTT; + + /* set USB turn-around time based on device speed and PHY interface */ + if (USB_SPEED[enum_speed] == USB_SPEED_HIGH) { + udev->bp.core_speed = USB_SPEED_HIGH; + + udev->regs.gr->GUSBCS |= 0x09 << 10; + } else { + udev->bp.core_speed = USB_SPEED_FULL; + + udev->regs.gr->GUSBCS |= 0x05 << 10; + } + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_ENUMFIF; + + return 1; +} + +/*! + \brief USB suspend interrupt handler + \param[in] udev: pointer to USB device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbd_int_suspend (usb_core_driver *udev) +{ + __IO uint8_t low_power = udev->bp.low_power; + __IO uint8_t suspend = (uint8_t)(udev->regs.dr->DSTAT & DSTAT_SPST); + __IO uint8_t is_configured = (udev->dev.cur_status == USBD_CONFIGURED)? 1U : 0U; + + udev->dev.backup_status = udev->dev.cur_status; + udev->dev.cur_status = USBD_SUSPENDED; + + if (low_power && suspend && is_configured) { + /* switch-off the otg clocks */ + *udev->regs.PWRCLKCTL |= PWRCLKCTL_SUCLK | PWRCLKCTL_SHCLK; + + /* enter DEEP_SLEEP mode with LDO in low power mode */ + pmu_to_deepsleepmode(PMU_LDO_LOWPOWER, WFI_CMD); + } + + /* clear interrupt */ + udev->regs.gr->GINTF = GINTF_SP; + + return 1U; +} + +/*! + \brief check FIFO for the next packet to be loaded + \param[in] udev: pointer to usb device instance + \param[in] ep_num: endpoint identifier which is in (0..3) + \param[out] none + \retval status +*/ +static uint32_t usbd_emptytxfifo_write (usb_core_driver *udev, uint32_t ep_num) +{ + usb_transc *transc = NULL; + + uint32_t len = 0; + uint32_t word_count = 0; + + transc = &udev->dev.transc_in[ep_num]; + + len = transc->xfer_len - transc->xfer_count; + + /* get the data length to write */ + if (len > transc->max_len) { + len = transc->max_len; + } + + word_count = (len + 3) / 4; + + while (((udev->regs.er_in[ep_num]->DIEPTFSTAT & DIEPTFSTAT_IEPTFS) > word_count) && \ + (transc->xfer_count < transc->xfer_len)) { + len = transc->xfer_len - transc->xfer_count; + + if (len > transc->max_len) { + len = transc->max_len; + } + + /* write FIFO in word(4bytes) */ + word_count = (len + 3) / 4; + + /* write the FIFO */ + usb_txfifo_write (&udev->regs, transc->xfer_buf, ep_num, len); + + transc->xfer_buf += len; + transc->xfer_count += len; + + if (transc->xfer_count == transc->xfer_len) { + /* disable the device endpoint FIFO empty interrupt */ + udev->regs.dr->DIEPFEINTEN &= ~(0x01 << ep_num); + } + } + + return 1; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usbh_int.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usbh_int.c new file mode 100644 index 0000000..7b649a1 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/drv_usbh_int.c @@ -0,0 +1,536 @@ +/*! + \file drv_usbh_int.c + \brief USB host mode interrupt handler file + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "../Include/drv_usb_core.h" +#include "../Include/drv_usb_host.h" +#include "../Include/drv_usbh_int.h" + +#if defined (__GNUC__) /*!< GNU compiler */ + #pragma GCC optimize ("O0") +#endif /* __GNUC__ */ + +static uint32_t usbh_int_port (usb_core_driver *pudev); +static uint32_t usbh_int_pipe (usb_core_driver *pudev); +static uint32_t usbh_int_pipe_in (usb_core_driver *pudev, uint32_t pp_num); +static uint32_t usbh_int_pipe_out (usb_core_driver *pudev, uint32_t pp_num); +static uint32_t usbh_int_rxfifonoempty (usb_core_driver *pudev); +static uint32_t usbh_int_txfifoempty (usb_core_driver *pudev, usb_pipe_mode pp_mode); + +static inline void usb_pp_halt (usb_core_driver *pudev, + uint8_t pp_num, + uint32_t pp_int, + usb_pipe_staus pp_status) +{ + pudev->regs.pr[pp_num]->HCHINTEN |= HCHINTEN_CHIE; + + usb_pipe_halt(pudev, pp_num); + + pudev->regs.pr[pp_num]->HCHINTF = pp_int; + + pudev->host.pipe[pp_num].pp_status = pp_status; +} + +/*! + \brief handle global host interrupt + \param[in] pudev: pointer to usb core instance + \param[out] none + \retval operation status +*/ +uint32_t usbh_isr (usb_core_driver *pudev) +{ + uint32_t Retval = 0U; + + __IO uint32_t intr = 0U; + + /* check if host mode */ + if (HOST_MODE == (pudev->regs.gr->GINTF & GINTF_COPM)) { + intr = usb_coreintr_get(&pudev->regs); + + if (!intr) { + return 0; + } + + if (intr & GINTF_SOF) { + usbh_int_fop->SOF(pudev); + + /* clear interrupt */ + pudev->regs.gr->GINTF = GINTF_SOF; + } + + if (intr & GINTF_RXFNEIF) { + Retval |= usbh_int_rxfifonoempty (pudev); + } + + if (intr & GINTF_NPTXFEIF) { + Retval |= usbh_int_txfifoempty (pudev, PIPE_NON_PERIOD); + } + + if (intr & GINTF_PTXFEIF) { + Retval |= usbh_int_txfifoempty (pudev, PIPE_PERIOD); + } + + if (intr & GINTF_HCIF) { + Retval |= usbh_int_pipe (pudev); + } + + if (intr & GINTF_HPIF) { + Retval |= usbh_int_port (pudev); + } + + if (intr & GINTF_DISCIF) { + pudev->host.connect_status = 0U; + + /* clear interrupt */ + pudev->regs.gr->GINTF = GINTF_DISCIF; + } + + if (intr & GINTF_ISOONCIF) { + pudev->regs.pr[0]->HCHCTL |= HCHCTL_CEN | HCHCTL_CDIS; + + /* clear interrupt */ + pudev->regs.gr->GINTF = GINTF_ISOONCIF; + } + } + + return Retval; +} + +/*! + \brief handle all host channels interrupt + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbh_int_pipe (usb_core_driver *pudev) +{ + uint32_t pp_num = 0U; + uint32_t retval = 0U; + + for (pp_num = 0U; pp_num < pudev->bp.num_pipe; pp_num++) { + if ((pudev->regs.hr->HACHINT & HACHINT_HACHINT) & (1U << pp_num)) { + if (pudev->regs.pr[pp_num]->HCHCTL & HCHCTL_EPDIR) { + retval |= usbh_int_pipe_in (pudev, pp_num); + } else { + retval |= usbh_int_pipe_out (pudev, pp_num); + } + } + } + + return retval; +} + +/*! + \brief handle the TX FIFO empty interrupt + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbh_int_txfifoempty (usb_core_driver *pudev, usb_pipe_mode pp_mode) +{ + uint8_t pp_num = 0U; + uint16_t word_count = 0U, len = 0U; + __IO uint32_t *txfiforeg = 0U, txfifostate = 0U; + + if (PIPE_NON_PERIOD == pp_mode) { + txfiforeg = &pudev->regs.gr->HNPTFQSTAT; + } else if (PIPE_PERIOD == pp_mode) { + txfiforeg = &pudev->regs.hr->HPTFQSTAT; + } else { + return 0U; + } + + txfifostate = *txfiforeg; + + pp_num = (txfifostate & TFQSTAT_CNUM) >> 27U; + + word_count = (pudev->host.pipe[pp_num].xfer_len + 3U) / 4U; + + while (((txfifostate & TFQSTAT_TXFS) > word_count) && (0U != pudev->host.pipe[pp_num].xfer_len)) { + len = (txfifostate & TFQSTAT_TXFS) * 4U; + + if (len > pudev->host.pipe[pp_num].xfer_len) { + /* last packet */ + len = pudev->host.pipe[pp_num].xfer_len; + + if (PIPE_NON_PERIOD == pp_mode) { + pudev->regs.gr->GINTEN &= ~GINTEN_NPTXFEIE; + } else { + pudev->regs.gr->GINTEN &= ~GINTEN_PTXFEIE; + } + } + + word_count = (pudev->host.pipe[pp_num].xfer_len + 3U) / 4U; + usb_txfifo_write (&pudev->regs, pudev->host.pipe[pp_num].xfer_buf, pp_num, len); + + pudev->host.pipe[pp_num].xfer_buf += len; + pudev->host.pipe[pp_num].xfer_len -= len; + pudev->host.pipe[pp_num].xfer_count += len; + + txfifostate = *txfiforeg; + } + + return 1; +} + +/*! + \brief handle the host port interrupt + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbh_int_port (usb_core_driver *pudev) +{ + uint32_t retval = 0U; + + __IO uint32_t port_state = *pudev->regs.HPCS; + + /* clear the interrupt bits in GINTSTS */ + port_state &= ~(HPCS_PE | HPCS_PCD | HPCS_PEDC); + + /* port connect detected */ + if (*pudev->regs.HPCS & HPCS_PCD) { + port_state |= HPCS_PCD; + + pudev->host.connect_status = 1U; + + retval |= 1U; + } + + /* port enable changed */ + if (*pudev->regs.HPCS & HPCS_PEDC) { + port_state |= HPCS_PEDC; + + if (*pudev->regs.HPCS & HPCS_PE) { + uint32_t port_speed = usb_curspeed_get(pudev); + uint32_t clock_type = pudev->regs.hr->HCTL & HCTL_CLKSEL; + + pudev->host.connect_status = 1U; + + if (PORT_SPEED_LOW == port_speed) { + pudev->regs.hr->HFT = 6000U; + + if (HCTL_6MHZ != clock_type) { + if (USB_EMBEDDED_PHY == pudev->bp.phy_itf) { + usb_phyclock_config (pudev, HCTL_6MHZ); + } + } + } else if (PORT_SPEED_FULL == port_speed) { + pudev->regs.hr->HFT = 48000U; + + if (HCTL_48MHZ != clock_type) { + usb_phyclock_config (pudev, HCTL_48MHZ); + } + } else { + /* for high speed device and others */ + } + + pudev->host.port_enabled = 1U; + + pudev->regs.gr->GINTEN |= GINTEN_DISCIE; + } else { + pudev->host.port_enabled = 0U; + } + } + + /* clear port interrupts */ + *pudev->regs.HPCS = port_state; + + return retval; +} + +/*! + \brief handle the OUT channel interrupt + \param[in] pudev: pointer to usb device instance + \param[in] pp_num: host channel number which is in (0..7) + \param[out] none + \retval operation status +*/ +uint32_t usbh_int_pipe_out (usb_core_driver *pudev, uint32_t pp_num) +{ + usb_pr *pp_reg = pudev->regs.pr[pp_num]; + + usb_pipe *pp = &pudev->host.pipe[pp_num]; + + uint32_t intr_pp = pp_reg->HCHINTF & pp_reg->HCHINTEN; + + if (intr_pp & HCHINTF_ACK) { + pp_reg->HCHINTF = HCHINTF_ACK; + } else if (intr_pp & HCHINTF_STALL) { + usb_pp_halt (pudev, pp_num, HCHINTF_STALL, PIPE_STALL); + } else if (intr_pp & HCHINTF_DTER) { + usb_pp_halt (pudev, pp_num, HCHINTF_DTER, PIPE_DTGERR); + pp_reg->HCHINTF = HCHINTF_NAK; + } else if (intr_pp & HCHINTF_REQOVR) { + usb_pp_halt (pudev, pp_num, HCHINTF_REQOVR, PIPE_REQOVR); + } else if (intr_pp & HCHINTF_TF) { + pp->err_count = 0U; + usb_pp_halt (pudev, pp_num, HCHINTF_TF, PIPE_XF); + } else if (intr_pp & HCHINTF_NAK) { + pp->err_count = 0U; + usb_pp_halt (pudev, pp_num, HCHINTF_NAK, PIPE_NAK); + } else if (intr_pp & HCHINTF_USBER) { + pp->err_count++; + usb_pp_halt (pudev, pp_num, HCHINTF_USBER, PIPE_TRACERR); + } else if (intr_pp & HCHINTF_NYET) { + pp->err_count = 0U; + usb_pp_halt (pudev, pp_num, HCHINTF_NYET, PIPE_NYET); + } else if (intr_pp & HCHINTF_CH) { + pudev->regs.pr[pp_num]->HCHINTEN &= ~HCHINTEN_CHIE; + + switch (pp->pp_status) { + case PIPE_XF: + pp->urb_state = URB_DONE; + + if (USB_EPTYPE_BULK == ((pp_reg->HCHCTL & HCHCTL_EPTYPE) >> 18U)) { + pp->data_toggle_out ^= 1U; + } + break; + + case PIPE_NAK: + pp->urb_state = URB_NOTREADY; + break; + + case PIPE_NYET: + if (1U == pudev->host.pipe[pp_num].ping) { + usb_pipe_ping (pudev, pp_num); + } + + pp->urb_state = URB_NOTREADY; + break; + + case PIPE_STALL: + pp->urb_state = URB_STALL; + break; + + case PIPE_TRACERR: + if (3U == pp->err_count) { + pp->urb_state = URB_ERROR; + pp->err_count = 0U; + } + break; + + default: + break; + } + + pp_reg->HCHINTF = HCHINTF_CH; + } + + return 1; +} + +/*! + \brief handle the IN channel interrupt + \param[in] pudev: pointer to usb device instance + \param[in] pp_num: host channel number which is in (0..7) + \param[out] none + \retval operation status +*/ +uint32_t usbh_int_pipe_in (usb_core_driver *pudev, uint32_t pp_num) +{ + usb_pr *pp_reg = pudev->regs.pr[pp_num]; + + usb_pipe *pp = &pudev->host.pipe[pp_num]; + + __IO uint32_t intr_pp = pp_reg->HCHINTF & pp_reg->HCHINTEN; + + uint8_t ep_type = (pp_reg->HCHCTL & HCHCTL_EPTYPE) >> 18U; + + if (intr_pp & HCHINTF_ACK) { + pp_reg->HCHINTF = HCHINTF_ACK; + } else if (intr_pp & HCHINTF_STALL) { + usb_pp_halt (pudev, pp_num, HCHINTF_STALL, PIPE_STALL); + pp_reg->HCHINTF = HCHINTF_NAK; + + /* note: When there is a 'STALL', reset also nak, + else, the pudev->host.pp_status = HC_STALL + will be overwritten by 'NAK' in code below */ + intr_pp &= ~HCHINTF_NAK; + } else if (intr_pp & HCHINTF_DTER) { + usb_pp_halt (pudev, pp_num, HCHINTF_DTER, PIPE_DTGERR); + pp_reg->HCHINTF = HCHINTF_NAK; + } + + if (intr_pp & HCHINTF_REQOVR) { + usb_pp_halt (pudev, pp_num, HCHINTF_REQOVR, PIPE_REQOVR); + } else if (intr_pp & HCHINTF_TF) { + if (USB_USE_DMA == pudev->bp.transfer_mode) { + pudev->host.backup_xfercount[pp_num] = pp->xfer_len - pp_reg->HCHLEN & HCHLEN_TLEN; + } + + pp->pp_status = PIPE_XF; + pp->err_count = 0U; + + pp_reg->HCHINTF = HCHINTF_TF; + + switch (ep_type) { + case USB_EPTYPE_CTRL: + case USB_EPTYPE_BULK: + usb_pp_halt (pudev, pp_num, HCHINTF_NAK, PIPE_XF); + + pp->data_toggle_in ^= 1U; + break; + + case USB_EPTYPE_INTR: + pp_reg->HCHCTL |= HCHCTL_ODDFRM; + pp->urb_state = URB_DONE; + break; + + default: + break; + } + } else if (intr_pp & HCHINTF_CH) { + pp_reg->HCHINTEN &= ~HCHINTEN_CHIE; + + switch (pp->pp_status) { + case PIPE_XF: + pp->urb_state = URB_DONE; + break; + + case PIPE_STALL: + pp->urb_state = URB_STALL; + break; + + case PIPE_TRACERR: + case PIPE_DTGERR: + pp->err_count = 0U; + pp->urb_state = URB_ERROR; + break; + + default: + if(USB_EPTYPE_INTR == ep_type) { + pp->data_toggle_in ^= 1U; + } + break; + } + + pp_reg->HCHINTF = HCHINTF_CH; + } else if (intr_pp & HCHINTF_BBER) { + pp->err_count++; + usb_pp_halt (pudev, pp_num, HCHINTF_BBER, PIPE_TRACERR); + } else if (intr_pp & HCHINTF_NAK) { + switch (ep_type) { + case USB_EPTYPE_CTRL: + case USB_EPTYPE_BULK: + /* re-activate the channel */ + pp_reg->HCHCTL = (pp_reg->HCHCTL | HCHCTL_CEN) & ~HCHCTL_CDIS; + break; + + case USB_EPTYPE_INTR: + pp_reg->HCHINTEN |= HCHINTEN_CHIE; + + usb_pipe_halt(pudev, pp_num); + break; + + default: + break; + } + + pp->pp_status = PIPE_NAK; + + pp_reg->HCHINTF = HCHINTF_NAK; + } + + return 1; +} + +/*! + \brief handle the rx fifo non-empty interrupt + \param[in] pudev: pointer to usb device instance + \param[out] none + \retval operation status +*/ +static uint32_t usbh_int_rxfifonoempty (usb_core_driver *pudev) +{ + uint32_t count = 0U; + + __IO uint8_t pp_num = 0U; + __IO uint32_t rx_stat = 0U; + + /* disable the rx status queue level interrupt */ + pudev->regs.gr->GINTEN &= ~GINTEN_RXFNEIE; + + rx_stat = pudev->regs.gr->GRSTATP; + pp_num = rx_stat & GRSTATRP_CNUM; + + switch ((rx_stat & GRSTATRP_RPCKST) >> 17U) { + case GRXSTS_PKTSTS_IN: + count = (rx_stat & GRSTATRP_BCOUNT) >> 4U; + + /* read the data into the host buffer. */ + if ((count > 0U) && (NULL != pudev->host.pipe[pp_num].xfer_buf)) { + usb_rxfifo_read (&pudev->regs, pudev->host.pipe[pp_num].xfer_buf, count); + + /* manage multiple transfer packet */ + pudev->host.pipe[pp_num].xfer_buf += count; + pudev->host.pipe[pp_num].xfer_count += count; + + pudev->host.backup_xfercount[pp_num] = pudev->host.pipe[pp_num].xfer_count; + + if (pudev->regs.pr[pp_num]->HCHLEN & HCHLEN_PCNT) { + /* re-activate the channel when more packets are expected */ + __IO uint32_t pp_ctl = pudev->regs.pr[pp_num]->HCHCTL; + + pp_ctl |= HCHCTL_CEN; + pp_ctl &= ~HCHCTL_CDIS; + + pudev->regs.pr[pp_num]->HCHCTL = pp_ctl; + } + } + break; + + case GRXSTS_PKTSTS_IN_XFER_COMP: + break; + + case GRXSTS_PKTSTS_DATA_TOGGLE_ERR: + count = (rx_stat & GRSTATRP_BCOUNT) >> 4U; + + while (count > 0U) { + rx_stat = pudev->regs.gr->GRSTATP; + count--; + } + break; + + case GRXSTS_PKTSTS_CH_HALTED: + break; + + default: + break; + } + + /* enable the rx status queue level interrupt */ + pudev->regs.gr->GINTEN |= GINTEN_RXFNEIE; + + return 1; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c new file mode 100644 index 0000000..d7a8eae --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbd_core.c @@ -0,0 +1,329 @@ +/*! + \file usbd_core.c + \brief USB device mode core functions + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "../Include/usbd_core.h" +#include "../Include/drv_usb_hw.h" + +/* endpoint type */ +const uint32_t ep_type[] = { + [USB_EP_ATTR_CTL] = USB_EPTYPE_CTRL, + [USB_EP_ATTR_BULK] = USB_EPTYPE_BULK, + [USB_EP_ATTR_INT] = USB_EPTYPE_INTR, + [USB_EP_ATTR_ISO] = USB_EPTYPE_ISOC +}; + +/*! + \brief initailizes the USB device-mode stack and load the class driver + \param[in] udev: pointer to USB core instance + \param[in] core: usb core type + \param[in] class_core: class driver + \param[out] none + \retval none +*/ +void usbd_init (usb_core_driver *udev, usb_core_enum core, usb_class_core *class_core) +{ + /* device descriptor, class and user callbacks */ + udev->dev.class_core = class_core; + + /* configure USB capabilites */ + usb_basic_init (&udev->bp, &udev->regs, core); + + /* initailizes the USB core*/ + usb_core_init (udev->bp, &udev->regs); + + /* set device disconnect */ + usbd_disconnect (udev); + + /* initailizes device mode */ + usb_devcore_init (udev); + + /* set device connect */ + usbd_connect (udev); + + udev->dev.cur_status = USBD_DEFAULT; +} + +/*! + \brief endpoint initialization + \param[in] udev: pointer to USB core instance + \param[in] ep_desc: pointer to endpoint descriptor + \param[out] none + \retval none +*/ +uint32_t usbd_ep_setup (usb_core_driver *udev, const usb_desc_ep *ep_desc) +{ + usb_transc *transc; + + uint8_t ep_addr = ep_desc->bEndpointAddress; + uint8_t max_len = ep_desc->wMaxPacketSize; + + /* set endpoint direction */ + if (EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + + transc->ep_addr.dir = 1U; + } else { + transc = &udev->dev.transc_out[ep_addr]; + + transc->ep_addr.dir = 0U; + } + + transc->ep_addr.num = EP_ID(ep_addr); + transc->max_len = max_len; + transc->ep_type = ep_type[ep_desc->bmAttributes & USB_EPTYPE_MASK]; + + /* active USB endpoint function */ + usb_transc_active (udev, transc); + + return 0; +} + +/*! + \brief configure the endpoint when it is disabled + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_ep_clear (usb_core_driver *udev, uint8_t ep_addr) +{ + usb_transc *transc; + + if (EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + } else { + transc = &udev->dev.transc_out[ep_addr]; + } + + /* deactive USB endpoint function */ + usb_transc_deactivate (udev, transc); + + return 0; +} + + +/*! + \brief endpoint prepare to receive data + \param[in] udev: pointer to usb core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[in] pbuf: user buffer address pointer + \param[in] len: buffer length + \param[out] none + \retval none +*/ +uint32_t usbd_ep_recev (usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t len) +{ + usb_transc *transc = &udev->dev.transc_out[EP_ID(ep_addr)]; + + /* setup the transfer */ + transc->xfer_buf = pbuf; + transc->xfer_len = len; + transc->xfer_count = 0; + + if (USB_USE_DMA == udev->bp.transfer_mode) { + transc->dma_addr = (uint32_t)pbuf; + } + + /* start the transfer */ + usb_transc_outxfer (udev, transc); + + return 0; +} + +/*! + \brief endpoint prepare to transmit data + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[in] pbuf: transmit buffer address pointer + \param[in] len: buffer length + \param[out] none + \retval none +*/ +uint32_t usbd_ep_send (usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t len) +{ + usb_transc *transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + + /* setup the transfer */ + transc->xfer_buf = pbuf; + transc->xfer_len = len; + transc->xfer_count = 0; + + if (USB_USE_DMA == udev->bp.transfer_mode) { + transc->dma_addr = (uint32_t)pbuf; + } + + /* start the transfer */ + usb_transc_inxfer (udev, transc); + + return 0; +} + +/*! + \brief set an endpoint to STALL status + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_ep_stall (usb_core_driver *udev, uint8_t ep_addr) +{ + usb_transc *transc = NULL; + + if (EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + } else { + transc = &udev->dev.transc_out[ep_addr]; + } + + transc->ep_stall = 1; + + usb_transc_stall (udev, transc); + + return (0); +} + +/*! + \brief clear endpoint STALLed status + \param[in] udev: pointer to usb core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_ep_stall_clear (usb_core_driver *udev, uint8_t ep_addr) +{ + usb_transc *transc = NULL; + + if (EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + } else { + transc = &udev->dev.transc_out[ep_addr]; + } + + transc->ep_stall = 0; + + usb_transc_clrstall (udev, transc); + + return (0); +} + +/*! + \brief flush the endpoint FIFOs + \param[in] udev: pointer to usb core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_fifo_flush (usb_core_driver *udev, uint8_t ep_addr) +{ + if (EP_DIR(ep_addr)) { + usb_txfifo_flush (&udev->regs, EP_ID(ep_addr)); + } else { + usb_rxfifo_flush (&udev->regs); + } + + return (0); +} + +/*! + \brief set USB device address + \param[in] udev: pointer to USB core instance + \param[in] addr: device address to set + \param[out] none + \retval none +*/ +void usbd_addr_set (usb_core_driver *udev, uint8_t addr) +{ + usb_devaddr_set(udev, addr); +} + +/*! + \brief get the received data length + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval USB device operation cur_status +*/ +uint16_t usbd_rxcount_get (usb_core_driver *udev, uint8_t ep_num) +{ + return udev->dev.transc_out[ep_num].xfer_count; +} + +/*! + \brief device connect + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void usbd_connect (usb_core_driver *udev) +{ +#ifndef USE_OTG_MODE + /* connect device */ + usb_dev_connect (udev); + usb_mdelay(3); + +#endif /* USE_OTG_MODE */ +} + +/*! + \brief device disconnect + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void usbd_disconnect (usb_core_driver *udev) +{ +#ifndef USE_OTG_MODE + /* disconnect device for 3ms */ + usb_dev_disconnect (udev); + usb_mdelay(3); +#endif /* USE_OTG_MODE */ +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c new file mode 100644 index 0000000..41990a0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbd_enum.c @@ -0,0 +1,696 @@ +/*! + \file usbd_enum.c + \brief USB enumeration function + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "../Include/usbd_enum.h" +#include "../Include/usb_ch9_std.h" + +static usb_reqsta _usb_std_getstatus (usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_setaddress (usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_setconfiguration (usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_getconfiguration (usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_getdescriptor (usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_setfeature (usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_clearfeature (usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_reserved (usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_setdescriptor (usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_getinterface (usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_setinterface (usb_core_driver *udev, usb_req *req); +static usb_reqsta _usb_std_synchframe (usb_core_driver *udev, usb_req *req); + +static uint8_t* _usb_dev_desc_get (usb_core_driver *udev, uint8_t index, uint16_t *len); +static uint8_t* _usb_config_desc_get (usb_core_driver *udev, uint8_t index, uint16_t *len); +static uint8_t* _usb_str_desc_get (usb_core_driver *udev, uint8_t index, uint16_t *len); +static uint8_t* _usb_bos_desc_get (usb_core_driver *udev, uint8_t index, uint16_t *len); + +static usb_reqsta (*_std_dev_req[])(usb_core_driver *udev, usb_req *req) = +{ + [USB_GET_STATUS] = _usb_std_getstatus, + [USB_CLEAR_FEATURE] = _usb_std_clearfeature, + [USB_RESERVED2] = _usb_std_reserved, + [USB_SET_FEATURE] = _usb_std_setfeature, + [USB_RESERVED4] = _usb_std_reserved, + [USB_SET_ADDRESS] = _usb_std_setaddress, + [USB_GET_DESCRIPTOR] = _usb_std_getdescriptor, + [USB_SET_DESCRIPTOR] = _usb_std_setdescriptor, + [USB_GET_CONFIGURATION] = _usb_std_getconfiguration, + [USB_SET_CONFIGURATION] = _usb_std_setconfiguration, + [USB_GET_INTERFACE] = _usb_std_getinterface, + [USB_SET_INTERFACE] = _usb_std_setinterface, + [USB_SYNCH_FRAME] = _usb_std_synchframe, +}; + +/* get standard descriptor handler */ +static uint8_t* (*std_desc_get[])(usb_core_driver *udev, uint8_t index, uint16_t *len) = { + [USB_DESCTYPE_DEV - 1] = _usb_dev_desc_get, + [USB_DESCTYPE_CONFIG - 1] = _usb_config_desc_get, + [USB_DESCTYPE_STR - 1] = _usb_str_desc_get +}; + +/*! + \brief handle USB standard device request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +usb_reqsta usbd_standard_request (usb_core_driver *udev, usb_req *req) +{ + return (*_std_dev_req[req->bRequest])(udev, req); +} + +/*! + \brief handle USB device class request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device class request + \param[out] none + \retval USB device request status +*/ +usb_reqsta usbd_class_request (usb_core_driver *udev, usb_req *req) +{ + if (USBD_CONFIGURED == udev->dev.cur_status) { + if (BYTE_LOW(req->wIndex) <= USBD_ITF_MAX_NUM) { + /* call device class handle function */ + return (usb_reqsta)udev->dev.class_core->req_proc(udev, req); + } + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB vendor request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB vendor request + \param[out] none + \retval USB device request status +*/ +usb_reqsta usbd_vendor_request (usb_core_driver *udev, usb_req *req) +{ + /* added by user... */ + + return REQ_SUPP; +} + +/*! + \brief no operation, just for reserved + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB vendor request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_reserved (usb_core_driver *udev, usb_req *req) +{ + /* no operation... */ + + return REQ_NOTSUPP; +} + +/*! + \brief get the device descriptor + \param[in] udev: pointer to USB device instance + \param[in] index: no use + \param[out] len: data length pointer + \retval descriptor buffer pointer +*/ +static uint8_t* _usb_dev_desc_get (usb_core_driver *udev, uint8_t index, uint16_t *len) +{ + *len = udev->dev.desc.dev_desc[0]; + + return udev->dev.desc.dev_desc; +} + +/*! + \brief get the configuration descriptor + \brief[in] udev: pointer to USB device instance + \brief[in] index: no use + \param[out] len: data length pointer + \retval descriptor buffer pointer +*/ +static uint8_t* _usb_config_desc_get (usb_core_driver *udev, uint8_t index, uint16_t *len) +{ + *len = udev->dev.desc.config_desc[2]; + + return udev->dev.desc.config_desc; +} + +/*! + \brief get the BOS descriptor + \brief[in] udev: pointer to USB device instance + \brief[in] index: no use + \param[out] len: data length pointer + \retval descriptor buffer pointer +*/ +static uint8_t* _usb_bos_desc_get (usb_core_driver *udev, uint8_t index, uint16_t *len) +{ + *len = udev->dev.desc.bos_desc[2]; + + return udev->dev.desc.bos_desc; +} + +/*! + \brief get string descriptor + \param[in] udev: pointer to USB device instance + \param[in] index: string descriptor index + \param[out] len: pointer to string length + \retval descriptor buffer pointer +*/ +static uint8_t* _usb_str_desc_get (usb_core_driver *udev, uint8_t index, uint16_t *len) +{ + uint8_t *desc = udev->dev.desc.strings[index]; + + *len = desc[0]; + + return desc; +} + +/*! + \brief handle Get_Status request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_getstatus (usb_core_driver *udev, usb_req *req) +{ + uint8_t recp = BYTE_LOW(req->wIndex); + + usb_transc *transc = &udev->dev.transc_in[0]; + + static uint8_t status[2] = {0}; + + switch(req->bmRequestType & USB_RECPTYPE_MASK) { + case USB_RECPTYPE_DEV: + if ((USBD_ADDRESSED == udev->dev.cur_status) || \ + (USBD_CONFIGURED == udev->dev.cur_status)) { + + if (udev->dev.pm.power_mode) { + status[0] = USB_STATUS_SELF_POWERED; + } else { + status[0] = 0U; + } + + if (udev->dev.pm.dev_remote_wakeup) { + status[0] |= USB_STATUS_REMOTE_WAKEUP; + } else { + status[0] = 0U; + } + + transc->xfer_buf = status; + transc->remain_len = 2U; + + return REQ_SUPP; + } + break; + + case USB_RECPTYPE_ITF: + if ((USBD_CONFIGURED == udev->dev.cur_status) && (recp <= USBD_ITF_MAX_NUM)) { + transc->xfer_buf = status; + transc->remain_len = 2U; + + return REQ_SUPP; + } + break; + + case USB_RECPTYPE_EP: + if (USBD_CONFIGURED == udev->dev.cur_status) { + if (0x80U == (recp & 0x80U)) { + status[0] = udev->dev.transc_in[EP_ID(recp)].ep_stall; + } else { + status[0] = udev->dev.transc_out[recp].ep_stall; + } + + transc->xfer_buf = status; + transc->remain_len = 2U; + + return REQ_SUPP; + } + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Clear_Feature request + \param[in] udev: pointer to USB device instance + \param[in] req: USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_clearfeature (usb_core_driver *udev, usb_req *req) +{ + uint8_t ep = 0; + + switch(req->bmRequestType & USB_RECPTYPE_MASK) + { + case USB_RECPTYPE_DEV: + if ((USBD_ADDRESSED == udev->dev.cur_status) || \ + (USBD_CONFIGURED == udev->dev.cur_status)) { + + /* clear device remote wakeup feature */ + if (USB_FEATURE_REMOTE_WAKEUP == req->wValue) { + udev->dev.pm.dev_remote_wakeup = 0U; + + return REQ_SUPP; + } + } + break; + + case USB_RECPTYPE_ITF: + break; + + case USB_RECPTYPE_EP: + /* get endpoint address */ + ep = BYTE_LOW(req->wIndex); + + if (USBD_CONFIGURED == udev->dev.cur_status) { + /* clear endpoint halt feature */ + if ((USB_FEATURE_EP_HALT == req->wValue) && (!CTL_EP(ep))) { + usbd_ep_stall_clear (udev, ep); + + udev->dev.class_core->req_proc (udev, req); + } + + return REQ_SUPP; + } + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Set_Feature request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setfeature (usb_core_driver *udev, usb_req *req) +{ + uint8_t ep = 0; + + switch(req->bmRequestType & USB_RECPTYPE_MASK) + { + case USB_RECPTYPE_DEV: + if ((USBD_ADDRESSED == udev->dev.cur_status) || \ + (USBD_CONFIGURED == udev->dev.cur_status)) { + /* set device remote wakeup feature */ + if (USB_FEATURE_REMOTE_WAKEUP == req->wValue) { + udev->dev.pm.dev_remote_wakeup = 1U; + } + + return REQ_SUPP; + } + break; + + case USB_RECPTYPE_ITF: + break; + + case USB_RECPTYPE_EP: + /* get endpoint address */ + ep = BYTE_LOW(req->wIndex); + + if (USBD_CONFIGURED == udev->dev.cur_status) { + /* set endpoint halt feature */ + if ((USB_FEATURE_EP_HALT == req->wValue) && (!CTL_EP(ep))) { + usbd_ep_stall (udev, ep); + } + + return REQ_SUPP; + } + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Set_Address request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setaddress (usb_core_driver *udev, usb_req *req) +{ + if ((0U == req->wIndex) && (0U == req->wLength)) { + udev->dev.dev_addr = (uint8_t)(req->wValue) & 0x7FU; + + if (udev->dev.cur_status != USBD_CONFIGURED) { + usbd_addr_set (udev, udev->dev.dev_addr); + + if (udev->dev.dev_addr) { + udev->dev.cur_status = USBD_ADDRESSED; + } else { + udev->dev.cur_status = USBD_DEFAULT; + } + + return REQ_SUPP; + } + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Get_Descriptor request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_getdescriptor (usb_core_driver *udev, usb_req *req) +{ + uint8_t desc_type = 0; + uint8_t desc_index = 0; + + usb_transc *transc = &udev->dev.transc_in[0]; + + /* get device standard descriptor */ + switch (req->bmRequestType & USB_RECPTYPE_MASK) { + case USB_RECPTYPE_DEV: + desc_type = BYTE_HIGH(req->wValue); + desc_index = BYTE_LOW(req->wValue); + + switch (desc_type) { + case USB_DESCTYPE_DEV: + transc->xfer_buf = std_desc_get[desc_type - 1U](udev, desc_index, (uint16_t *)&(transc->remain_len)); + + if (64U == req->wLength) { + transc->remain_len = 8U; + } + break; + + case USB_DESCTYPE_CONFIG: + transc->xfer_buf = std_desc_get[desc_type - 1U](udev, desc_index, (uint16_t *)&(transc->remain_len)); + break; + + case USB_DESCTYPE_STR: + if (desc_index < STR_IDX_MAX) { + transc->xfer_buf = std_desc_get[desc_type - 1U](udev, desc_index, (uint16_t *)&(transc->remain_len)); + } + break; + + case USB_DESCTYPE_ITF: + case USB_DESCTYPE_EP: + case USB_DESCTYPE_DEV_QUALIFIER: + case USB_DESCTYPE_OTHER_SPD_CONFIG: + case USB_DESCTYPE_ITF_POWER: + break; + + case USB_DESCTYPE_BOS: + transc->xfer_buf = _usb_bos_desc_get(udev, desc_index, (uint16_t *)&(transc->remain_len)); + break; + + default: + break; + } + break; + + case USB_RECPTYPE_ITF: + /* get device class special descriptor */ + return (usb_reqsta)(udev->dev.class_core->req_proc(udev, req)); + + case USB_RECPTYPE_EP: + break; + + default: + break; + } + + if ((0U != transc->remain_len) && (0U != req->wLength)) { + if (transc->remain_len < req->wLength) { + if ((transc->remain_len >= transc->max_len) && (0U == (transc->remain_len % transc->max_len))) { + udev->dev.control.ctl_zlp = 1; + } + } else { + transc->remain_len = req->wLength; + } + + return REQ_SUPP; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Set_Descriptor request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setdescriptor (usb_core_driver *udev, usb_req *req) +{ + /* no handle... */ + return REQ_SUPP; +} + +/*! + \brief handle USB Get_Configuration request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_getconfiguration (usb_core_driver *udev, usb_req *req) +{ + usb_transc *transc = &udev->dev.transc_in[0]; + + switch (udev->dev.cur_status) { + case USBD_ADDRESSED: + if (USB_DEFAULT_CONFIG == udev->dev.config) { + transc->xfer_buf = &(udev->dev.config); + transc->remain_len = 1U; + + return REQ_SUPP; + } + break; + + case USBD_CONFIGURED: + if (udev->dev.config != USB_DEFAULT_CONFIG) { + transc->xfer_buf = &(udev->dev.config); + transc->remain_len = 1U; + + return REQ_SUPP; + } + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Set_Configuration request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setconfiguration (usb_core_driver *udev, usb_req *req) +{ + static uint8_t config; + + config = (uint8_t)(req->wValue); + + if (config <= USBD_CFG_MAX_NUM) { + switch (udev->dev.cur_status) { + case USBD_ADDRESSED: + if (config){ + udev->dev.class_core->init(udev, config); + + udev->dev.config = config; + udev->dev.cur_status = USBD_CONFIGURED; + } + + return REQ_SUPP; + + case USBD_CONFIGURED: + if (USB_DEFAULT_CONFIG == config) { + udev->dev.class_core->deinit(udev, config); + + udev->dev.config = config; + udev->dev.cur_status = USBD_ADDRESSED; + } else if (config != udev->dev.config) { + /* clear old configuration */ + udev->dev.class_core->deinit(udev, config); + + /* set new configuration */ + udev->dev.config = config; + udev->dev.class_core->init(udev, config); + } + + return REQ_SUPP; + + case USBD_DEFAULT: + break; + + default: + break; + } + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Get_Interface request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_getinterface (usb_core_driver *udev, usb_req *req) +{ + switch (udev->dev.cur_status) { + case USBD_DEFAULT: + break; + + case USBD_ADDRESSED: + break; + + case USBD_CONFIGURED: + if (BYTE_LOW(req->wIndex) <= USBD_ITF_MAX_NUM) { + usb_transc *transc = &udev->dev.transc_in[0]; + + transc->xfer_buf = &(udev->dev.class_core->alter_set); + transc->remain_len = 1U; + + return REQ_SUPP; + } + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB Set_Interface request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_setinterface (usb_core_driver *udev, usb_req *req) +{ + switch (udev->dev.cur_status) { + case USBD_DEFAULT: + break; + + case USBD_ADDRESSED: + break; + + case USBD_CONFIGURED: + if (BYTE_LOW(req->wIndex) <= USBD_ITF_MAX_NUM) { + udev->dev.class_core->alter_set = req->wValue; + + return REQ_SUPP; + } + break; + + default: + break; + } + + return REQ_NOTSUPP; +} + +/*! + \brief handle USB SynchFrame request + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval USB device request status +*/ +static usb_reqsta _usb_std_synchframe (usb_core_driver *udev, usb_req *req) +{ + /* no handle... */ + return REQ_SUPP; +} + +/*! + \brief handle USB enumeration error + \param[in] udev: pointer to USB device instance + \param[in] req: pointer to USB device request + \param[out] none + \retval none +*/ +void usbd_enum_error (usb_core_driver *udev, usb_req *req) +{ + usbd_ep_stall (udev, 0x80); + usbd_ep_stall (udev, 0x00); + + usb_ctlep_startout(udev); +} + +/*! + \brief convert hex 32bits value into unicode char + \param[in] value: hex 32bits value + \param[in] pbuf: buffer pointer to store unicode char + \param[in] len: value length + \param[out] none + \retval none +*/ +void int_to_unicode (uint32_t value, uint8_t *pbuf, uint8_t len) +{ + uint8_t index = 0; + + for (index = 0; index < len; index++) { + if ((value >> 28) < 0x0A) { + pbuf[2 * index] = (value >> 28) + '0'; + } else { + pbuf[2 * index] = (value >> 28) + 'A' - 10; + } + + value = value << 4; + + pbuf[2 * index + 1] = 0; + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c new file mode 100644 index 0000000..764b25b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbd_transc.c @@ -0,0 +1,254 @@ +/*! + \file usbd_transc.c + \brief USB transaction core functions + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "../Include/usbd_enum.h" +#include "../Include/usbd_transc.h" + +/*! + \brief USB send data in the control transaction + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation cur_status +*/ +usbd_status usbd_ctl_send (usb_core_driver *udev) +{ + usb_transc *transc = &udev->dev.transc_in[0]; + + usbd_ep_send(udev, 0U, transc->xfer_buf, transc->remain_len); + + if (transc->remain_len > transc->max_len) { + udev->dev.control.ctl_state = USB_CTL_DATA_IN; + } else { + udev->dev.control.ctl_state = USB_CTL_LAST_DATA_IN; + } + + return USBD_OK; +} + +/*! + \brief USB receive data in control transaction + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation cur_status +*/ +usbd_status usbd_ctl_recev (usb_core_driver *udev) +{ + usb_transc *transc = &udev->dev.transc_out[0]; + + usbd_ep_recev (udev, 0U, transc->xfer_buf, transc->remain_len); + + if (transc->remain_len > transc->max_len) { + udev->dev.control.ctl_state = USB_CTL_DATA_OUT; + } else { + udev->dev.control.ctl_state = USB_CTL_LAST_DATA_OUT; + } + + return USBD_OK; +} + +/*! + \brief USB send control transaction status + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation cur_status +*/ +usbd_status usbd_ctl_status_send (usb_core_driver *udev) +{ + udev->dev.control.ctl_state = USB_CTL_STATUS_IN; + + usbd_ep_send (udev, 0U, NULL, 0U); + + usb_ctlep_startout(udev); + + return USBD_OK; +} + +/*! + \brief USB control receive status + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation cur_status +*/ +usbd_status usbd_ctl_status_recev (usb_core_driver *udev) +{ + udev->dev.control.ctl_state = USB_CTL_STATUS_OUT; + + usbd_ep_recev (udev, 0, NULL, 0); + + usb_ctlep_startout(udev); + + return USBD_OK; +} + +/*! + \brief USB setup stage processing + \param[in] udev: pointer to USB device instance + \param[out] none + \retval USB device operation cur_status +*/ +uint8_t usbd_setup_transc (usb_core_driver *udev) +{ + usb_reqsta reqstat = REQ_NOTSUPP; + + usb_req req = udev->dev.control.req; + + switch (req.bmRequestType & USB_REQTYPE_MASK) { + /* standard device request */ + case USB_REQTYPE_STRD: + reqstat = usbd_standard_request (udev, &req); + break; + + /* device class request */ + case USB_REQTYPE_CLASS: + reqstat = usbd_class_request (udev, &req); + break; + + /* vendor defined request */ + case USB_REQTYPE_VENDOR: + reqstat = usbd_vendor_request (udev, &req); + break; + + default: + break; + } + + if (REQ_SUPP == reqstat) { + if (req.wLength == 0) { + usbd_ctl_status_send (udev); + } else { + if (req.bmRequestType & 0x80) { + usbd_ctl_send (udev); + } else { + usbd_ctl_recev (udev); + } + } + } else { + usbd_enum_error (udev, &req); + } + + return USBD_OK; +} + +/*! + \brief data out stage processing + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier(0..7) + \param[out] none + \retval USB device operation cur_status +*/ +uint8_t usbd_out_transc (usb_core_driver *udev, uint8_t ep_num) +{ + if (ep_num == 0) { + usb_transc *transc = &udev->dev.transc_out[0]; + + switch (udev->dev.control.ctl_state) { + case USB_CTL_DATA_OUT: + /* update transfer length */ + transc->remain_len -= transc->max_len; + + usbd_ctl_recev (udev); + break; + + case USB_CTL_LAST_DATA_OUT: + if (udev->dev.cur_status == USBD_CONFIGURED) { + if (udev->dev.class_core->data_out != NULL) { + udev->dev.class_core->data_out (udev, 0U); + } + } + + transc->remain_len = 0U; + + usbd_ctl_status_send (udev); + break; + + default: + break; + } + } else if ((udev->dev.class_core->data_out != NULL) && (udev->dev.cur_status == USBD_CONFIGURED)) { + udev->dev.class_core->data_out (udev, ep_num); + } + + return USBD_OK; +} + +/*! + \brief data in stage processing + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint identifier(0..7) + \param[out] none + \retval USB device operation cur_status +*/ +uint8_t usbd_in_transc (usb_core_driver *udev, uint8_t ep_num) +{ + if (0U == ep_num) { + usb_transc *transc = &udev->dev.transc_in[0]; + + switch (udev->dev.control.ctl_state) { + case USB_CTL_DATA_IN: + /* update transfer length */ + transc->remain_len -= transc->max_len; + + usbd_ctl_send (udev); + break; + + case USB_CTL_LAST_DATA_IN: + /* last packet is MPS multiple, so send ZLP packet */ + if (udev->dev.control.ctl_zlp) { + usbd_ep_send (udev, 0U, NULL, 0U); + + udev->dev.control.ctl_zlp = 0U; + } else { + if (udev->dev.cur_status == USBD_CONFIGURED) { + if (udev->dev.class_core->data_in != NULL) { + udev->dev.class_core->data_in (udev, 0U); + } + } + + transc->remain_len = 0U; + + usbd_ctl_status_recev (udev); + } + break; + + default: + break; + } + } else { + if ((udev->dev.cur_status == USBD_CONFIGURED) && (udev->dev.class_core->data_in != NULL)) { + udev->dev.class_core->data_in (udev, ep_num); + } + } + + return USBD_OK; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_core.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_core.c new file mode 100644 index 0000000..a17cfb0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_core.c @@ -0,0 +1,441 @@ +/*! + \file usbh_core.c + \brief USB host core state machine driver + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "../Include/drv_usb_hw.h" +#include "../Include/usbh_pipe.h" +#include "../Include/usbh_enum.h" +#include "../Include/usbh_core.h" +#include "../Include/drv_usbh_int.h" + +uint8_t usbh_sof (usb_core_driver *pudev); + +usbh_int_cb usbh_int_op = +{ + usbh_sof +}; + +usbh_int_cb *usbh_int_fop = &usbh_int_op; + +static usbh_status usbh_enum_task (usb_core_driver *pudev, usbh_host *puhost); + +/*! + \brief USB SOF callback function from the interrupt + \param[in] pudev: pointer to usb core instance + \param[out] none + \retval operation status +*/ +uint8_t usbh_sof (usb_core_driver *pudev) +{ + /* this callback could be used to implement a scheduler process */ + return 0U; +} + +/*! + \brief USB host stack initializations + \param[in] pudev: pointer to usb core instance + \param[in] core: USBFS core or USBHS core + \param[in] puhost: pointer to USB host + \param[out] none + \retval operation status +*/ +void usbh_init (usb_core_driver *pudev, usb_core_enum core, usbh_host *puhost) +{ + uint8_t i = 0U; + + /* host de-initializations */ + usbh_deinit(pudev, puhost); + + pudev->host.connect_status = 0U; + + for (i = 0U; i < USBFS_MAX_TX_FIFOS; i++) { + pudev->host.pipe[i].err_count = 0U; + pudev->host.pipe[i].pp_status = PIPE_IDLE; + pudev->host.backup_xfercount[i] = 0U; + } + + pudev->host.pipe[0].ep.mps = 8U; + + usb_basic_init (&pudev->bp, &pudev->regs, core); + +#ifndef DUAL_ROLE_MODE_ENABLED + + usb_core_init (pudev->bp, &pudev->regs); + + usb_host_init (pudev); + +#endif /* DUAL_ROLE_MODE_ENABLED */ + + /* upon init call usr call back */ + puhost->usr_cb->dev_init(); +} + +/*! + \brief de-initialize USB host + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to USB host + \param[out] none + \retval operation status +*/ +usbh_status usbh_deinit(usb_core_driver *pudev, usbh_host *puhost) +{ + /* software init */ + puhost->cur_state = HOST_DEFAULT; + puhost->backup_state = HOST_DEFAULT; + puhost->enum_state = ENUM_DEFAULT; + + puhost->control.ctl_state = CTL_IDLE; + puhost->control.max_len = USB_FS_EP0_MAX_LEN; + + puhost->dev_prop.addr = USBH_DEV_ADDR_DEFAULT; + puhost->dev_prop.speed = PORT_SPEED_FULL; + + usbh_pipe_free(pudev, puhost->control.pipe_in_num); + usbh_pipe_free(pudev, puhost->control.pipe_out_num); + + return USBH_OK; +} + +/*! + \brief USB host core main state machine process + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to USB host + \param[out] none + \retval none +*/ +void usbh_core_task (usb_core_driver *pudev, usbh_host *puhost) +{ + volatile usbh_status status = USBH_FAIL; + + /* check for host port events */ + if (((0U == pudev->host.connect_status) || (0U == pudev->host.port_enabled)) && (HOST_DEFAULT != puhost->cur_state)) { + if (puhost->cur_state != HOST_DEV_DETACHED) { + puhost->cur_state = HOST_DEV_DETACHED; + } + } + + switch (puhost->cur_state) { + case HOST_DEFAULT: + if (pudev->host.connect_status) { + puhost->cur_state = HOST_DETECT_DEV_SPEED; + + usb_mdelay (100U); + // usb_mdelay (2U); + usb_port_reset (pudev); + + puhost->usr_cb->dev_reset(); + } + break; + + case HOST_DETECT_DEV_SPEED: + if (pudev->host.port_enabled) { + puhost->cur_state = HOST_DEV_ATTACHED; + puhost->dev_prop.speed = usb_curspeed_get (pudev); + puhost->usr_cb->dev_speed_detected(puhost->dev_prop.speed); + + usb_mdelay (50U); + } + break; + + case HOST_DEV_ATTACHED: + puhost->usr_cb->dev_attach(); + puhost->control.pipe_out_num = usbh_pipe_allocate(pudev, 0x00U); + puhost->control.pipe_in_num = usbh_pipe_allocate(pudev, 0x80U); + + /* reset USB device */ + usb_port_reset (pudev); + + /* open IN control pipe */ + usbh_pipe_create (pudev, + &puhost->dev_prop, + puhost->control.pipe_in_num, + USB_EPTYPE_CTRL, + puhost->control.max_len); + + /* open OUT control pipe */ + usbh_pipe_create (pudev, + &puhost->dev_prop, + puhost->control.pipe_out_num, + USB_EPTYPE_CTRL, + puhost->control.max_len); + + puhost->cur_state = HOST_ENUM; + break; + + case HOST_ENUM: + + /* check for enumeration status */ + if (USBH_OK == usbh_enum_task (pudev, puhost)) { + /* the function shall return USBH_OK when full enumeration is complete */ + + /* user callback for end of device basic enumeration */ + puhost->usr_cb->dev_enumerated(); + puhost->cur_state = HOST_USER_INPUT; + } + break; + + case HOST_USER_INPUT: + /* the function should return user response true to move to class state */ + if (USBH_USER_RESP_OK == puhost->usr_cb->dev_user_input()) { + if ((USBH_OK == puhost->class_cb->class_init(pudev, puhost))) { + puhost->cur_state = HOST_CLASS_ENUM; + } + } + break; + + case HOST_CLASS_ENUM: + /* process class standard contol requests state machine */ + status = puhost->class_cb->class_requests(pudev, puhost); + + if (USBH_OK == status) { + puhost->cur_state = HOST_CLASS_HANDLER; + } else { + usbh_error_handler (puhost, status); + } + break; + + case HOST_CLASS_HANDLER: + /* process class state machine */ + status = puhost->class_cb->class_machine(pudev, puhost); + + usbh_error_handler (puhost, status); + break; + + case HOST_SUSPENDED: + break; + + case HOST_ERROR: + /* re-initilaize host for new enumeration */ + usbh_deinit (pudev, puhost); + puhost->usr_cb->dev_deinit(); + puhost->class_cb->class_deinit(pudev, puhost); + break; + + case HOST_DEV_DETACHED: + /* manage user disconnect operations*/ + puhost->usr_cb->dev_detach(); + + /* re-initilaize host for new enumeration */ + usbh_deinit(pudev, puhost); + puhost->usr_cb->dev_deinit(); + puhost->class_cb->class_deinit(pudev, puhost); + usbh_pipe_delete(pudev); + puhost->cur_state = HOST_DEFAULT; + break; + + default: + break; + } +} + +/*! + \brief handle the error on USB host side + \param[in] puhost: pointer to USB host + \param[in] err_type: type of error or busy/OK state + \param[out] none + \retval none +*/ +void usbh_error_handler (usbh_host *puhost, usbh_status err_type) +{ + /* error unrecovered or not supported device speed */ + if ((USBH_SPEED_UNKNOWN_ERROR == err_type) || (USBH_UNRECOVERED_ERROR == err_type)) { + puhost->usr_cb->dev_error(); + + puhost->cur_state = HOST_ERROR; + } else if (USBH_APPLY_DEINIT == err_type) { + puhost->cur_state = HOST_ERROR; + + /* user callback for initalization */ + puhost->usr_cb->dev_init(); + } +} + +/*! + \brief handle the USB enumeration task + \param[in] pudev: pointer to selected USB device + \param[in] puhost: pointer to host + \param[out] none + \retval none +*/ +static usbh_status usbh_enum_task (usb_core_driver *pudev, usbh_host *puhost) +{ + uint8_t str_buf[64]; + + usbh_status status = USBH_BUSY; + + static uint8_t index_mfc_str = 0U, index_prod_str = 0U, index_serial_str = 0U; + + switch (puhost->enum_state) { + case ENUM_DEFAULT: + /* get device descriptor for only 1st 8 bytes : to get ep0 maxpacketsize */ + if (USBH_OK == usbh_devdesc_get (pudev, puhost, 8U)) { + + puhost->control.max_len = puhost->dev_prop.dev_desc.bMaxPacketSize0; + + /* issue reset */ + usb_port_reset (pudev); + + /* modify control channels configuration for maximum packet size */ + usbh_pipe_update (pudev, + puhost->control.pipe_out_num, + 0U, 0U, + puhost->control.max_len); + + usbh_pipe_update (pudev, + puhost->control.pipe_in_num, + 0U, 0U, + puhost->control.max_len); + + puhost->enum_state = ENUM_GET_DEV_DESC; + + } + break; + + case ENUM_GET_DEV_DESC: + /* get full device descriptor */ + if (USBH_OK == usbh_devdesc_get (pudev, puhost, USB_DEV_DESC_LEN)) { + puhost->usr_cb->dev_devdesc_assigned(&puhost->dev_prop.dev_desc); + + index_mfc_str = puhost->dev_prop.dev_desc.iManufacturer; + index_prod_str = puhost->dev_prop.dev_desc.iProduct; + index_serial_str = puhost->dev_prop.dev_desc.iSerialNumber; + + puhost->enum_state = ENUM_SET_ADDR; + } + break; + + case ENUM_SET_ADDR: + /* set address */ + if (USBH_OK == usbh_setaddress (pudev, puhost, USBH_DEV_ADDR)) { + usb_mdelay (2); + + puhost->dev_prop.addr = USBH_DEV_ADDR; + + /* user callback for device address assigned */ + puhost->usr_cb->dev_address_set(); + + /* modify control channels to update device address */ + usbh_pipe_update (pudev, + puhost->control.pipe_in_num, + puhost->dev_prop.addr, + 0U, 0U); + + usbh_pipe_update (pudev, + puhost->control.pipe_out_num, + puhost->dev_prop.addr, + 0U, 0U); + + puhost->enum_state = ENUM_GET_CFG_DESC; + } + break; + + case ENUM_GET_CFG_DESC: + /* get standard configuration descriptor */ + if (USBH_OK == usbh_cfgdesc_get (pudev, puhost, USB_CFG_DESC_LEN)) { + puhost->enum_state = ENUM_GET_CFG_DESC_SET; + } + break; + + case ENUM_GET_CFG_DESC_SET: + /* get full config descriptor (config, interface, endpoints) */ + if (USBH_OK == usbh_cfgdesc_get (pudev, puhost, puhost->dev_prop.cfg_desc.wTotalLength)) { + /* user callback for configuration descriptors available */ + puhost->usr_cb->dev_cfgdesc_assigned (&puhost->dev_prop.cfg_desc, + puhost->dev_prop.itf_desc, + puhost->dev_prop.ep_desc[0]); + + puhost->enum_state = ENUM_GET_STR_DESC; + } + break; + + case ENUM_GET_STR_DESC: + if (index_mfc_str) { + if (USBH_OK == usbh_strdesc_get (pudev, + puhost, + puhost->dev_prop.dev_desc.iManufacturer, + str_buf, + 0xFFU)) { + /* user callback for manufacturing string */ + puhost->usr_cb->dev_mfc_str(str_buf); + + index_mfc_str = 0U; + } + } else { + if (index_prod_str) { + /* check that product string is available */ + if (USBH_OK == usbh_strdesc_get (pudev, + puhost, + puhost->dev_prop.dev_desc.iProduct, + str_buf, + 0xFFU)) { + puhost->usr_cb->dev_prod_str(str_buf); + + index_prod_str = 0U; + } + } else { + if (index_serial_str) { + if (USBH_OK == usbh_strdesc_get (pudev, + puhost, + puhost->dev_prop.dev_desc.iSerialNumber, + str_buf, + 0xFFU)) { + puhost->usr_cb->dev_seral_str(str_buf); + puhost->enum_state = ENUM_SET_CONFIGURATION; + + index_serial_str = 0U; + } + } else { + puhost->enum_state = ENUM_SET_CONFIGURATION; + } + } + } + break; + + case ENUM_SET_CONFIGURATION: + if (USBH_OK == usbh_setcfg (pudev, + puhost, + puhost->dev_prop.cfg_desc.bConfigurationValue)) { + puhost->enum_state = ENUM_DEV_CONFIGURED; + } + break; + + case ENUM_DEV_CONFIGURED: + status = USBH_OK; + break; + + default: + break; + } + + return status; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_enum.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_enum.c new file mode 100644 index 0000000..fe41560 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_enum.c @@ -0,0 +1,549 @@ +/*! + \file usbh_enum.c + \brief USB host mode enumberation driver + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "../Include/usbh_transc.h" +#include "../Include/usbh_enum.h" + +static void usbh_devdesc_parse (usb_desc_dev *cfg_desc, uint8_t *buf, uint16_t len); +static void usbh_cfgset_parse (usb_dev_prop *udev, uint8_t *buf); +static void usbh_cfgdesc_parse (usb_desc_config *cfg_desc, uint8_t *buf); +static void usbh_itfdesc_parse (usb_desc_itf *itf_desc, uint8_t *buf); +static void usbh_epdesc_parse (usb_desc_ep *ep_desc, uint8_t *buf); +static void usbh_strdesc_parse (uint8_t *psrc, uint8_t *pdest, uint16_t len); + + +/*! + \brief configure USB control status parameters + \param[in] puhost: pointer to usb host + \param[in] buf: control transfer data buffer pointer + \param[in] len: length of the data buffer + \param[out] none + \retval none +*/ +void usbh_ctlstate_config (usbh_host *puhost, uint8_t *buf, uint16_t len) +{ + /* prepare the transactions */ + puhost->control.buf = buf; + puhost->control.ctl_len = len; + + puhost->control.ctl_state = CTL_SETUP; +} + +/*! + \brief get device descriptor from the USB device + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] len: length of the descriptor + \param[out] none + \retval operation status +*/ +usbh_status usbh_devdesc_get (usb_core_driver *pudev, usbh_host *puhost, uint8_t len) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &puhost->control; + + if (CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, + .bRequest = USB_GET_DESCRIPTOR, + .wValue = USBH_DESC(USB_DESCTYPE_DEV), + .wIndex = 0U, + .wLength = len + }; + + usbh_ctlstate_config (puhost, pudev->host.rx_buf, len); + } + + status = usbh_ctl_handler (pudev, puhost); + + if (USBH_OK == status) { + /* commands successfully sent and response received */ + usbh_devdesc_parse (&puhost->dev_prop.dev_desc, pudev->host.rx_buf, len); + } + + return status; +} + +/*! + \brief get configuration descriptor from the USB device + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] len: length of the descriptor + \param[out] none + \retval operation status +*/ +usbh_status usbh_cfgdesc_get (usb_core_driver *pudev, usbh_host *puhost, uint16_t len) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &puhost->control; + + if (CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, + .bRequest = USB_GET_DESCRIPTOR, + .wValue = USBH_DESC(USB_DESCTYPE_CONFIG), + .wIndex = 0U, + .wLength = len + }; + + usbh_ctlstate_config (puhost, pudev->host.rx_buf, len); + } + + status = usbh_ctl_handler (pudev, puhost); + + if (USBH_OK == status) { + if (len <= USB_CFG_DESC_LEN) { + usbh_cfgdesc_parse (&puhost->dev_prop.cfg_desc, pudev->host.rx_buf); + } else { + usbh_cfgset_parse (&puhost->dev_prop, pudev->host.rx_buf); + } + } + + return status; +} + +/*! + \brief get string descriptor from the USB device + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] str_index: index for the string descriptor + \param[in] buf: buffer pointer to the string descriptor + \param[in] len: length of the descriptor + \param[out] none + \retval operation status +*/ +usbh_status usbh_strdesc_get (usb_core_driver *pudev, + usbh_host *puhost, + uint8_t str_index, + uint8_t *buf, + uint16_t len) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &puhost->control; + + if (CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_IN | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, + .bRequest = USB_GET_DESCRIPTOR, + .wValue = USBH_DESC(USB_DESCTYPE_STR) | str_index, + .wIndex = 0x0409U, + .wLength = len + }; + + usbh_ctlstate_config (puhost, pudev->host.rx_buf, len); + } + + status = usbh_ctl_handler (pudev, puhost); + + if (USBH_OK == status) { + /* commands successfully sent and response received */ + usbh_strdesc_parse (pudev->host.rx_buf, buf, len); + } + + return status; +} + +/*! + \brief set the address to the connected device + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] dev_addr: device address to assign + \param[out] none + \retval operation status +*/ +usbh_status usbh_setaddress (usb_core_driver *pudev, usbh_host *puhost, uint8_t dev_addr) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &puhost->control; + + if (CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, + .bRequest = USB_SET_ADDRESS, + .wValue = (uint16_t)dev_addr, + .wIndex = 0U, + .wLength = 0U + }; + + usbh_ctlstate_config (puhost, NULL, 0U); + } + + status = usbh_ctl_handler (pudev, puhost); + + return status; +} + +/*! + \brief set the configuration value to the connected device + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] config_index: configuration value + \param[out] none + \retval operation status +*/ +usbh_status usbh_setcfg (usb_core_driver *pudev, usbh_host *puhost, uint16_t config_index) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &puhost->control; + + if (CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_DEV | USB_REQTYPE_STRD, + .bRequest = USB_SET_CONFIGURATION, + .wValue = config_index, + .wIndex = 0U, + .wLength = 0U + }; + + usbh_ctlstate_config (puhost, NULL, 0U); + } + + status = usbh_ctl_handler (pudev, puhost); + + return status; +} + +/*! + \brief set the interface value to the connected device + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] ep_num: endpoint number + \param[in] alter_setting: altnated setting value + \param[out] none + \retval operation status +*/ +usbh_status usbh_setinterface (usb_core_driver *pudev, + usbh_host *puhost, + uint8_t ep_num, + uint8_t set) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &puhost->control; + + if (CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_ITF | USB_REQTYPE_STRD, + .bRequest = USB_SET_INTERFACE, + .wValue = set, + .wIndex = ep_num, + .wLength = 0U + }; + + usbh_ctlstate_config (puhost, NULL, 0U); + } + + status = usbh_ctl_handler (pudev, puhost); + + return status; +} + +/*! + \brief clear or disable a specific feature + \param[in] pudev: pointer to usb core instance + \param[in] puhost: pointer to usb host + \param[in] ep_addr: endpoint address + \param[in] pp_num: pipe number + \param[out] none + \retval operation status +*/ +usbh_status usbh_clrfeature (usb_core_driver *pudev, + usbh_host *puhost, + uint8_t ep_addr, + uint8_t pp_num) +{ + usbh_status status = USBH_BUSY; + + usbh_control *usb_ctl = &puhost->control; + + if (CTL_IDLE == usb_ctl->ctl_state) { + usb_ctl->setup.req = (usb_req) { + .bmRequestType = USB_TRX_OUT | USB_RECPTYPE_EP | USB_REQTYPE_STRD, + .bRequest = USB_CLEAR_FEATURE, + .wValue = FEATURE_SELECTOR_EP, + .wIndex = ep_addr, + .wLength = 0 + }; + + if (EP_DIR(ep_addr)) { + pudev->host.pipe[pp_num].data_toggle_in = 0U; + } else { + pudev->host.pipe[pp_num].data_toggle_out = 0U; + } + + usbh_ctlstate_config (puhost, NULL, 0U); + } + + status = usbh_ctl_handler (pudev, puhost); + + return status; +} + +/*! + \brief parse the device descriptor + \param[in] dev_desc: pointer to usb device descriptor buffer + \param[in] buf: pointer to the source descriptor buffer + \param[in] len: length of the descriptor + \param[out] none + \retval operation status +*/ +static void usbh_devdesc_parse (usb_desc_dev *dev_desc, uint8_t *buf, uint16_t len) +{ + *dev_desc = (usb_desc_dev) { + .header = { + .bLength = *(uint8_t *)(buf + 0U), + .bDescriptorType = *(uint8_t *)(buf + 1U) + }, + + .bcdUSB = BYTE_SWAP(buf + 2U), + .bDeviceClass = *(uint8_t *)(buf + 4U), + .bDeviceSubClass = *(uint8_t *)(buf + 5U), + .bDeviceProtocol = *(uint8_t *)(buf + 6U), + .bMaxPacketSize0 = *(uint8_t *)(buf + 7U) + }; + + if (len > 8U) { + /* for 1st time after device connection, host may issue only 8 bytes for device descriptor length */ + dev_desc->idVendor = BYTE_SWAP(buf + 8U); + dev_desc->idProduct = BYTE_SWAP(buf + 10U); + dev_desc->bcdDevice = BYTE_SWAP(buf + 12U); + dev_desc->iManufacturer = *(uint8_t *)(buf + 14U); + dev_desc->iProduct = *(uint8_t *)(buf + 15U); + dev_desc->iSerialNumber = *(uint8_t *)(buf + 16U); + dev_desc->bNumberConfigurations = *(uint8_t *)(buf + 17U); + } +} + +/*! + \brief parse the configuration descriptor + \param[in] cfg_desc: pointer to usb configuration descriptor buffer + \param[in] buf: pointer to the source descriptor buffer + \param[out] none + \retval operation status +*/ +static void usbh_cfgdesc_parse (usb_desc_config *cfg_desc, uint8_t *buf) +{ + /* parse configuration descriptor */ + *cfg_desc = (usb_desc_config) { + .header = { + .bLength = *(uint8_t *)(buf + 0U), + .bDescriptorType = *(uint8_t *)(buf + 1U), + }, + + .wTotalLength = BYTE_SWAP(buf + 2U), + .bNumInterfaces = *(uint8_t *)(buf + 4U), + .bConfigurationValue = *(uint8_t *)(buf + 5U), + .iConfiguration = *(uint8_t *)(buf + 6U), + .bmAttributes = *(uint8_t *)(buf + 7U), + .bMaxPower = *(uint8_t *)(buf + 8U) + }; +} + +/*! + \brief parse the configuration descriptor set + \param[in] udev: pointer to USB core instance + \param[in] buf: pointer to the source descriptor buffer + \param[out] none + \retval operation status +*/ +static void usbh_cfgset_parse (usb_dev_prop *udev, uint8_t *buf) +{ + usb_desc_ep *ep = NULL; + usb_desc_itf *itf = NULL, itf_value; + + usb_desc_header *pdesc = (usb_desc_header *)buf; + + int8_t itf_index = 0U, ep_index = 0U; + uint16_t ptr; + + uint8_t prev_itf = 0U; + uint16_t prev_ep_len = 0U; + + /* parse configuration descriptor */ + usbh_cfgdesc_parse (&udev->cfg_desc, buf); + + ptr = USB_CFG_DESC_LEN; + + if (udev->cfg_desc.bNumInterfaces > USBH_MAX_INTERFACES_NUM) { + return; + } + + while (ptr < udev->cfg_desc.wTotalLength) { + pdesc = usbh_nextdesc_get ((uint8_t *)pdesc, &ptr); + + if (pdesc->bDescriptorType == USB_DESCTYPE_ITF) { + itf_index = *(((uint8_t *)pdesc) + 2U); + itf = &udev->itf_desc[itf_index]; + + if ((*((uint8_t *)pdesc + 3U)) < 3U) { + usbh_itfdesc_parse (&itf_value, (uint8_t *)pdesc); + + /* parse endpoint descriptors relative to the current interface */ + if (itf_value.bNumEndpoints > USBH_MAX_EP_NUM) { + return; + } + + for (ep_index = 0; ep_index < itf_value.bNumEndpoints; ) { + pdesc = usbh_nextdesc_get ((void*)pdesc, &ptr); + + if (pdesc->bDescriptorType == USB_DESCTYPE_EP) { + ep = &udev->ep_desc[itf_index][ep_index]; + + if (prev_itf != itf_index) { + prev_itf = itf_index; + usbh_itfdesc_parse (itf, (uint8_t *)&itf_value); + } else { + if (prev_ep_len > BYTE_SWAP((uint8_t *)pdesc + 4U)) { + break; + } else { + usbh_itfdesc_parse (itf, (uint8_t *)&itf_value); + } + } + + usbh_epdesc_parse (ep, (uint8_t *)pdesc); + prev_ep_len = BYTE_SWAP((uint8_t *)pdesc + 4U); + ep_index++; + } + } + } + } + } +} + +/*! + \brief parse the interface descriptor + \param[in] itf_desc: pointer to usb interface descriptor buffer + \param[in] buf: pointer to the source descriptor buffer + \param[out] none + \retval operation status +*/ +static void usbh_itfdesc_parse (usb_desc_itf *itf_desc, uint8_t *buf) +{ + *itf_desc = (usb_desc_itf) { + .header = { + .bLength = *(uint8_t *)(buf + 0U), + .bDescriptorType = *(uint8_t *)(buf + 1U), + }, + + .bInterfaceNumber = *(uint8_t *)(buf + 2U), + .bAlternateSetting = *(uint8_t *)(buf + 3U), + .bNumEndpoints = *(uint8_t *)(buf + 4U), + .bInterfaceClass = *(uint8_t *)(buf + 5U), + .bInterfaceSubClass = *(uint8_t *)(buf + 6U), + .bInterfaceProtocol = *(uint8_t *)(buf + 7U), + .iInterface = *(uint8_t *)(buf + 8U) + }; +} + +/*! + \brief parse the endpoint descriptor + \param[in] ep_desc: pointer to usb endpoint descriptor buffer + \param[in] buf: pointer to the source descriptor buffer + \param[out] none + \retval operation status +*/ +static void usbh_epdesc_parse (usb_desc_ep *ep_desc, uint8_t *buf) +{ + *ep_desc = (usb_desc_ep) { + .header = { + .bLength = *(uint8_t *)(buf + 0U), + .bDescriptorType = *(uint8_t *)(buf + 1U) + }, + + .bEndpointAddress = *(uint8_t *)(buf + 2U), + .bmAttributes = *(uint8_t *)(buf + 3U), + .wMaxPacketSize = BYTE_SWAP(buf + 4U), + .bInterval = *(uint8_t *)(buf + 6U) + }; +} + +/*! + \brief parse the string descriptor + \param[in] psrc: source pointer containing the descriptor data + \param[in] pdest: destination address pointer + \param[in] len: length of the descriptor + \param[out] none + \retval operation status +*/ +static void usbh_strdesc_parse (uint8_t *psrc, uint8_t *pdest, uint16_t len) +{ + uint16_t str_len = 0U, index = 0U; + + /* the unicode string descriptor is not NULL-terminated. The string length is + * computed by substracting two from the value of the first byte of the descriptor. + */ + + /* check which is lower size, the size of string or the length of bytes read from the device */ + if (USB_DESCTYPE_STR == psrc[1]) { + /* make sure the descriptor is string type */ + + /* psrc[0] contains Size of Descriptor, subtract 2 to get the length of string */ + str_len = USB_MIN(psrc[0] - 2U, len); + + psrc += 2U; /* adjust the offset ignoring the string len and descriptor type */ + + for (index = 0U; index < str_len; index += 2U) { + /* copy only the string and ignore the unicode id, hence add the src */ + *pdest = psrc[index]; + + pdest++; + } + + *pdest = 0U; /* mark end of string */ + } +} + +/*! + \brief get the next descriptor header + \param[in] pbuf: pointer to buffer where the configuration descriptor set is available + \param[in] ptr: data popinter inside the configuration descriptor set + \param[out] none + \retval operation status +*/ +usb_desc_header *usbh_nextdesc_get (uint8_t *pbuf, uint16_t *ptr) +{ + usb_desc_header *pnext; + + *ptr += ((usb_desc_header *)pbuf)->bLength; + + pnext = (usb_desc_header *)((uint8_t *)pbuf + ((usb_desc_header *)pbuf)->bLength); + + return (pnext); +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_pipe.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_pipe.c new file mode 100644 index 0000000..5fb29f3 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_pipe.c @@ -0,0 +1,174 @@ +/*! + \file usbh_pipe.c + \brief USB host mode pipe operation driver + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "../Include/usbh_pipe.h" + +static uint16_t usbh_freepipe_get (usb_core_driver *pudev); + +/*! + \brief create a pipe + \param[in] pudev: pointer to usb core instance + \param[in] pp_num: pipe number + \param[in] udev: USB device + \param[in] ep_type: endpoint type + \param[in] ep_mpl: endpoint max packet length + \param[out] none + \retval operation status +*/ +uint8_t usbh_pipe_create (usb_core_driver *pudev, + usb_dev_prop *udev, + uint8_t pp_num, + uint8_t ep_type, + uint16_t ep_mpl) +{ + usb_pipe *pp = &pudev->host.pipe[pp_num]; + + pp->dev_addr = udev->addr; + pp->dev_speed = udev->speed; + pp->ep.type = ep_type; + pp->ep.mps = ep_mpl; + pp->ping = udev->speed == PORT_SPEED_HIGH; + + usb_pipe_init (pudev, pp_num); + + return HC_OK; +} + +/*! + \brief modify a pipe + \param[in] pudev: pointer to usb core instance + \param[in] pp_num: pipe number + \param[in] dev_addr: device address + \param[in] dev_speed: device speed + \param[in] ep_type: endpoint type + \param[in] ep_mpl: endpoint max packet length + \param[out] none + \retval operation status +*/ +uint8_t usbh_pipe_update (usb_core_driver *pudev, + uint8_t pp_num, + uint8_t dev_addr, + uint32_t dev_speed, + uint16_t ep_mpl) +{ + usb_pipe *pp = &pudev->host.pipe[pp_num]; + + if ((pp->dev_addr != dev_addr) && (dev_addr)) { + pp->dev_addr = dev_addr; + } + + if ((pp->dev_speed != dev_speed) && (dev_speed)) { + pp->dev_speed = dev_speed; + } + + if ((pp->ep.mps != ep_mpl) && (ep_mpl)) { + pp->ep.mps = ep_mpl; + } + + usb_pipe_init (pudev, pp_num); + + return HC_OK; +} + +/*! + \brief allocate a new pipe + \param[in] pudev: pointer to usb core instance + \param[in] ep_addr: endpoint address + \param[out] none + \retval operation status +*/ +uint8_t usbh_pipe_allocate (usb_core_driver *pudev, uint8_t ep_addr) +{ + uint16_t pp_num = usbh_freepipe_get (pudev); + + if (HC_ERROR != pp_num) { + pudev->host.pipe[pp_num].in_used = 1U; + pudev->host.pipe[pp_num].ep.dir = EP_DIR(ep_addr); + pudev->host.pipe[pp_num].ep.num = EP_ID(ep_addr); + } + + return pp_num; +} + +/*! + \brief free a pipe + \param[in] pudev: pointer to usb core instance + \param[in] pp_num: pipe number + \param[out] none + \retval operation status +*/ +uint8_t usbh_pipe_free (usb_core_driver *pudev, uint8_t pp_num) +{ + if (pp_num < HC_MAX) { + pudev->host.pipe[pp_num].in_used = 0U; + } + + return USBH_OK; +} + +/*! + \brief delete all USB host pipe + \param[in] pudev: pointer to usb core instance + \param[out] none + \retval operation status +*/ +uint8_t usbh_pipe_delete (usb_core_driver *pudev) +{ + uint8_t pp_num = 0U; + + for (pp_num = 2U; pp_num < HC_MAX; pp_num++) { + pudev->host.pipe[pp_num] = (usb_pipe) {0}; + } + + return USBH_OK; +} + +/*! + \brief get a free pipe number for allocation + \param[in] pudev: pointer to usb core instance + \param[out] none + \retval operation status +*/ +static uint16_t usbh_freepipe_get (usb_core_driver *pudev) +{ + uint8_t pp_num = 0U; + + for (pp_num = 0U; pp_num < HC_MAX; pp_num++) { + if (pudev->host.pipe[pp_num].in_used == 0U) { + return pp_num; + } + } + + return HC_ERROR; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_transc.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_transc.c new file mode 100644 index 0000000..433f18a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/GD32VF103_usbfs_driver/Source/usbh_transc.c @@ -0,0 +1,391 @@ +/*! + \file usbh_transc.c + \brief USB host mode transactions driver + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "../Include/drv_usb_hw.h" +#include "../Include/usbh_transc.h" + +/*! + \brief prepare a pipe and start a transfer + \param[in] pudev: pointer to usb core instance + \param[in] pp_num: pipe number + \param[out] none + \retval operation status +*/ +static uint32_t usbh_request_submit (usb_core_driver *pudev, uint8_t pp_num) +{ + pudev->host.pipe[pp_num].urb_state = URB_IDLE; + pudev->host.pipe[pp_num].xfer_count = 0U; + + return usb_pipe_xfer (pudev, pp_num); +} + +/*! + \brief send the setup packet to the USB device + \param[in] pudev: pointer to usb core instance + \param[in] buf: data buffer which will be sent to USB device + \param[in] pp_num: pipe number + \param[out] none + \retval operation status +*/ +usbh_status usbh_ctlsetup_send (usb_core_driver *pudev, uint8_t *buf, uint8_t pp_num) +{ + usb_pipe *pp = &pudev->host.pipe[pp_num]; + + pp->DPID = PIPE_DPID_SETUP; + pp->xfer_buf = buf; + pp->xfer_len = USB_SETUP_PACKET_LEN; + + return (usbh_status)usbh_request_submit (pudev, pp_num); +} + +/*! + \brief send a data packet to the USB device + \param[in] pudev: pointer to usb core instance + \param[in] buf: data buffer which will be sent to USB device + \param[in] pp_num: pipe number + \param[in] len: length of the data to be sent + \param[out] none + \retval operation status +*/ +usbh_status usbh_data_send (usb_core_driver *pudev, uint8_t *buf, uint8_t pp_num, uint16_t len) +{ + usb_pipe *pp = &pudev->host.pipe[pp_num]; + + pp->xfer_buf = buf; + pp->xfer_len = len; + + switch (pp->ep.type) { + case USB_EPTYPE_CTRL: + if (0U == len) { + pp->data_toggle_out = 1U; + } + + pp->DPID = PIPE_DPID[pp->data_toggle_out]; + break; + + case USB_EPTYPE_INTR: + pp->DPID = PIPE_DPID[pp->data_toggle_out]; + + pp->data_toggle_out ^= 1U; + break; + + case USB_EPTYPE_BULK: + pp->DPID = PIPE_DPID[pp->data_toggle_out]; + break; + + case USB_EPTYPE_ISOC: + pp->DPID = PIPE_DPID[0]; + break; + + default: + break; + } + + usbh_request_submit (pudev, pp_num); + + return USBH_OK; +} + +/*! + \brief receive a data packet from the USB device + \param[in] pudev: pointer to usb core instance + \param[in] buf: data buffer which will be received from USB device + \param[in] pp_num: pipe number + \param[in] len: length of the data to be received + \param[out] none + \retval operation status +*/ +usbh_status usbh_data_recev (usb_core_driver *pudev, uint8_t *buf, uint8_t pp_num, uint16_t len) +{ + usb_pipe *pp = &pudev->host.pipe[pp_num]; + + pp->xfer_buf = buf; + pp->xfer_len = len; + + switch (pp->ep.type) { + case USB_EPTYPE_CTRL: + pp->DPID = PIPE_DPID[1]; + break; + + case USB_EPTYPE_INTR: + pp->DPID = PIPE_DPID[pp->data_toggle_in]; + + /* Toggle DATA PID */ + pp->data_toggle_in ^= 1U; + break; + + case USB_EPTYPE_BULK: + pp->DPID = PIPE_DPID[pp->data_toggle_in]; + break; + + case USB_EPTYPE_ISOC: + pp->DPID = PIPE_DPID[0]; + break; + + default: + break; + } + + usbh_request_submit (pudev, pp_num); + + return USBH_OK; +} + +/*! + \brief wait for USB URB(USB request block) state + \param[in] pudev: pointer to USB core instance + \param[in] puhost: pointer to USB host + \param[in] pp_num: pipe number + \param[in] wait_time: wait time + \param[out] none + \retval USB URB state +*/ +static usb_urb_state usbh_urb_wait (usb_core_driver *pudev, usbh_host *puhost, uint8_t pp_num, uint32_t wait_time) +{ + usb_urb_state urb_status = URB_IDLE; + + while (URB_DONE != (urb_status = usbh_urbstate_get(pudev, pp_num))) { + if (URB_NOTREADY == urb_status) { + break; + } else if (URB_STALL == urb_status) { + puhost->control.ctl_state = CTL_SETUP; + break; + } else if (URB_ERROR == urb_status) { + puhost->control.ctl_state = CTL_ERROR; + break; + } else if ((wait_time > 0U) && \ + ((usb_curframe_get(pudev)- puhost->control.timer) > wait_time)) { + /* timeout for in transfer */ + puhost->control.ctl_state = CTL_ERROR; + break; + } else { + /* no operation, just wait */ + } + } + + return urb_status; +} + +/*! + \brief USB setup transaction + \param[in] pudev: pointer to USB core instance + \param[in] puhost: pointer to USB host + \param[out] none + \retval none +*/ +static void usbh_setup_transc (usb_core_driver *pudev, usbh_host *puhost) +{ + usb_urb_state urb_status = URB_IDLE; + + /* send a SETUP packet */ + usbh_ctlsetup_send (pudev, + puhost->control.setup.data, + puhost->control.pipe_out_num); + + urb_status = usbh_urb_wait (pudev, puhost, puhost->control.pipe_out_num, 0U); + + if (URB_DONE == urb_status) { + uint8_t dir = (puhost->control.setup.req.bmRequestType & USB_TRX_MASK); + + if (puhost->control.setup.req.wLength) { + if (USB_TRX_IN == dir) { + puhost->control.ctl_state = CTL_DATA_IN; + } else { + puhost->control.ctl_state = CTL_DATA_OUT; + } + } else { + if (USB_TRX_IN == dir) { + puhost->control.ctl_state = CTL_STATUS_OUT; + } else { + puhost->control.ctl_state = CTL_STATUS_IN; + } + } + + /* set the delay timer to enable timeout for data stage completion */ + puhost->control.timer = usb_curframe_get(pudev); + } +} + +/*! + \brief USB data IN transaction + \param[in] pudev: pointer to USB core instance + \param[in] puhost: pointer to USB host + \param[out] none + \retval none +*/ +static void usbh_data_in_transc (usb_core_driver *pudev, usbh_host *puhost) +{ + usb_urb_state urb_status = URB_IDLE; + + usbh_data_recev (pudev, + puhost->control.buf, + puhost->control.pipe_in_num, + puhost->control.ctl_len); + + urb_status = usbh_urb_wait (pudev, puhost, puhost->control.pipe_in_num, DATA_STAGE_TIMEOUT); + + if (URB_DONE == urb_status) { + puhost->control.ctl_state = CTL_STATUS_OUT; + + puhost->control.timer = usb_curframe_get(pudev); + } +} + +/*! + \brief USB data OUT transaction + \param[in] pudev: pointer to USB core instance + \param[in] puhost: pointer to USB host + \param[out] none + \retval none +*/ +static void usbh_data_out_transc (usb_core_driver *pudev, usbh_host *puhost) +{ + usb_urb_state urb_status = URB_IDLE; + + pudev->host.pipe[puhost->control.pipe_out_num].data_toggle_out = 1U; + + usbh_data_send (pudev, + puhost->control.buf, + puhost->control.pipe_out_num, + puhost->control.ctl_len); + + urb_status = usbh_urb_wait (pudev, puhost, puhost->control.pipe_out_num, DATA_STAGE_TIMEOUT); + + if (URB_DONE == urb_status) { + puhost->control.ctl_state = CTL_STATUS_IN; + + puhost->control.timer = usb_curframe_get(pudev); + } +} + +/*! + \brief USB status IN transaction + \param[in] pudev: pointer to USB core instance + \param[in] puhost: pointer to USB host + \param[out] none + \retval none +*/ +static void usbh_status_in_transc (usb_core_driver *pudev, usbh_host *puhost) +{ + uint8_t pp_num = puhost->control.pipe_in_num; + + usb_urb_state urb_status = URB_IDLE; + + usbh_data_recev (pudev, NULL, pp_num, 0U); + + urb_status = usbh_urb_wait (pudev, puhost, pp_num, NODATA_STAGE_TIMEOUT); + + if (URB_DONE == urb_status) { + puhost->control.ctl_state = CTL_FINISH; + } +} + +/*! + \brief USB status OUT transaction + \param[in] pudev: pointer to USB core instance + \param[in] puhost: pointer to USB host + \param[out] none + \retval none +*/ +static void usbh_status_out_transc (usb_core_driver *pudev, usbh_host *puhost) +{ + uint8_t pp_num = puhost->control.pipe_out_num; + + usb_urb_state urb_status = URB_IDLE; + + pudev->host.pipe[pp_num].data_toggle_out ^= 1U; + + usbh_data_send (pudev, NULL, pp_num, 0U); + + urb_status = usbh_urb_wait (pudev, puhost, pp_num, NODATA_STAGE_TIMEOUT); + + if (URB_DONE == urb_status) { + puhost->control.ctl_state = CTL_FINISH; + } +} + +/*! + \brief USB control transfer handler + \param[in] pudev: pointer to USB core instance + \param[in] puhost: pointer to USB host + \param[out] none + \retval operation status +*/ +usbh_status usbh_ctl_handler (usb_core_driver *pudev, usbh_host *puhost) +{ + usbh_status status = USBH_BUSY; + + switch (puhost->control.ctl_state) { + case CTL_SETUP: + usbh_setup_transc (pudev, puhost); + break; + + case CTL_DATA_IN: + usbh_data_in_transc (pudev, puhost); + break; + + case CTL_DATA_OUT: + usbh_data_out_transc (pudev, puhost); + break; + + case CTL_STATUS_IN: + usbh_status_in_transc (pudev, puhost); + break; + + case CTL_STATUS_OUT: + usbh_status_out_transc (pudev, puhost); + break; + + case CTL_FINISH: + puhost->control.ctl_state = CTL_IDLE; + + status = USBH_OK; + break; + + case CTL_ERROR: + if (++puhost->control.error_count <= USBH_MAX_ERROR_COUNT) { + /* do the transmission again, starting from SETUP packet */ + puhost->control.ctl_state = CTL_SETUP; + } else { + status = USBH_FAIL; + } + break; + + default: + break; + } + + return status; +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_eclic.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_eclic.h new file mode 100644 index 0000000..a155748 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_eclic.h @@ -0,0 +1,48 @@ +// See LICENSE file for licence details + +#ifndef N200_ECLIC_H +#define N200_ECLIC_H + +#include + +#define ECLICINTCTLBITS 4 + +//ECLIC memory map +// Offset +// 0x0000 1B RW ecliccfg +#define ECLIC_CFG_OFFSET 0x0 +// 0x0004 4B R eclicinfo +#define ECLIC_INFO_OFFSET 0x4 +// 0x000B 1B RW mintthresh +#define ECLIC_MTH_OFFSET 0xB +// +// 0x1000+4*i 1B/input RW eclicintip[i] +#define ECLIC_INT_IP_OFFSET _AC(0x1000,UL) +// 0x1001+4*i 1B/input RW eclicintie[i] +#define ECLIC_INT_IE_OFFSET _AC(0x1001,UL) +// 0x1002+4*i 1B/input RW eclicintattr[i] +#define ECLIC_INT_ATTR_OFFSET _AC(0x1002,UL) + +#define ECLIC_INT_ATTR_SHV 0x01 +#define ECLIC_INT_ATTR_TRIG_LEVEL 0x00 +#define ECLIC_INT_ATTR_TRIG_EDGE 0x02 +#define ECLIC_INT_ATTR_TRIG_POS 0x00 +#define ECLIC_INT_ATTR_TRIG_NEG 0x04 + +// 0x1003+4*i 1B/input RW eclicintctl[i] +#define ECLIC_INT_CTRL_OFFSET _AC(0x1003,UL) +// +// ... +// +#define ECLIC_ADDR_BASE 0xd2000000 + + +#define ECLIC_CFG_NLBITS_MASK _AC(0x1E,UL) +#define ECLIC_CFG_NLBITS_LSB (1u) + +#define MSIP_HANDLER eclic_msip_handler +#define MTIME_HANDLER eclic_mtip_handler +#define BWEI_HANDLER eclic_bwei_handler +#define PMOVI_HANDLER eclic_pmovi_handler + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_func.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_func.c new file mode 100644 index 0000000..b589020 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_func.c @@ -0,0 +1,398 @@ +// See LICENSE for license details. +#include +#include +#include +#include +#include + +#include "riscv_encoding.h" +#include "n200_func.h" + + // Configure PMP to make all the address space accesable and executable +void pmp_open_all_space(){ + // Config entry0 addr to all 1s to make the range cover all space + asm volatile ("li x6, 0xffffffff":::"x6"); + asm volatile ("csrw pmpaddr0, x6":::); + // Config entry0 cfg to make it NAPOT address mode, and R/W/X okay + asm volatile ("li x6, 0x7f":::"x6"); + asm volatile ("csrw pmpcfg0, x6":::); +} + +void switch_m2u_mode(){ + clear_csr (mstatus,MSTATUS_MPP); + //printf("\nIn the m2u function, the mstatus is 0x%x\n", read_csr(mstatus)); + //printf("\nIn the m2u function, the mepc is 0x%x\n", read_csr(mepc)); + asm volatile ("la x6, 1f ":::"x6"); + asm volatile ("csrw mepc, x6":::); + asm volatile ("mret":::); + asm volatile ("1:":::); +} + +uint32_t mtime_lo(void) +{ + return *(volatile uint32_t *)(TIMER_CTRL_ADDR + TIMER_MTIME); +} + + +uint32_t mtime_hi(void) +{ + return *(volatile uint32_t *)(TIMER_CTRL_ADDR + TIMER_MTIME + 4); +} + +uint64_t get_timer_value() +{ + while (1) { + uint32_t hi = mtime_hi(); + uint32_t lo = mtime_lo(); + if (hi == mtime_hi()) + return ((uint64_t)hi << 32) | lo; + } +} + +uint32_t get_timer_freq() +{ + return TIMER_FREQ; +} + +uint64_t get_instret_value() +{ + while (1) { + uint32_t hi = read_csr(minstreth); + uint32_t lo = read_csr(minstret); + if (hi == read_csr(minstreth)) + return ((uint64_t)hi << 32) | lo; + } +} + +uint64_t get_cycle_value() +{ + while (1) { + uint32_t hi = read_csr(mcycleh); + uint32_t lo = read_csr(mcycle); + if (hi == read_csr(mcycleh)) + return ((uint64_t)hi << 32) | lo; + } +} + +uint32_t __attribute__((noinline)) measure_cpu_freq(size_t n) +{ + uint32_t start_mtime, delta_mtime; + uint32_t mtime_freq = get_timer_freq(); + + // Don't start measuruing until we see an mtime tick + uint32_t tmp = mtime_lo(); + do { + start_mtime = mtime_lo(); + } while (start_mtime == tmp); + + uint32_t start_mcycle = read_csr(mcycle); + + do { + delta_mtime = mtime_lo() - start_mtime; + } while (delta_mtime < n); + + uint32_t delta_mcycle = read_csr(mcycle) - start_mcycle; + + return (delta_mcycle / delta_mtime) * mtime_freq + + ((delta_mcycle % delta_mtime) * mtime_freq) / delta_mtime; +} + +uint32_t get_cpu_freq() +{ + uint32_t cpu_freq; + + // warm up + measure_cpu_freq(1); + // measure for real + cpu_freq = measure_cpu_freq(100); + + return cpu_freq; +} + + + +// Note that there are no assertions or bounds checking on these +// parameter values. + + + + +void eclic_init ( uint32_t num_irq ) +{ + + typedef volatile uint32_t vuint32_t; + + //clear cfg register + *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_CFG_OFFSET)=0; + + //clear minthresh register + *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_MTH_OFFSET)=0; + + //clear all IP/IE/ATTR/CTRL bits for all interrupt sources + vuint32_t * ptr; + + vuint32_t * base = (vuint32_t*)(ECLIC_ADDR_BASE + ECLIC_INT_IP_OFFSET); + vuint32_t * upper = (vuint32_t*)(base + num_irq*4); + + for (ptr = base; ptr < upper; ptr=ptr+4){ + *ptr = 0; + } +} + + + +void eclic_enable_interrupt (uint32_t source) { + *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_INT_IE_OFFSET+source*4) = 1; +} + +void eclic_disable_interrupt (uint32_t source){ + *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_INT_IE_OFFSET+source*4) = 0; +} + +void eclic_set_pending(uint32_t source){ + *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_INT_IP_OFFSET+source*4) = 1; +} + +void eclic_clear_pending(uint32_t source){ + *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_INT_IP_OFFSET+source*4) = 0; +} + +void eclic_set_intctrl (uint32_t source, uint8_t intctrl){ + *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_INT_CTRL_OFFSET+source*4) = intctrl; +} + +uint8_t eclic_get_intctrl (uint32_t source){ + return *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_INT_CTRL_OFFSET+source*4); +} + +void eclic_set_intattr (uint32_t source, uint8_t intattr){ + *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_INT_ATTR_OFFSET+source*4) = intattr; +} + +uint8_t eclic_get_intattr (uint32_t source){ + return *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_INT_ATTR_OFFSET+source*4); +} + +void eclic_set_cliccfg (uint8_t cliccfg){ + *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_CFG_OFFSET) = cliccfg; +} + +uint8_t eclic_get_cliccfg (){ + return *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_CFG_OFFSET); +} + +void eclic_set_mth (uint8_t mth){ + *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_MTH_OFFSET) = mth; +} + +uint8_t eclic_get_mth (){ + return *(volatile uint8_t*)(ECLIC_ADDR_BASE+ECLIC_MTH_OFFSET); +} + +//sets nlbits +void eclic_set_nlbits(uint8_t nlbits) { + //shift nlbits to correct position + uint8_t nlbits_shifted = nlbits << ECLIC_CFG_NLBITS_LSB; + + //read the current cliccfg + uint8_t old_cliccfg = eclic_get_cliccfg(); + uint8_t new_cliccfg = (old_cliccfg & (~ECLIC_CFG_NLBITS_MASK)) | (ECLIC_CFG_NLBITS_MASK & nlbits_shifted); + + eclic_set_cliccfg(new_cliccfg); +} + +//get nlbits +uint8_t eclic_get_nlbits(void) { + //extract nlbits + uint8_t nlbits = eclic_get_cliccfg(); + nlbits = (nlbits & ECLIC_CFG_NLBITS_MASK) >> ECLIC_CFG_NLBITS_LSB; + return nlbits; +} + +//sets an interrupt level based encoding of nlbits and ECLICINTCTLBITS +void eclic_set_irq_lvl(uint32_t source, uint8_t lvl) { + //extract nlbits + uint8_t nlbits = eclic_get_nlbits(); + if (nlbits > ECLICINTCTLBITS) { + nlbits = ECLICINTCTLBITS; + } + + //shift lvl right to mask off unused bits + lvl = lvl >> (8-nlbits); + //shift lvl into correct bit position + lvl = lvl << (8-nlbits); + + //write to clicintctrl + uint8_t current_intctrl = eclic_get_intctrl(source); + //shift intctrl left to mask off unused bits + current_intctrl = current_intctrl << nlbits; + //shift intctrl into correct bit position + current_intctrl = current_intctrl >> nlbits; + + eclic_set_intctrl(source, (current_intctrl | lvl)); +} + +//gets an interrupt level based encoding of nlbits +uint8_t eclic_get_irq_lvl(uint32_t source) { + //extract nlbits + uint8_t nlbits = eclic_get_nlbits(); + if (nlbits > ECLICINTCTLBITS) { + nlbits = ECLICINTCTLBITS; + } + + uint8_t intctrl = eclic_get_intctrl(source); + + //shift intctrl + intctrl = intctrl >> (8-nlbits); + //shift intctrl + uint8_t lvl = intctrl << (8-nlbits); + + return lvl; +} + +void eclic_set_irq_lvl_abs(uint32_t source, uint8_t lvl_abs) { + //extract nlbits + uint8_t nlbits = eclic_get_nlbits(); + if (nlbits > ECLICINTCTLBITS) { + nlbits = ECLICINTCTLBITS; + } + + //shift lvl_abs into correct bit position + uint8_t lvl = lvl_abs << (8-nlbits); + + //write to clicintctrl + uint8_t current_intctrl = eclic_get_intctrl(source); + //shift intctrl left to mask off unused bits + current_intctrl = current_intctrl << nlbits; + //shift intctrl into correct bit position + current_intctrl = current_intctrl >> nlbits; + + eclic_set_intctrl(source, (current_intctrl | lvl)); +} + +uint8_t eclic_get_irq_lvl_abs(uint32_t source) { + //extract nlbits + uint8_t nlbits = eclic_get_nlbits(); + if (nlbits > ECLICINTCTLBITS) { + nlbits = ECLICINTCTLBITS; + } + + uint8_t intctrl = eclic_get_intctrl(source); + + //shift intctrl + intctrl = intctrl >> (8-nlbits); + //shift intctrl + uint8_t lvl_abs = intctrl; + + return lvl_abs; +} + +//sets an interrupt priority based encoding of nlbits and ECLICINTCTLBITS +uint8_t eclic_set_irq_priority(uint32_t source, uint8_t priority) { + //extract nlbits + uint8_t nlbits = eclic_get_nlbits(); + if (nlbits >= ECLICINTCTLBITS) { + nlbits = ECLICINTCTLBITS; + return 0; + } + + //shift priority into correct bit position + priority = priority << (8 - ECLICINTCTLBITS); + + //write to eclicintctrl + uint8_t current_intctrl = eclic_get_intctrl(source); + //shift intctrl right to mask off unused bits + current_intctrl = current_intctrl >> (8-nlbits); + //shift intctrl into correct bit position + current_intctrl = current_intctrl << (8-nlbits); + + eclic_set_intctrl(source, (current_intctrl | priority)); + + return priority; +} + +//gets an interrupt priority based encoding of nlbits +uint8_t eclic_get_irq_priority(uint32_t source) { + //extract nlbits + uint8_t nlbits = eclic_get_nlbits(); + if (nlbits > ECLICINTCTLBITS) { + nlbits = ECLICINTCTLBITS; + } + + uint8_t intctrl = eclic_get_intctrl(source); + + //shift intctrl + intctrl = intctrl << nlbits; + //shift intctrl + uint8_t priority = intctrl >> (nlbits+(8 - ECLICINTCTLBITS)); + + return priority; +} + +void eclic_mode_enable() { + uint32_t mtvec_value = read_csr(mtvec); + mtvec_value = mtvec_value & 0xFFFFFFC0; + mtvec_value = mtvec_value | 0x00000003; + write_csr(mtvec,mtvec_value); +} + +//sets vector-mode or non-vector mode +void eclic_set_vmode(uint32_t source) { + //read the current attr + uint8_t old_intattr = eclic_get_intattr(source); + // Keep other bits unchanged and only set the LSB bit + uint8_t new_intattr = (old_intattr | 0x1); + + eclic_set_intattr(source,new_intattr); +} + +void eclic_set_nonvmode(uint32_t source) { + //read the current attr + uint8_t old_intattr = eclic_get_intattr(source); + // Keep other bits unchanged and only clear the LSB bit + uint8_t new_intattr = (old_intattr & (~0x1)); + + eclic_set_intattr(source,new_intattr); +} + +//sets interrupt as level sensitive +//Bit 1, trig[0], is defined as "edge-triggered" (0: level-triggered, 1: edge-triggered); +//Bit 2, trig[1], is defined as "negative-edge" (0: positive-edge, 1: negative-edge). + +void eclic_set_level_trig(uint32_t source) { + //read the current attr + uint8_t old_intattr = eclic_get_intattr(source); + // Keep other bits unchanged and only clear the bit 1 + uint8_t new_intattr = (old_intattr & (~0x2)); + + eclic_set_intattr(source,new_intattr); +} + +void eclic_set_posedge_trig(uint32_t source) { + //read the current attr + uint8_t old_intattr = eclic_get_intattr(source); + // Keep other bits unchanged and only set the bit 1 + uint8_t new_intattr = (old_intattr | 0x2); + // Keep other bits unchanged and only clear the bit 2 + new_intattr = (old_intattr & (~0x4)); + + eclic_set_intattr(source,new_intattr); +} + +void eclic_set_negedge_trig(uint32_t source) { + //read the current attr + uint8_t old_intattr = eclic_get_intattr(source); + // Keep other bits unchanged and only set the bit 1 + uint8_t new_intattr = (old_intattr | 0x2); + // Keep other bits unchanged and only set the bit 2 + new_intattr = (old_intattr | 0x4); + + eclic_set_intattr(source,new_intattr); +} + +//void wfe() { +// core_wfe(); +//} + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_func.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_func.h new file mode 100644 index 0000000..6531d0b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_func.h @@ -0,0 +1,109 @@ +// See LICENSE file for licence details + +#ifndef N200_FUNC_H +#define N200_FUNC_H + + +#include +#include "n200_timer.h" +#include "n200_eclic.h" + +#define ECLIC_GROUP_LEVEL0_PRIO4 0 +#define ECLIC_GROUP_LEVEL1_PRIO3 1 +#define ECLIC_GROUP_LEVEL2_PRIO2 2 +#define ECLIC_GROUP_LEVEL3_PRIO1 3 +#define ECLIC_GROUP_LEVEL4_PRIO0 4 + +void pmp_open_all_space(); + +void switch_m2u_mode(); + +uint32_t get_mtime_freq(); + +uint32_t mtime_lo(void); + +uint32_t mtime_hi(void); + +uint64_t get_mtime_value(); + +uint64_t get_instret_value(); + +uint64_t get_cycle_value(); + +uint32_t get_cpu_freq(); + +uint32_t __attribute__((noinline)) measure_cpu_freq(size_t n); + + +/////////////////////////////////////////////////////////////////// +/////// ECLIC relevant functions +/////// +void eclic_init ( uint32_t num_irq ); +uint64_t get_timer_value(); +void eclic_enable_interrupt (uint32_t source); +void eclic_disable_interrupt (uint32_t source); + +void eclic_set_pending(uint32_t source); +void eclic_clear_pending(uint32_t source); + +void eclic_set_intctrl (uint32_t source, uint8_t intctrl); +uint8_t eclic_get_intctrl (uint32_t source); + +void eclic_set_intattr (uint32_t source, uint8_t intattr); +uint8_t eclic_get_intattr (uint32_t source); + +void eclic_set_cliccfg (uint8_t cliccfg); +uint8_t eclic_get_cliccfg (); + +void eclic_set_mth (uint8_t mth); +uint8_t eclic_get_mth(); + +//sets nlbits +void eclic_set_nlbits(uint8_t nlbits); + + +//get nlbits +uint8_t eclic_get_nlbits(); + +void eclic_set_irq_lvl(uint32_t source, uint8_t lvl); +uint8_t eclic_get_irq_lvl(uint32_t source); + +void eclic_set_irq_lvl_abs(uint32_t source, uint8_t lvl_abs); +uint8_t eclic_get_irq_lvl_abs(uint32_t source); + +uint8_t eclic_set_irq_priority(uint32_t source, uint8_t priority); +uint8_t eclic_get_irq_priority(uint32_t source); + +void eclic_mode_enable(); + +void eclic_set_vmode(uint32_t source); +void eclic_set_nonvmode(uint32_t source); + +void eclic_set_level_trig(uint32_t source); +void eclic_set_posedge_trig(uint32_t source); +void eclic_set_negedge_trig(uint32_t source); + + +///** \brief Wait For Interrupt +// +// Wait For Interrupt is a hint instruction that suspends execution +// until one of a number of events occurs. +// */ +__attribute__( ( always_inline ) ) static inline void __WFI(void) { + __asm volatile ("wfi"); +} +// +// +/** \brief Wait For Event + + Wait For Event is a hint instruction that permits the processor to enter + a low-power state until one of a number of events occurs. + */ +__attribute__( ( always_inline ) ) static inline void __WFE(void) { + __asm volatile ("csrs 0x810, 0x1"); + __asm volatile ("wfi"); + __asm volatile ("csrc 0x810, 0x1"); +} + + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_timer.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_timer.h new file mode 100644 index 0000000..75ef7ca --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/n200_timer.h @@ -0,0 +1,18 @@ +// See LICENSE file for licence details + +#ifndef N200_TIMER_H +#define N200_TIMER_H + +#define TIMER_MSIP 0xFFC +#define TIMER_MSIP_size 0x4 +#define TIMER_MTIMECMP 0x8 +#define TIMER_MTIMECMP_size 0x8 +#define TIMER_MTIME 0x0 +#define TIMER_MTIME_size 0x8 + +#define TIMER_CTRL_ADDR 0xd1000000 +#define TIMER_REG(offset) _REG32(TIMER_CTRL_ADDR, offset) +#define TIMER_FREQ ((uint32_t)SystemCoreClock/4) //units HZ + +#endif + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/riscv_bits.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/riscv_bits.h new file mode 100644 index 0000000..bfe656f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/riscv_bits.h @@ -0,0 +1,36 @@ +// See LICENSE for license details. +#ifndef _RISCV_BITS_H +#define _RISCV_BITS_H + +#define likely(x) __builtin_expect((x), 1) +#define unlikely(x) __builtin_expect((x), 0) + +#define ROUNDUP(a, b) ((((a)-1)/(b)+1)*(b)) +#define ROUNDDOWN(a, b) ((a)/(b)*(b)) + +#define MAX(a, b) ((a) > (b) ? (a) : (b)) +#define MIN(a, b) ((a) < (b) ? (a) : (b)) +#define CLAMP(a, lo, hi) MIN(MAX(a, lo), hi) + +#define EXTRACT_FIELD(val, which) (((val) & (which)) / ((which) & ~((which)-1))) +#define INSERT_FIELD(val, which, fieldval) (((val) & ~(which)) | ((fieldval) * ((which) & ~((which)-1)))) + +#define STR(x) XSTR(x) +#define XSTR(x) #x + +#if __riscv_xlen == 64 +# define SLL32 sllw +# define STORE sd +# define LOAD ld +# define LWU lwu +# define LOG_REGBYTES 3 +#else +# define SLL32 sll +# define STORE sw +# define LOAD lw +# define LWU lw +# define LOG_REGBYTES 2 +#endif +#define REGBYTES (1 << LOG_REGBYTES) + +#endif diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/riscv_const.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/riscv_const.h new file mode 100644 index 0000000..d5dec8a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/riscv_const.h @@ -0,0 +1,18 @@ +// See LICENSE for license details. +/* Derived from */ + +#ifndef _RISCV_CONST_H +#define _RISCV_CONST_H + +#ifdef __ASSEMBLER__ +#define _AC(X,Y) X +#define _AT(T,X) X +#else +#define _AC(X,Y) (X##Y) +#define _AT(T,X) ((T)(X)) +#endif /* !__ASSEMBLER__*/ + +#define _BITUL(x) (_AC(1,UL) << (x)) +#define _BITULL(x) (_AC(1,ULL) << (x)) + +#endif /* _NUCLEI_CONST_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/riscv_encoding.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/riscv_encoding.h new file mode 100644 index 0000000..fa823eb --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/drivers/riscv_encoding.h @@ -0,0 +1,1368 @@ +// See LICENSE for license details. + +#ifndef RISCV_CSR_ENCODING_H +#define RISCV_CSR_ENCODING_H + +#define MSTATUS_UIE 0x00000001 +#define MSTATUS_SIE 0x00000002 +#define MSTATUS_HIE 0x00000004 +#define MSTATUS_MIE 0x00000008 +#define MSTATUS_UPIE 0x00000010 +#define MSTATUS_SPIE 0x00000020 +#define MSTATUS_HPIE 0x00000040 +#define MSTATUS_MPIE 0x00000080 +#define MSTATUS_SPP 0x00000100 +#define MSTATUS_MPP 0x00001800 +#define MSTATUS_FS 0x00006000 +#define MSTATUS_XS 0x00018000 +#define MSTATUS_MPRV 0x00020000 +#define MSTATUS_PUM 0x00040000 +#define MSTATUS_MXR 0x00080000 +#define MSTATUS_VM 0x1F000000 +#define MSTATUS32_SD 0x80000000 +#define MSTATUS64_SD 0x8000000000000000 + + +#define SSTATUS_UIE 0x00000001 +#define SSTATUS_SIE 0x00000002 +#define SSTATUS_UPIE 0x00000010 +#define SSTATUS_SPIE 0x00000020 +#define SSTATUS_SPP 0x00000100 +#define SSTATUS_FS 0x00006000 +#define SSTATUS_XS 0x00018000 +#define SSTATUS_PUM 0x00040000 +#define SSTATUS32_SD 0x80000000 +#define SSTATUS64_SD 0x8000000000000000 + +#define DCSR_XDEBUGVER (3U<<30) +#define DCSR_NDRESET (1<<29) +#define DCSR_FULLRESET (1<<28) +#define DCSR_EBREAKM (1<<15) +#define DCSR_EBREAKH (1<<14) +#define DCSR_EBREAKS (1<<13) +#define DCSR_EBREAKU (1<<12) +#define DCSR_STOPCYCLE (1<<10) +#define DCSR_STOPTIME (1<<9) +#define DCSR_CAUSE (7<<6) +#define DCSR_DEBUGINT (1<<5) +#define DCSR_HALT (1<<3) +#define DCSR_STEP (1<<2) +#define DCSR_PRV (3<<0) + +#define DCSR_CAUSE_NONE 0 +#define DCSR_CAUSE_SWBP 1 +#define DCSR_CAUSE_HWBP 2 +#define DCSR_CAUSE_DEBUGINT 3 +#define DCSR_CAUSE_STEP 4 +#define DCSR_CAUSE_HALT 5 + +#define MCONTROL_TYPE(xlen) (0xfULL<<((xlen)-4)) +#define MCONTROL_DMODE(xlen) (1ULL<<((xlen)-5)) +#define MCONTROL_MASKMAX(xlen) (0x3fULL<<((xlen)-11)) + +#define MCONTROL_SELECT (1<<19) +#define MCONTROL_TIMING (1<<18) +#define MCONTROL_ACTION (0x3f<<12) +#define MCONTROL_CHAIN (1<<11) +#define MCONTROL_MATCH (0xf<<7) +#define MCONTROL_M (1<<6) +#define MCONTROL_H (1<<5) +#define MCONTROL_S (1<<4) +#define MCONTROL_U (1<<3) +#define MCONTROL_EXECUTE (1<<2) +#define MCONTROL_STORE (1<<1) +#define MCONTROL_LOAD (1<<0) + +#define MCONTROL_TYPE_NONE 0 +#define MCONTROL_TYPE_MATCH 2 + +#define MCONTROL_ACTION_DEBUG_EXCEPTION 0 +#define MCONTROL_ACTION_DEBUG_MODE 1 +#define MCONTROL_ACTION_TRACE_START 2 +#define MCONTROL_ACTION_TRACE_STOP 3 +#define MCONTROL_ACTION_TRACE_EMIT 4 + +#define MCONTROL_MATCH_EQUAL 0 +#define MCONTROL_MATCH_NAPOT 1 +#define MCONTROL_MATCH_GE 2 +#define MCONTROL_MATCH_LT 3 +#define MCONTROL_MATCH_MASK_LOW 4 +#define MCONTROL_MATCH_MASK_HIGH 5 + +#define MIP_SSIP (1 << IRQ_S_SOFT) +#define MIP_HSIP (1 << IRQ_H_SOFT) +#define MIP_MSIP (1 << IRQ_M_SOFT) +#define MIP_STIP (1 << IRQ_S_TIMER) +#define MIP_HTIP (1 << IRQ_H_TIMER) +#define MIP_MTIP (1 << IRQ_M_TIMER) +#define MIP_SEIP (1 << IRQ_S_EXT) +#define MIP_HEIP (1 << IRQ_H_EXT) +#define MIP_MEIP (1 << IRQ_M_EXT) + +#define MIE_SSIE MIP_SSIP +#define MIE_HSIE MIP_HSIP +#define MIE_MSIE MIP_MSIP +#define MIE_STIE MIP_STIP +#define MIE_HTIE MIP_HTIP +#define MIE_MTIE MIP_MTIP +#define MIE_SEIE MIP_SEIP +#define MIE_HEIE MIP_HEIP +#define MIE_MEIE MIP_MEIP + +#define SIP_SSIP MIP_SSIP +#define SIP_STIP MIP_STIP + +#define PRV_U 0 +#define PRV_S 1 +#define PRV_H 2 +#define PRV_M 3 + +#define VM_MBARE 0 +#define VM_MBB 1 +#define VM_MBBID 2 +#define VM_SV32 8 +#define VM_SV39 9 +#define VM_SV48 10 + +#define IRQ_S_SOFT 1 +#define IRQ_H_SOFT 2 +#define IRQ_M_SOFT 3 +#define IRQ_S_TIMER 5 +#define IRQ_H_TIMER 6 +#define IRQ_M_TIMER 7 +#define IRQ_S_EXT 9 +#define IRQ_H_EXT 10 +#define IRQ_M_EXT 11 +#define IRQ_COP 12 +#define IRQ_HOST 13 + +#define DEFAULT_RSTVEC 0x00001000 +#define DEFAULT_NMIVEC 0x00001004 +#define DEFAULT_MTVEC 0x00001010 +#define CONFIG_STRING_ADDR 0x0000100C +#define EXT_IO_BASE 0x40000000 +#define DRAM_BASE 0x80000000 + +// page table entry (PTE) fields +#define PTE_V 0x001 // Valid +#define PTE_R 0x002 // Read +#define PTE_W 0x004 // Write +#define PTE_X 0x008 // Execute +#define PTE_U 0x010 // User +#define PTE_G 0x020 // Global +#define PTE_A 0x040 // Accessed +#define PTE_D 0x080 // Dirty +#define PTE_SOFT 0x300 // Reserved for Software + +#define PTE_PPN_SHIFT 10 + +#define PTE_TABLE(PTE) (((PTE) & (PTE_V | PTE_R | PTE_W | PTE_X)) == PTE_V) + +#ifdef __riscv + +#ifdef __riscv64 +# define MSTATUS_SD MSTATUS64_SD +# define SSTATUS_SD SSTATUS64_SD +# define RISCV_PGLEVEL_BITS 9 +#else +# define MSTATUS_SD MSTATUS32_SD +# define SSTATUS_SD SSTATUS32_SD +# define RISCV_PGLEVEL_BITS 10 +#endif +#define RISCV_PGSHIFT 12 +#define RISCV_PGSIZE (1 << RISCV_PGSHIFT) + +#ifndef __ASSEMBLER__ + +#ifdef __GNUC__ + +#define read_fpu(reg) ({ unsigned long __tmp; \ + asm volatile ("fmv.x.w %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + +#define write_fpu(reg, val) ({ \ + if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ + asm volatile ("fmv.w.x " #reg ", %0" :: "i"(val)); \ + else \ + asm volatile ("fmv.w.x " #reg ", %0" :: "r"(val)); }) + + +#define read_csr(reg) ({ unsigned long __tmp; \ + asm volatile ("csrr %0, " #reg : "=r"(__tmp)); \ + __tmp; }) + +#define write_csr(reg, val) ({ \ + if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ + asm volatile ("csrw " #reg ", %0" :: "i"(val)); \ + else \ + asm volatile ("csrw " #reg ", %0" :: "r"(val)); }) + +#define swap_csr(reg, val) ({ unsigned long __tmp; \ + if (__builtin_constant_p(val) && (unsigned long)(val) < 32) \ + asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "i"(val)); \ + else \ + asm volatile ("csrrw %0, " #reg ", %1" : "=r"(__tmp) : "r"(val)); \ + __tmp; }) + +#define set_csr(reg, bit) ({ unsigned long __tmp; \ + if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \ + asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \ + else \ + asm volatile ("csrrs %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \ + __tmp; }) + +#define clear_csr(reg, bit) ({ unsigned long __tmp; \ + if (__builtin_constant_p(bit) && (unsigned long)(bit) < 32) \ + asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "i"(bit)); \ + else \ + asm volatile ("csrrc %0, " #reg ", %1" : "=r"(__tmp) : "r"(bit)); \ + __tmp; }) + +#define rdtime() read_csr(time) +#define rdcycle() read_csr(cycle) +#define rdinstret() read_csr(instret) + + + + + + +#endif + +#endif + +#endif + +#endif +/* Automatically generated by parse-opcodes */ +#ifndef RISCV_ENCODING_H +#define RISCV_ENCODING_H +#define MATCH_BEQ 0x63 +#define MASK_BEQ 0x707f +#define MATCH_BNE 0x1063 +#define MASK_BNE 0x707f +#define MATCH_BLT 0x4063 +#define MASK_BLT 0x707f +#define MATCH_BGE 0x5063 +#define MASK_BGE 0x707f +#define MATCH_BLTU 0x6063 +#define MASK_BLTU 0x707f +#define MATCH_BGEU 0x7063 +#define MASK_BGEU 0x707f +#define MATCH_JALR 0x67 +#define MASK_JALR 0x707f +#define MATCH_JAL 0x6f +#define MASK_JAL 0x7f +#define MATCH_LUI 0x37 +#define MASK_LUI 0x7f +#define MATCH_AUIPC 0x17 +#define MASK_AUIPC 0x7f +#define MATCH_ADDI 0x13 +#define MASK_ADDI 0x707f +#define MATCH_SLLI 0x1013 +#define MASK_SLLI 0xfc00707f +#define MATCH_SLTI 0x2013 +#define MASK_SLTI 0x707f +#define MATCH_SLTIU 0x3013 +#define MASK_SLTIU 0x707f +#define MATCH_XORI 0x4013 +#define MASK_XORI 0x707f +#define MATCH_SRLI 0x5013 +#define MASK_SRLI 0xfc00707f +#define MATCH_SRAI 0x40005013 +#define MASK_SRAI 0xfc00707f +#define MATCH_ORI 0x6013 +#define MASK_ORI 0x707f +#define MATCH_ANDI 0x7013 +#define MASK_ANDI 0x707f +#define MATCH_ADD 0x33 +#define MASK_ADD 0xfe00707f +#define MATCH_SUB 0x40000033 +#define MASK_SUB 0xfe00707f +#define MATCH_SLL 0x1033 +#define MASK_SLL 0xfe00707f +#define MATCH_SLT 0x2033 +#define MASK_SLT 0xfe00707f +#define MATCH_SLTU 0x3033 +#define MASK_SLTU 0xfe00707f +#define MATCH_XOR 0x4033 +#define MASK_XOR 0xfe00707f +#define MATCH_SRL 0x5033 +#define MASK_SRL 0xfe00707f +#define MATCH_SRA 0x40005033 +#define MASK_SRA 0xfe00707f +#define MATCH_OR 0x6033 +#define MASK_OR 0xfe00707f +#define MATCH_AND 0x7033 +#define MASK_AND 0xfe00707f +#define MATCH_ADDIW 0x1b +#define MASK_ADDIW 0x707f +#define MATCH_SLLIW 0x101b +#define MASK_SLLIW 0xfe00707f +#define MATCH_SRLIW 0x501b +#define MASK_SRLIW 0xfe00707f +#define MATCH_SRAIW 0x4000501b +#define MASK_SRAIW 0xfe00707f +#define MATCH_ADDW 0x3b +#define MASK_ADDW 0xfe00707f +#define MATCH_SUBW 0x4000003b +#define MASK_SUBW 0xfe00707f +#define MATCH_SLLW 0x103b +#define MASK_SLLW 0xfe00707f +#define MATCH_SRLW 0x503b +#define MASK_SRLW 0xfe00707f +#define MATCH_SRAW 0x4000503b +#define MASK_SRAW 0xfe00707f +#define MATCH_LB 0x3 +#define MASK_LB 0x707f +#define MATCH_LH 0x1003 +#define MASK_LH 0x707f +#define MATCH_LW 0x2003 +#define MASK_LW 0x707f +#define MATCH_LD 0x3003 +#define MASK_LD 0x707f +#define MATCH_LBU 0x4003 +#define MASK_LBU 0x707f +#define MATCH_LHU 0x5003 +#define MASK_LHU 0x707f +#define MATCH_LWU 0x6003 +#define MASK_LWU 0x707f +#define MATCH_SB 0x23 +#define MASK_SB 0x707f +#define MATCH_SH 0x1023 +#define MASK_SH 0x707f +#define MATCH_SW 0x2023 +#define MASK_SW 0x707f +#define MATCH_SD 0x3023 +#define MASK_SD 0x707f +#define MATCH_FENCE 0xf +#define MASK_FENCE 0x707f +#define MATCH_FENCE_I 0x100f +#define MASK_FENCE_I 0x707f +#define MATCH_MUL 0x2000033 +#define MASK_MUL 0xfe00707f +#define MATCH_MULH 0x2001033 +#define MASK_MULH 0xfe00707f +#define MATCH_MULHSU 0x2002033 +#define MASK_MULHSU 0xfe00707f +#define MATCH_MULHU 0x2003033 +#define MASK_MULHU 0xfe00707f +#define MATCH_DIV 0x2004033 +#define MASK_DIV 0xfe00707f +#define MATCH_DIVU 0x2005033 +#define MASK_DIVU 0xfe00707f +#define MATCH_REM 0x2006033 +#define MASK_REM 0xfe00707f +#define MATCH_REMU 0x2007033 +#define MASK_REMU 0xfe00707f +#define MATCH_MULW 0x200003b +#define MASK_MULW 0xfe00707f +#define MATCH_DIVW 0x200403b +#define MASK_DIVW 0xfe00707f +#define MATCH_DIVUW 0x200503b +#define MASK_DIVUW 0xfe00707f +#define MATCH_REMW 0x200603b +#define MASK_REMW 0xfe00707f +#define MATCH_REMUW 0x200703b +#define MASK_REMUW 0xfe00707f +#define MATCH_AMOADD_W 0x202f +#define MASK_AMOADD_W 0xf800707f +#define MATCH_AMOXOR_W 0x2000202f +#define MASK_AMOXOR_W 0xf800707f +#define MATCH_AMOOR_W 0x4000202f +#define MASK_AMOOR_W 0xf800707f +#define MATCH_AMOAND_W 0x6000202f +#define MASK_AMOAND_W 0xf800707f +#define MATCH_AMOMIN_W 0x8000202f +#define MASK_AMOMIN_W 0xf800707f +#define MATCH_AMOMAX_W 0xa000202f +#define MASK_AMOMAX_W 0xf800707f +#define MATCH_AMOMINU_W 0xc000202f +#define MASK_AMOMINU_W 0xf800707f +#define MATCH_AMOMAXU_W 0xe000202f +#define MASK_AMOMAXU_W 0xf800707f +#define MATCH_AMOSWAP_W 0x800202f +#define MASK_AMOSWAP_W 0xf800707f +#define MATCH_LR_W 0x1000202f +#define MASK_LR_W 0xf9f0707f +#define MATCH_SC_W 0x1800202f +#define MASK_SC_W 0xf800707f +#define MATCH_AMOADD_D 0x302f +#define MASK_AMOADD_D 0xf800707f +#define MATCH_AMOXOR_D 0x2000302f +#define MASK_AMOXOR_D 0xf800707f +#define MATCH_AMOOR_D 0x4000302f +#define MASK_AMOOR_D 0xf800707f +#define MATCH_AMOAND_D 0x6000302f +#define MASK_AMOAND_D 0xf800707f +#define MATCH_AMOMIN_D 0x8000302f +#define MASK_AMOMIN_D 0xf800707f +#define MATCH_AMOMAX_D 0xa000302f +#define MASK_AMOMAX_D 0xf800707f +#define MATCH_AMOMINU_D 0xc000302f +#define MASK_AMOMINU_D 0xf800707f +#define MATCH_AMOMAXU_D 0xe000302f +#define MASK_AMOMAXU_D 0xf800707f +#define MATCH_AMOSWAP_D 0x800302f +#define MASK_AMOSWAP_D 0xf800707f +#define MATCH_LR_D 0x1000302f +#define MASK_LR_D 0xf9f0707f +#define MATCH_SC_D 0x1800302f +#define MASK_SC_D 0xf800707f +#define MATCH_ECALL 0x73 +#define MASK_ECALL 0xffffffff +#define MATCH_EBREAK 0x100073 +#define MASK_EBREAK 0xffffffff +#define MATCH_URET 0x200073 +#define MASK_URET 0xffffffff +#define MATCH_SRET 0x10200073 +#define MASK_SRET 0xffffffff +#define MATCH_HRET 0x20200073 +#define MASK_HRET 0xffffffff +#define MATCH_MRET 0x30200073 +#define MASK_MRET 0xffffffff +#define MATCH_DRET 0x7b200073 +#define MASK_DRET 0xffffffff +#define MATCH_SFENCE_VM 0x10400073 +#define MASK_SFENCE_VM 0xfff07fff +#define MATCH_WFI 0x10500073 +#define MASK_WFI 0xffffffff +#define MATCH_CSRRW 0x1073 +#define MASK_CSRRW 0x707f +#define MATCH_CSRRS 0x2073 +#define MASK_CSRRS 0x707f +#define MATCH_CSRRC 0x3073 +#define MASK_CSRRC 0x707f +#define MATCH_CSRRWI 0x5073 +#define MASK_CSRRWI 0x707f +#define MATCH_CSRRSI 0x6073 +#define MASK_CSRRSI 0x707f +#define MATCH_CSRRCI 0x7073 +#define MASK_CSRRCI 0x707f +#define MATCH_FADD_S 0x53 +#define MASK_FADD_S 0xfe00007f +#define MATCH_FSUB_S 0x8000053 +#define MASK_FSUB_S 0xfe00007f +#define MATCH_FMUL_S 0x10000053 +#define MASK_FMUL_S 0xfe00007f +#define MATCH_FDIV_S 0x18000053 +#define MASK_FDIV_S 0xfe00007f +#define MATCH_FSGNJ_S 0x20000053 +#define MASK_FSGNJ_S 0xfe00707f +#define MATCH_FSGNJN_S 0x20001053 +#define MASK_FSGNJN_S 0xfe00707f +#define MATCH_FSGNJX_S 0x20002053 +#define MASK_FSGNJX_S 0xfe00707f +#define MATCH_FMIN_S 0x28000053 +#define MASK_FMIN_S 0xfe00707f +#define MATCH_FMAX_S 0x28001053 +#define MASK_FMAX_S 0xfe00707f +#define MATCH_FSQRT_S 0x58000053 +#define MASK_FSQRT_S 0xfff0007f +#define MATCH_FADD_D 0x2000053 +#define MASK_FADD_D 0xfe00007f +#define MATCH_FSUB_D 0xa000053 +#define MASK_FSUB_D 0xfe00007f +#define MATCH_FMUL_D 0x12000053 +#define MASK_FMUL_D 0xfe00007f +#define MATCH_FDIV_D 0x1a000053 +#define MASK_FDIV_D 0xfe00007f +#define MATCH_FSGNJ_D 0x22000053 +#define MASK_FSGNJ_D 0xfe00707f +#define MATCH_FSGNJN_D 0x22001053 +#define MASK_FSGNJN_D 0xfe00707f +#define MATCH_FSGNJX_D 0x22002053 +#define MASK_FSGNJX_D 0xfe00707f +#define MATCH_FMIN_D 0x2a000053 +#define MASK_FMIN_D 0xfe00707f +#define MATCH_FMAX_D 0x2a001053 +#define MASK_FMAX_D 0xfe00707f +#define MATCH_FCVT_S_D 0x40100053 +#define MASK_FCVT_S_D 0xfff0007f +#define MATCH_FCVT_D_S 0x42000053 +#define MASK_FCVT_D_S 0xfff0007f +#define MATCH_FSQRT_D 0x5a000053 +#define MASK_FSQRT_D 0xfff0007f +#define MATCH_FLE_S 0xa0000053 +#define MASK_FLE_S 0xfe00707f +#define MATCH_FLT_S 0xa0001053 +#define MASK_FLT_S 0xfe00707f +#define MATCH_FEQ_S 0xa0002053 +#define MASK_FEQ_S 0xfe00707f +#define MATCH_FLE_D 0xa2000053 +#define MASK_FLE_D 0xfe00707f +#define MATCH_FLT_D 0xa2001053 +#define MASK_FLT_D 0xfe00707f +#define MATCH_FEQ_D 0xa2002053 +#define MASK_FEQ_D 0xfe00707f +#define MATCH_FCVT_W_S 0xc0000053 +#define MASK_FCVT_W_S 0xfff0007f +#define MATCH_FCVT_WU_S 0xc0100053 +#define MASK_FCVT_WU_S 0xfff0007f +#define MATCH_FCVT_L_S 0xc0200053 +#define MASK_FCVT_L_S 0xfff0007f +#define MATCH_FCVT_LU_S 0xc0300053 +#define MASK_FCVT_LU_S 0xfff0007f +#define MATCH_FMV_X_S 0xe0000053 +#define MASK_FMV_X_S 0xfff0707f +#define MATCH_FCLASS_S 0xe0001053 +#define MASK_FCLASS_S 0xfff0707f +#define MATCH_FCVT_W_D 0xc2000053 +#define MASK_FCVT_W_D 0xfff0007f +#define MATCH_FCVT_WU_D 0xc2100053 +#define MASK_FCVT_WU_D 0xfff0007f +#define MATCH_FCVT_L_D 0xc2200053 +#define MASK_FCVT_L_D 0xfff0007f +#define MATCH_FCVT_LU_D 0xc2300053 +#define MASK_FCVT_LU_D 0xfff0007f +#define MATCH_FMV_X_D 0xe2000053 +#define MASK_FMV_X_D 0xfff0707f +#define MATCH_FCLASS_D 0xe2001053 +#define MASK_FCLASS_D 0xfff0707f +#define MATCH_FCVT_S_W 0xd0000053 +#define MASK_FCVT_S_W 0xfff0007f +#define MATCH_FCVT_S_WU 0xd0100053 +#define MASK_FCVT_S_WU 0xfff0007f +#define MATCH_FCVT_S_L 0xd0200053 +#define MASK_FCVT_S_L 0xfff0007f +#define MATCH_FCVT_S_LU 0xd0300053 +#define MASK_FCVT_S_LU 0xfff0007f +#define MATCH_FMV_S_X 0xf0000053 +#define MASK_FMV_S_X 0xfff0707f +#define MATCH_FCVT_D_W 0xd2000053 +#define MASK_FCVT_D_W 0xfff0007f +#define MATCH_FCVT_D_WU 0xd2100053 +#define MASK_FCVT_D_WU 0xfff0007f +#define MATCH_FCVT_D_L 0xd2200053 +#define MASK_FCVT_D_L 0xfff0007f +#define MATCH_FCVT_D_LU 0xd2300053 +#define MASK_FCVT_D_LU 0xfff0007f +#define MATCH_FMV_D_X 0xf2000053 +#define MASK_FMV_D_X 0xfff0707f +#define MATCH_FLW 0x2007 +#define MASK_FLW 0x707f +#define MATCH_FLD 0x3007 +#define MASK_FLD 0x707f +#define MATCH_FSW 0x2027 +#define MASK_FSW 0x707f +#define MATCH_FSD 0x3027 +#define MASK_FSD 0x707f +#define MATCH_FMADD_S 0x43 +#define MASK_FMADD_S 0x600007f +#define MATCH_FMSUB_S 0x47 +#define MASK_FMSUB_S 0x600007f +#define MATCH_FNMSUB_S 0x4b +#define MASK_FNMSUB_S 0x600007f +#define MATCH_FNMADD_S 0x4f +#define MASK_FNMADD_S 0x600007f +#define MATCH_FMADD_D 0x2000043 +#define MASK_FMADD_D 0x600007f +#define MATCH_FMSUB_D 0x2000047 +#define MASK_FMSUB_D 0x600007f +#define MATCH_FNMSUB_D 0x200004b +#define MASK_FNMSUB_D 0x600007f +#define MATCH_FNMADD_D 0x200004f +#define MASK_FNMADD_D 0x600007f +#define MATCH_C_NOP 0x1 +#define MASK_C_NOP 0xffff +#define MATCH_C_ADDI16SP 0x6101 +#define MASK_C_ADDI16SP 0xef83 +#define MATCH_C_JR 0x8002 +#define MASK_C_JR 0xf07f +#define MATCH_C_JALR 0x9002 +#define MASK_C_JALR 0xf07f +#define MATCH_C_EBREAK 0x9002 +#define MASK_C_EBREAK 0xffff +#define MATCH_C_LD 0x6000 +#define MASK_C_LD 0xe003 +#define MATCH_C_SD 0xe000 +#define MASK_C_SD 0xe003 +#define MATCH_C_ADDIW 0x2001 +#define MASK_C_ADDIW 0xe003 +#define MATCH_C_LDSP 0x6002 +#define MASK_C_LDSP 0xe003 +#define MATCH_C_SDSP 0xe002 +#define MASK_C_SDSP 0xe003 +#define MATCH_C_ADDI4SPN 0x0 +#define MASK_C_ADDI4SPN 0xe003 +#define MATCH_C_FLD 0x2000 +#define MASK_C_FLD 0xe003 +#define MATCH_C_LW 0x4000 +#define MASK_C_LW 0xe003 +#define MATCH_C_FLW 0x6000 +#define MASK_C_FLW 0xe003 +#define MATCH_C_FSD 0xa000 +#define MASK_C_FSD 0xe003 +#define MATCH_C_SW 0xc000 +#define MASK_C_SW 0xe003 +#define MATCH_C_FSW 0xe000 +#define MASK_C_FSW 0xe003 +#define MATCH_C_ADDI 0x1 +#define MASK_C_ADDI 0xe003 +#define MATCH_C_JAL 0x2001 +#define MASK_C_JAL 0xe003 +#define MATCH_C_LI 0x4001 +#define MASK_C_LI 0xe003 +#define MATCH_C_LUI 0x6001 +#define MASK_C_LUI 0xe003 +#define MATCH_C_SRLI 0x8001 +#define MASK_C_SRLI 0xec03 +#define MATCH_C_SRAI 0x8401 +#define MASK_C_SRAI 0xec03 +#define MATCH_C_ANDI 0x8801 +#define MASK_C_ANDI 0xec03 +#define MATCH_C_SUB 0x8c01 +#define MASK_C_SUB 0xfc63 +#define MATCH_C_XOR 0x8c21 +#define MASK_C_XOR 0xfc63 +#define MATCH_C_OR 0x8c41 +#define MASK_C_OR 0xfc63 +#define MATCH_C_AND 0x8c61 +#define MASK_C_AND 0xfc63 +#define MATCH_C_SUBW 0x9c01 +#define MASK_C_SUBW 0xfc63 +#define MATCH_C_ADDW 0x9c21 +#define MASK_C_ADDW 0xfc63 +#define MATCH_C_J 0xa001 +#define MASK_C_J 0xe003 +#define MATCH_C_BEQZ 0xc001 +#define MASK_C_BEQZ 0xe003 +#define MATCH_C_BNEZ 0xe001 +#define MASK_C_BNEZ 0xe003 +#define MATCH_C_SLLI 0x2 +#define MASK_C_SLLI 0xe003 +#define MATCH_C_FLDSP 0x2002 +#define MASK_C_FLDSP 0xe003 +#define MATCH_C_LWSP 0x4002 +#define MASK_C_LWSP 0xe003 +#define MATCH_C_FLWSP 0x6002 +#define MASK_C_FLWSP 0xe003 +#define MATCH_C_MV 0x8002 +#define MASK_C_MV 0xf003 +#define MATCH_C_ADD 0x9002 +#define MASK_C_ADD 0xf003 +#define MATCH_C_FSDSP 0xa002 +#define MASK_C_FSDSP 0xe003 +#define MATCH_C_SWSP 0xc002 +#define MASK_C_SWSP 0xe003 +#define MATCH_C_FSWSP 0xe002 +#define MASK_C_FSWSP 0xe003 +#define MATCH_CUSTOM0 0xb +#define MASK_CUSTOM0 0x707f +#define MATCH_CUSTOM0_RS1 0x200b +#define MASK_CUSTOM0_RS1 0x707f +#define MATCH_CUSTOM0_RS1_RS2 0x300b +#define MASK_CUSTOM0_RS1_RS2 0x707f +#define MATCH_CUSTOM0_RD 0x400b +#define MASK_CUSTOM0_RD 0x707f +#define MATCH_CUSTOM0_RD_RS1 0x600b +#define MASK_CUSTOM0_RD_RS1 0x707f +#define MATCH_CUSTOM0_RD_RS1_RS2 0x700b +#define MASK_CUSTOM0_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM1 0x2b +#define MASK_CUSTOM1 0x707f +#define MATCH_CUSTOM1_RS1 0x202b +#define MASK_CUSTOM1_RS1 0x707f +#define MATCH_CUSTOM1_RS1_RS2 0x302b +#define MASK_CUSTOM1_RS1_RS2 0x707f +#define MATCH_CUSTOM1_RD 0x402b +#define MASK_CUSTOM1_RD 0x707f +#define MATCH_CUSTOM1_RD_RS1 0x602b +#define MASK_CUSTOM1_RD_RS1 0x707f +#define MATCH_CUSTOM1_RD_RS1_RS2 0x702b +#define MASK_CUSTOM1_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM2 0x5b +#define MASK_CUSTOM2 0x707f +#define MATCH_CUSTOM2_RS1 0x205b +#define MASK_CUSTOM2_RS1 0x707f +#define MATCH_CUSTOM2_RS1_RS2 0x305b +#define MASK_CUSTOM2_RS1_RS2 0x707f +#define MATCH_CUSTOM2_RD 0x405b +#define MASK_CUSTOM2_RD 0x707f +#define MATCH_CUSTOM2_RD_RS1 0x605b +#define MASK_CUSTOM2_RD_RS1 0x707f +#define MATCH_CUSTOM2_RD_RS1_RS2 0x705b +#define MASK_CUSTOM2_RD_RS1_RS2 0x707f +#define MATCH_CUSTOM3 0x7b +#define MASK_CUSTOM3 0x707f +#define MATCH_CUSTOM3_RS1 0x207b +#define MASK_CUSTOM3_RS1 0x707f +#define MATCH_CUSTOM3_RS1_RS2 0x307b +#define MASK_CUSTOM3_RS1_RS2 0x707f +#define MATCH_CUSTOM3_RD 0x407b +#define MASK_CUSTOM3_RD 0x707f +#define MATCH_CUSTOM3_RD_RS1 0x607b +#define MASK_CUSTOM3_RD_RS1 0x707f +#define MATCH_CUSTOM3_RD_RS1_RS2 0x707b +#define MASK_CUSTOM3_RD_RS1_RS2 0x707f +#define CSR_FFLAGS 0x1 +#define CSR_FRM 0x2 +#define CSR_FCSR 0x3 +#define CSR_CYCLE 0xc00 +#define CSR_TIME 0xc01 +#define CSR_INSTRET 0xc02 +#define CSR_HPMCOUNTER3 0xc03 +#define CSR_HPMCOUNTER4 0xc04 +#define CSR_HPMCOUNTER5 0xc05 +#define CSR_HPMCOUNTER6 0xc06 +#define CSR_HPMCOUNTER7 0xc07 +#define CSR_HPMCOUNTER8 0xc08 +#define CSR_HPMCOUNTER9 0xc09 +#define CSR_HPMCOUNTER10 0xc0a +#define CSR_HPMCOUNTER11 0xc0b +#define CSR_HPMCOUNTER12 0xc0c +#define CSR_HPMCOUNTER13 0xc0d +#define CSR_HPMCOUNTER14 0xc0e +#define CSR_HPMCOUNTER15 0xc0f +#define CSR_HPMCOUNTER16 0xc10 +#define CSR_HPMCOUNTER17 0xc11 +#define CSR_HPMCOUNTER18 0xc12 +#define CSR_HPMCOUNTER19 0xc13 +#define CSR_HPMCOUNTER20 0xc14 +#define CSR_HPMCOUNTER21 0xc15 +#define CSR_HPMCOUNTER22 0xc16 +#define CSR_HPMCOUNTER23 0xc17 +#define CSR_HPMCOUNTER24 0xc18 +#define CSR_HPMCOUNTER25 0xc19 +#define CSR_HPMCOUNTER26 0xc1a +#define CSR_HPMCOUNTER27 0xc1b +#define CSR_HPMCOUNTER28 0xc1c +#define CSR_HPMCOUNTER29 0xc1d +#define CSR_HPMCOUNTER30 0xc1e +#define CSR_HPMCOUNTER31 0xc1f +#define CSR_SSTATUS 0x100 +#define CSR_SIE 0x104 +#define CSR_STVEC 0x105 +#define CSR_SSCRATCH 0x140 +#define CSR_SEPC 0x141 +#define CSR_SCAUSE 0x142 +#define CSR_SBADADDR 0x143 +#define CSR_SIP 0x144 +#define CSR_SPTBR 0x180 +#define CSR_MSTATUS 0x300 +#define CSR_MISA 0x301 +#define CSR_MEDELEG 0x302 +#define CSR_MIDELEG 0x303 +#define CSR_MIE 0x304 +#define CSR_MTVEC 0x305 +#define CSR_MCOUNTEREN 0x306 +#define CSR_MSCRATCH 0x340 +#define CSR_MEPC 0x341 +#define CSR_MCAUSE 0x342 +#define CSR_MBADADDR 0x343 +#define CSR_MIP 0x344 +#define CSR_TSELECT 0x7a0 +#define CSR_TDATA1 0x7a1 +#define CSR_TDATA2 0x7a2 +#define CSR_TDATA3 0x7a3 +#define CSR_DCSR 0x7b0 +#define CSR_DPC 0x7b1 +#define CSR_DSCRATCH 0x7b2 +#define CSR_MCYCLE 0xb00 +#define CSR_MINSTRET 0xb02 +#define CSR_MHPMCOUNTER3 0xb03 +#define CSR_MHPMCOUNTER4 0xb04 +#define CSR_MHPMCOUNTER5 0xb05 +#define CSR_MHPMCOUNTER6 0xb06 +#define CSR_MHPMCOUNTER7 0xb07 +#define CSR_MHPMCOUNTER8 0xb08 +#define CSR_MHPMCOUNTER9 0xb09 +#define CSR_MHPMCOUNTER10 0xb0a +#define CSR_MHPMCOUNTER11 0xb0b +#define CSR_MHPMCOUNTER12 0xb0c +#define CSR_MHPMCOUNTER13 0xb0d +#define CSR_MHPMCOUNTER14 0xb0e +#define CSR_MHPMCOUNTER15 0xb0f +#define CSR_MHPMCOUNTER16 0xb10 +#define CSR_MHPMCOUNTER17 0xb11 +#define CSR_MHPMCOUNTER18 0xb12 +#define CSR_MHPMCOUNTER19 0xb13 +#define CSR_MHPMCOUNTER20 0xb14 +#define CSR_MHPMCOUNTER21 0xb15 +#define CSR_MHPMCOUNTER22 0xb16 +#define CSR_MHPMCOUNTER23 0xb17 +#define CSR_MHPMCOUNTER24 0xb18 +#define CSR_MHPMCOUNTER25 0xb19 +#define CSR_MHPMCOUNTER26 0xb1a +#define CSR_MHPMCOUNTER27 0xb1b +#define CSR_MHPMCOUNTER28 0xb1c +#define CSR_MHPMCOUNTER29 0xb1d +#define CSR_MHPMCOUNTER30 0xb1e +#define CSR_MHPMCOUNTER31 0xb1f +#define CSR_MUCOUNTEREN 0x320 +#define CSR_MSCOUNTEREN 0x321 +#define CSR_MHPMEVENT3 0x323 +#define CSR_MHPMEVENT4 0x324 +#define CSR_MHPMEVENT5 0x325 +#define CSR_MHPMEVENT6 0x326 +#define CSR_MHPMEVENT7 0x327 +#define CSR_MHPMEVENT8 0x328 +#define CSR_MHPMEVENT9 0x329 +#define CSR_MHPMEVENT10 0x32a +#define CSR_MHPMEVENT11 0x32b +#define CSR_MHPMEVENT12 0x32c +#define CSR_MHPMEVENT13 0x32d +#define CSR_MHPMEVENT14 0x32e +#define CSR_MHPMEVENT15 0x32f +#define CSR_MHPMEVENT16 0x330 +#define CSR_MHPMEVENT17 0x331 +#define CSR_MHPMEVENT18 0x332 +#define CSR_MHPMEVENT19 0x333 +#define CSR_MHPMEVENT20 0x334 +#define CSR_MHPMEVENT21 0x335 +#define CSR_MHPMEVENT22 0x336 +#define CSR_MHPMEVENT23 0x337 +#define CSR_MHPMEVENT24 0x338 +#define CSR_MHPMEVENT25 0x339 +#define CSR_MHPMEVENT26 0x33a +#define CSR_MHPMEVENT27 0x33b +#define CSR_MHPMEVENT28 0x33c +#define CSR_MHPMEVENT29 0x33d +#define CSR_MHPMEVENT30 0x33e +#define CSR_MHPMEVENT31 0x33f +#define CSR_MVENDORID 0xf11 +#define CSR_MARCHID 0xf12 +#define CSR_MIMPID 0xf13 +#define CSR_MHARTID 0xf14 +#define CSR_CYCLEH 0xc80 +#define CSR_TIMEH 0xc81 +#define CSR_INSTRETH 0xc82 +#define CSR_HPMCOUNTER3H 0xc83 +#define CSR_HPMCOUNTER4H 0xc84 +#define CSR_HPMCOUNTER5H 0xc85 +#define CSR_HPMCOUNTER6H 0xc86 +#define CSR_HPMCOUNTER7H 0xc87 +#define CSR_HPMCOUNTER8H 0xc88 +#define CSR_HPMCOUNTER9H 0xc89 +#define CSR_HPMCOUNTER10H 0xc8a +#define CSR_HPMCOUNTER11H 0xc8b +#define CSR_HPMCOUNTER12H 0xc8c +#define CSR_HPMCOUNTER13H 0xc8d +#define CSR_HPMCOUNTER14H 0xc8e +#define CSR_HPMCOUNTER15H 0xc8f +#define CSR_HPMCOUNTER16H 0xc90 +#define CSR_HPMCOUNTER17H 0xc91 +#define CSR_HPMCOUNTER18H 0xc92 +#define CSR_HPMCOUNTER19H 0xc93 +#define CSR_HPMCOUNTER20H 0xc94 +#define CSR_HPMCOUNTER21H 0xc95 +#define CSR_HPMCOUNTER22H 0xc96 +#define CSR_HPMCOUNTER23H 0xc97 +#define CSR_HPMCOUNTER24H 0xc98 +#define CSR_HPMCOUNTER25H 0xc99 +#define CSR_HPMCOUNTER26H 0xc9a +#define CSR_HPMCOUNTER27H 0xc9b +#define CSR_HPMCOUNTER28H 0xc9c +#define CSR_HPMCOUNTER29H 0xc9d +#define CSR_HPMCOUNTER30H 0xc9e +#define CSR_HPMCOUNTER31H 0xc9f +#define CSR_MCYCLEH 0xb80 +#define CSR_MINSTRETH 0xb82 +#define CSR_MHPMCOUNTER3H 0xb83 +#define CSR_MHPMCOUNTER4H 0xb84 +#define CSR_MHPMCOUNTER5H 0xb85 +#define CSR_MHPMCOUNTER6H 0xb86 +#define CSR_MHPMCOUNTER7H 0xb87 +#define CSR_MHPMCOUNTER8H 0xb88 +#define CSR_MHPMCOUNTER9H 0xb89 +#define CSR_MHPMCOUNTER10H 0xb8a +#define CSR_MHPMCOUNTER11H 0xb8b +#define CSR_MHPMCOUNTER12H 0xb8c +#define CSR_MHPMCOUNTER13H 0xb8d +#define CSR_MHPMCOUNTER14H 0xb8e +#define CSR_MHPMCOUNTER15H 0xb8f +#define CSR_MHPMCOUNTER16H 0xb90 +#define CSR_MHPMCOUNTER17H 0xb91 +#define CSR_MHPMCOUNTER18H 0xb92 +#define CSR_MHPMCOUNTER19H 0xb93 +#define CSR_MHPMCOUNTER20H 0xb94 +#define CSR_MHPMCOUNTER21H 0xb95 +#define CSR_MHPMCOUNTER22H 0xb96 +#define CSR_MHPMCOUNTER23H 0xb97 +#define CSR_MHPMCOUNTER24H 0xb98 +#define CSR_MHPMCOUNTER25H 0xb99 +#define CSR_MHPMCOUNTER26H 0xb9a +#define CSR_MHPMCOUNTER27H 0xb9b +#define CSR_MHPMCOUNTER28H 0xb9c +#define CSR_MHPMCOUNTER29H 0xb9d +#define CSR_MHPMCOUNTER30H 0xb9e +#define CSR_MHPMCOUNTER31H 0xb9f + + +#define CSR_MTVT 0x307 +#define CSR_MNXTI 0x345 + +#define CSR_MCOUNTINHIBIT 0x320 + +#define CSR_MNVEC 0x7C3 + +#define CSR_MTVT2 0x7EC +#define CSR_JALMNXTI 0x7ED +#define CSR_PUSHMCAUSE 0x7EE +#define CSR_PUSHMEPC 0x7EF +#define CSR_PUSHMSUBM 0x7EB + +#define CSR_WFE 0x810 +#define CSR_SLEEPVALUE 0x811 +#define CSR_TXEVT 0x812 + +#define CSR_MMISC_CTL 0x7d0 +#define CSR_MSUBM 0x7c4 + + +#define CAUSE_MISALIGNED_FETCH 0x0 +#define CAUSE_FAULT_FETCH 0x1 +#define CAUSE_ILLEGAL_INSTRUCTION 0x2 +#define CAUSE_BREAKPOINT 0x3 +#define CAUSE_MISALIGNED_LOAD 0x4 +#define CAUSE_FAULT_LOAD 0x5 +#define CAUSE_MISALIGNED_STORE 0x6 +#define CAUSE_FAULT_STORE 0x7 +#define CAUSE_USER_ECALL 0x8 +#define CAUSE_SUPERVISOR_ECALL 0x9 +#define CAUSE_HYPERVISOR_ECALL 0xa +#define CAUSE_MACHINE_ECALL 0xb +#endif +#ifdef DECLARE_INSN +DECLARE_INSN(beq, MATCH_BEQ, MASK_BEQ) +DECLARE_INSN(bne, MATCH_BNE, MASK_BNE) +DECLARE_INSN(blt, MATCH_BLT, MASK_BLT) +DECLARE_INSN(bge, MATCH_BGE, MASK_BGE) +DECLARE_INSN(bltu, MATCH_BLTU, MASK_BLTU) +DECLARE_INSN(bgeu, MATCH_BGEU, MASK_BGEU) +DECLARE_INSN(jalr, MATCH_JALR, MASK_JALR) +DECLARE_INSN(jal, MATCH_JAL, MASK_JAL) +DECLARE_INSN(lui, MATCH_LUI, MASK_LUI) +DECLARE_INSN(auipc, MATCH_AUIPC, MASK_AUIPC) +DECLARE_INSN(addi, MATCH_ADDI, MASK_ADDI) +DECLARE_INSN(slli, MATCH_SLLI, MASK_SLLI) +DECLARE_INSN(slti, MATCH_SLTI, MASK_SLTI) +DECLARE_INSN(sltiu, MATCH_SLTIU, MASK_SLTIU) +DECLARE_INSN(xori, MATCH_XORI, MASK_XORI) +DECLARE_INSN(srli, MATCH_SRLI, MASK_SRLI) +DECLARE_INSN(srai, MATCH_SRAI, MASK_SRAI) +DECLARE_INSN(ori, MATCH_ORI, MASK_ORI) +DECLARE_INSN(andi, MATCH_ANDI, MASK_ANDI) +DECLARE_INSN(add, MATCH_ADD, MASK_ADD) +DECLARE_INSN(sub, MATCH_SUB, MASK_SUB) +DECLARE_INSN(sll, MATCH_SLL, MASK_SLL) +DECLARE_INSN(slt, MATCH_SLT, MASK_SLT) +DECLARE_INSN(sltu, MATCH_SLTU, MASK_SLTU) +DECLARE_INSN(xor, MATCH_XOR, MASK_XOR) +DECLARE_INSN(srl, MATCH_SRL, MASK_SRL) +DECLARE_INSN(sra, MATCH_SRA, MASK_SRA) +DECLARE_INSN(or, MATCH_OR, MASK_OR) +DECLARE_INSN(and, MATCH_AND, MASK_AND) +DECLARE_INSN(addiw, MATCH_ADDIW, MASK_ADDIW) +DECLARE_INSN(slliw, MATCH_SLLIW, MASK_SLLIW) +DECLARE_INSN(srliw, MATCH_SRLIW, MASK_SRLIW) +DECLARE_INSN(sraiw, MATCH_SRAIW, MASK_SRAIW) +DECLARE_INSN(addw, MATCH_ADDW, MASK_ADDW) +DECLARE_INSN(subw, MATCH_SUBW, MASK_SUBW) +DECLARE_INSN(sllw, MATCH_SLLW, MASK_SLLW) +DECLARE_INSN(srlw, MATCH_SRLW, MASK_SRLW) +DECLARE_INSN(sraw, MATCH_SRAW, MASK_SRAW) +DECLARE_INSN(lb, MATCH_LB, MASK_LB) +DECLARE_INSN(lh, MATCH_LH, MASK_LH) +DECLARE_INSN(lw, MATCH_LW, MASK_LW) +DECLARE_INSN(ld, MATCH_LD, MASK_LD) +DECLARE_INSN(lbu, MATCH_LBU, MASK_LBU) +DECLARE_INSN(lhu, MATCH_LHU, MASK_LHU) +DECLARE_INSN(lwu, MATCH_LWU, MASK_LWU) +DECLARE_INSN(sb, MATCH_SB, MASK_SB) +DECLARE_INSN(sh, MATCH_SH, MASK_SH) +DECLARE_INSN(sw, MATCH_SW, MASK_SW) +DECLARE_INSN(sd, MATCH_SD, MASK_SD) +DECLARE_INSN(fence, MATCH_FENCE, MASK_FENCE) +DECLARE_INSN(fence_i, MATCH_FENCE_I, MASK_FENCE_I) +DECLARE_INSN(mul, MATCH_MUL, MASK_MUL) +DECLARE_INSN(mulh, MATCH_MULH, MASK_MULH) +DECLARE_INSN(mulhsu, MATCH_MULHSU, MASK_MULHSU) +DECLARE_INSN(mulhu, MATCH_MULHU, MASK_MULHU) +DECLARE_INSN(div, MATCH_DIV, MASK_DIV) +DECLARE_INSN(divu, MATCH_DIVU, MASK_DIVU) +DECLARE_INSN(rem, MATCH_REM, MASK_REM) +DECLARE_INSN(remu, MATCH_REMU, MASK_REMU) +DECLARE_INSN(mulw, MATCH_MULW, MASK_MULW) +DECLARE_INSN(divw, MATCH_DIVW, MASK_DIVW) +DECLARE_INSN(divuw, MATCH_DIVUW, MASK_DIVUW) +DECLARE_INSN(remw, MATCH_REMW, MASK_REMW) +DECLARE_INSN(remuw, MATCH_REMUW, MASK_REMUW) +DECLARE_INSN(amoadd_w, MATCH_AMOADD_W, MASK_AMOADD_W) +DECLARE_INSN(amoxor_w, MATCH_AMOXOR_W, MASK_AMOXOR_W) +DECLARE_INSN(amoor_w, MATCH_AMOOR_W, MASK_AMOOR_W) +DECLARE_INSN(amoand_w, MATCH_AMOAND_W, MASK_AMOAND_W) +DECLARE_INSN(amomin_w, MATCH_AMOMIN_W, MASK_AMOMIN_W) +DECLARE_INSN(amomax_w, MATCH_AMOMAX_W, MASK_AMOMAX_W) +DECLARE_INSN(amominu_w, MATCH_AMOMINU_W, MASK_AMOMINU_W) +DECLARE_INSN(amomaxu_w, MATCH_AMOMAXU_W, MASK_AMOMAXU_W) +DECLARE_INSN(amoswap_w, MATCH_AMOSWAP_W, MASK_AMOSWAP_W) +DECLARE_INSN(lr_w, MATCH_LR_W, MASK_LR_W) +DECLARE_INSN(sc_w, MATCH_SC_W, MASK_SC_W) +DECLARE_INSN(amoadd_d, MATCH_AMOADD_D, MASK_AMOADD_D) +DECLARE_INSN(amoxor_d, MATCH_AMOXOR_D, MASK_AMOXOR_D) +DECLARE_INSN(amoor_d, MATCH_AMOOR_D, MASK_AMOOR_D) +DECLARE_INSN(amoand_d, MATCH_AMOAND_D, MASK_AMOAND_D) +DECLARE_INSN(amomin_d, MATCH_AMOMIN_D, MASK_AMOMIN_D) +DECLARE_INSN(amomax_d, MATCH_AMOMAX_D, MASK_AMOMAX_D) +DECLARE_INSN(amominu_d, MATCH_AMOMINU_D, MASK_AMOMINU_D) +DECLARE_INSN(amomaxu_d, MATCH_AMOMAXU_D, MASK_AMOMAXU_D) +DECLARE_INSN(amoswap_d, MATCH_AMOSWAP_D, MASK_AMOSWAP_D) +DECLARE_INSN(lr_d, MATCH_LR_D, MASK_LR_D) +DECLARE_INSN(sc_d, MATCH_SC_D, MASK_SC_D) +DECLARE_INSN(ecall, MATCH_ECALL, MASK_ECALL) +DECLARE_INSN(ebreak, MATCH_EBREAK, MASK_EBREAK) +DECLARE_INSN(uret, MATCH_URET, MASK_URET) +DECLARE_INSN(sret, MATCH_SRET, MASK_SRET) +DECLARE_INSN(hret, MATCH_HRET, MASK_HRET) +DECLARE_INSN(mret, MATCH_MRET, MASK_MRET) +DECLARE_INSN(dret, MATCH_DRET, MASK_DRET) +DECLARE_INSN(sfence_vm, MATCH_SFENCE_VM, MASK_SFENCE_VM) +DECLARE_INSN(wfi, MATCH_WFI, MASK_WFI) +DECLARE_INSN(csrrw, MATCH_CSRRW, MASK_CSRRW) +DECLARE_INSN(csrrs, MATCH_CSRRS, MASK_CSRRS) +DECLARE_INSN(csrrc, MATCH_CSRRC, MASK_CSRRC) +DECLARE_INSN(csrrwi, MATCH_CSRRWI, MASK_CSRRWI) +DECLARE_INSN(csrrsi, MATCH_CSRRSI, MASK_CSRRSI) +DECLARE_INSN(csrrci, MATCH_CSRRCI, MASK_CSRRCI) +DECLARE_INSN(fadd_s, MATCH_FADD_S, MASK_FADD_S) +DECLARE_INSN(fsub_s, MATCH_FSUB_S, MASK_FSUB_S) +DECLARE_INSN(fmul_s, MATCH_FMUL_S, MASK_FMUL_S) +DECLARE_INSN(fdiv_s, MATCH_FDIV_S, MASK_FDIV_S) +DECLARE_INSN(fsgnj_s, MATCH_FSGNJ_S, MASK_FSGNJ_S) +DECLARE_INSN(fsgnjn_s, MATCH_FSGNJN_S, MASK_FSGNJN_S) +DECLARE_INSN(fsgnjx_s, MATCH_FSGNJX_S, MASK_FSGNJX_S) +DECLARE_INSN(fmin_s, MATCH_FMIN_S, MASK_FMIN_S) +DECLARE_INSN(fmax_s, MATCH_FMAX_S, MASK_FMAX_S) +DECLARE_INSN(fsqrt_s, MATCH_FSQRT_S, MASK_FSQRT_S) +DECLARE_INSN(fadd_d, MATCH_FADD_D, MASK_FADD_D) +DECLARE_INSN(fsub_d, MATCH_FSUB_D, MASK_FSUB_D) +DECLARE_INSN(fmul_d, MATCH_FMUL_D, MASK_FMUL_D) +DECLARE_INSN(fdiv_d, MATCH_FDIV_D, MASK_FDIV_D) +DECLARE_INSN(fsgnj_d, MATCH_FSGNJ_D, MASK_FSGNJ_D) +DECLARE_INSN(fsgnjn_d, MATCH_FSGNJN_D, MASK_FSGNJN_D) +DECLARE_INSN(fsgnjx_d, MATCH_FSGNJX_D, MASK_FSGNJX_D) +DECLARE_INSN(fmin_d, MATCH_FMIN_D, MASK_FMIN_D) +DECLARE_INSN(fmax_d, MATCH_FMAX_D, MASK_FMAX_D) +DECLARE_INSN(fcvt_s_d, MATCH_FCVT_S_D, MASK_FCVT_S_D) +DECLARE_INSN(fcvt_d_s, MATCH_FCVT_D_S, MASK_FCVT_D_S) +DECLARE_INSN(fsqrt_d, MATCH_FSQRT_D, MASK_FSQRT_D) +DECLARE_INSN(fle_s, MATCH_FLE_S, MASK_FLE_S) +DECLARE_INSN(flt_s, MATCH_FLT_S, MASK_FLT_S) +DECLARE_INSN(feq_s, MATCH_FEQ_S, MASK_FEQ_S) +DECLARE_INSN(fle_d, MATCH_FLE_D, MASK_FLE_D) +DECLARE_INSN(flt_d, MATCH_FLT_D, MASK_FLT_D) +DECLARE_INSN(feq_d, MATCH_FEQ_D, MASK_FEQ_D) +DECLARE_INSN(fcvt_w_s, MATCH_FCVT_W_S, MASK_FCVT_W_S) +DECLARE_INSN(fcvt_wu_s, MATCH_FCVT_WU_S, MASK_FCVT_WU_S) +DECLARE_INSN(fcvt_l_s, MATCH_FCVT_L_S, MASK_FCVT_L_S) +DECLARE_INSN(fcvt_lu_s, MATCH_FCVT_LU_S, MASK_FCVT_LU_S) +DECLARE_INSN(fmv_x_s, MATCH_FMV_X_S, MASK_FMV_X_S) +DECLARE_INSN(fclass_s, MATCH_FCLASS_S, MASK_FCLASS_S) +DECLARE_INSN(fcvt_w_d, MATCH_FCVT_W_D, MASK_FCVT_W_D) +DECLARE_INSN(fcvt_wu_d, MATCH_FCVT_WU_D, MASK_FCVT_WU_D) +DECLARE_INSN(fcvt_l_d, MATCH_FCVT_L_D, MASK_FCVT_L_D) +DECLARE_INSN(fcvt_lu_d, MATCH_FCVT_LU_D, MASK_FCVT_LU_D) +DECLARE_INSN(fmv_x_d, MATCH_FMV_X_D, MASK_FMV_X_D) +DECLARE_INSN(fclass_d, MATCH_FCLASS_D, MASK_FCLASS_D) +DECLARE_INSN(fcvt_s_w, MATCH_FCVT_S_W, MASK_FCVT_S_W) +DECLARE_INSN(fcvt_s_wu, MATCH_FCVT_S_WU, MASK_FCVT_S_WU) +DECLARE_INSN(fcvt_s_l, MATCH_FCVT_S_L, MASK_FCVT_S_L) +DECLARE_INSN(fcvt_s_lu, MATCH_FCVT_S_LU, MASK_FCVT_S_LU) +DECLARE_INSN(fmv_s_x, MATCH_FMV_S_X, MASK_FMV_S_X) +DECLARE_INSN(fcvt_d_w, MATCH_FCVT_D_W, MASK_FCVT_D_W) +DECLARE_INSN(fcvt_d_wu, MATCH_FCVT_D_WU, MASK_FCVT_D_WU) +DECLARE_INSN(fcvt_d_l, MATCH_FCVT_D_L, MASK_FCVT_D_L) +DECLARE_INSN(fcvt_d_lu, MATCH_FCVT_D_LU, MASK_FCVT_D_LU) +DECLARE_INSN(fmv_d_x, MATCH_FMV_D_X, MASK_FMV_D_X) +DECLARE_INSN(flw, MATCH_FLW, MASK_FLW) +DECLARE_INSN(fld, MATCH_FLD, MASK_FLD) +DECLARE_INSN(fsw, MATCH_FSW, MASK_FSW) +DECLARE_INSN(fsd, MATCH_FSD, MASK_FSD) +DECLARE_INSN(fmadd_s, MATCH_FMADD_S, MASK_FMADD_S) +DECLARE_INSN(fmsub_s, MATCH_FMSUB_S, MASK_FMSUB_S) +DECLARE_INSN(fnmsub_s, MATCH_FNMSUB_S, MASK_FNMSUB_S) +DECLARE_INSN(fnmadd_s, MATCH_FNMADD_S, MASK_FNMADD_S) +DECLARE_INSN(fmadd_d, MATCH_FMADD_D, MASK_FMADD_D) +DECLARE_INSN(fmsub_d, MATCH_FMSUB_D, MASK_FMSUB_D) +DECLARE_INSN(fnmsub_d, MATCH_FNMSUB_D, MASK_FNMSUB_D) +DECLARE_INSN(fnmadd_d, MATCH_FNMADD_D, MASK_FNMADD_D) +DECLARE_INSN(c_nop, MATCH_C_NOP, MASK_C_NOP) +DECLARE_INSN(c_addi16sp, MATCH_C_ADDI16SP, MASK_C_ADDI16SP) +DECLARE_INSN(c_jr, MATCH_C_JR, MASK_C_JR) +DECLARE_INSN(c_jalr, MATCH_C_JALR, MASK_C_JALR) +DECLARE_INSN(c_ebreak, MATCH_C_EBREAK, MASK_C_EBREAK) +DECLARE_INSN(c_ld, MATCH_C_LD, MASK_C_LD) +DECLARE_INSN(c_sd, MATCH_C_SD, MASK_C_SD) +DECLARE_INSN(c_addiw, MATCH_C_ADDIW, MASK_C_ADDIW) +DECLARE_INSN(c_ldsp, MATCH_C_LDSP, MASK_C_LDSP) +DECLARE_INSN(c_sdsp, MATCH_C_SDSP, MASK_C_SDSP) +DECLARE_INSN(c_addi4spn, MATCH_C_ADDI4SPN, MASK_C_ADDI4SPN) +DECLARE_INSN(c_fld, MATCH_C_FLD, MASK_C_FLD) +DECLARE_INSN(c_lw, MATCH_C_LW, MASK_C_LW) +DECLARE_INSN(c_flw, MATCH_C_FLW, MASK_C_FLW) +DECLARE_INSN(c_fsd, MATCH_C_FSD, MASK_C_FSD) +DECLARE_INSN(c_sw, MATCH_C_SW, MASK_C_SW) +DECLARE_INSN(c_fsw, MATCH_C_FSW, MASK_C_FSW) +DECLARE_INSN(c_addi, MATCH_C_ADDI, MASK_C_ADDI) +DECLARE_INSN(c_jal, MATCH_C_JAL, MASK_C_JAL) +DECLARE_INSN(c_li, MATCH_C_LI, MASK_C_LI) +DECLARE_INSN(c_lui, MATCH_C_LUI, MASK_C_LUI) +DECLARE_INSN(c_srli, MATCH_C_SRLI, MASK_C_SRLI) +DECLARE_INSN(c_srai, MATCH_C_SRAI, MASK_C_SRAI) +DECLARE_INSN(c_andi, MATCH_C_ANDI, MASK_C_ANDI) +DECLARE_INSN(c_sub, MATCH_C_SUB, MASK_C_SUB) +DECLARE_INSN(c_xor, MATCH_C_XOR, MASK_C_XOR) +DECLARE_INSN(c_or, MATCH_C_OR, MASK_C_OR) +DECLARE_INSN(c_and, MATCH_C_AND, MASK_C_AND) +DECLARE_INSN(c_subw, MATCH_C_SUBW, MASK_C_SUBW) +DECLARE_INSN(c_addw, MATCH_C_ADDW, MASK_C_ADDW) +DECLARE_INSN(c_j, MATCH_C_J, MASK_C_J) +DECLARE_INSN(c_beqz, MATCH_C_BEQZ, MASK_C_BEQZ) +DECLARE_INSN(c_bnez, MATCH_C_BNEZ, MASK_C_BNEZ) +DECLARE_INSN(c_slli, MATCH_C_SLLI, MASK_C_SLLI) +DECLARE_INSN(c_fldsp, MATCH_C_FLDSP, MASK_C_FLDSP) +DECLARE_INSN(c_lwsp, MATCH_C_LWSP, MASK_C_LWSP) +DECLARE_INSN(c_flwsp, MATCH_C_FLWSP, MASK_C_FLWSP) +DECLARE_INSN(c_mv, MATCH_C_MV, MASK_C_MV) +DECLARE_INSN(c_add, MATCH_C_ADD, MASK_C_ADD) +DECLARE_INSN(c_fsdsp, MATCH_C_FSDSP, MASK_C_FSDSP) +DECLARE_INSN(c_swsp, MATCH_C_SWSP, MASK_C_SWSP) +DECLARE_INSN(c_fswsp, MATCH_C_FSWSP, MASK_C_FSWSP) +DECLARE_INSN(custom0, MATCH_CUSTOM0, MASK_CUSTOM0) +DECLARE_INSN(custom0_rs1, MATCH_CUSTOM0_RS1, MASK_CUSTOM0_RS1) +DECLARE_INSN(custom0_rs1_rs2, MATCH_CUSTOM0_RS1_RS2, MASK_CUSTOM0_RS1_RS2) +DECLARE_INSN(custom0_rd, MATCH_CUSTOM0_RD, MASK_CUSTOM0_RD) +DECLARE_INSN(custom0_rd_rs1, MATCH_CUSTOM0_RD_RS1, MASK_CUSTOM0_RD_RS1) +DECLARE_INSN(custom0_rd_rs1_rs2, MATCH_CUSTOM0_RD_RS1_RS2, +MASK_CUSTOM0_RD_RS1_RS2) +DECLARE_INSN(custom1, MATCH_CUSTOM1, MASK_CUSTOM1) +DECLARE_INSN(custom1_rs1, MATCH_CUSTOM1_RS1, MASK_CUSTOM1_RS1) +DECLARE_INSN(custom1_rs1_rs2, MATCH_CUSTOM1_RS1_RS2, MASK_CUSTOM1_RS1_RS2) +DECLARE_INSN(custom1_rd, MATCH_CUSTOM1_RD, MASK_CUSTOM1_RD) +DECLARE_INSN(custom1_rd_rs1, MATCH_CUSTOM1_RD_RS1, MASK_CUSTOM1_RD_RS1) +DECLARE_INSN(custom1_rd_rs1_rs2, MATCH_CUSTOM1_RD_RS1_RS2, +MASK_CUSTOM1_RD_RS1_RS2) +DECLARE_INSN(custom2, MATCH_CUSTOM2, MASK_CUSTOM2) +DECLARE_INSN(custom2_rs1, MATCH_CUSTOM2_RS1, MASK_CUSTOM2_RS1) +DECLARE_INSN(custom2_rs1_rs2, MATCH_CUSTOM2_RS1_RS2, MASK_CUSTOM2_RS1_RS2) +DECLARE_INSN(custom2_rd, MATCH_CUSTOM2_RD, MASK_CUSTOM2_RD) +DECLARE_INSN(custom2_rd_rs1, MATCH_CUSTOM2_RD_RS1, MASK_CUSTOM2_RD_RS1) +DECLARE_INSN(custom2_rd_rs1_rs2, MATCH_CUSTOM2_RD_RS1_RS2, +MASK_CUSTOM2_RD_RS1_RS2) +DECLARE_INSN(custom3, MATCH_CUSTOM3, MASK_CUSTOM3) +DECLARE_INSN(custom3_rs1, MATCH_CUSTOM3_RS1, MASK_CUSTOM3_RS1) +DECLARE_INSN(custom3_rs1_rs2, MATCH_CUSTOM3_RS1_RS2, MASK_CUSTOM3_RS1_RS2) +DECLARE_INSN(custom3_rd, MATCH_CUSTOM3_RD, MASK_CUSTOM3_RD) +DECLARE_INSN(custom3_rd_rs1, MATCH_CUSTOM3_RD_RS1, MASK_CUSTOM3_RD_RS1) +DECLARE_INSN(custom3_rd_rs1_rs2, MATCH_CUSTOM3_RD_RS1_RS2, +MASK_CUSTOM3_RD_RS1_RS2) +#endif +#ifdef DECLARE_CSR +DECLARE_CSR(fflags, CSR_FFLAGS) +DECLARE_CSR(frm, CSR_FRM) +DECLARE_CSR(fcsr, CSR_FCSR) +DECLARE_CSR(cycle, CSR_CYCLE) +DECLARE_CSR(time, CSR_TIME) +DECLARE_CSR(instret, CSR_INSTRET) +DECLARE_CSR(hpmcounter3, CSR_HPMCOUNTER3) +DECLARE_CSR(hpmcounter4, CSR_HPMCOUNTER4) +DECLARE_CSR(hpmcounter5, CSR_HPMCOUNTER5) +DECLARE_CSR(hpmcounter6, CSR_HPMCOUNTER6) +DECLARE_CSR(hpmcounter7, CSR_HPMCOUNTER7) +DECLARE_CSR(hpmcounter8, CSR_HPMCOUNTER8) +DECLARE_CSR(hpmcounter9, CSR_HPMCOUNTER9) +DECLARE_CSR(hpmcounter10, CSR_HPMCOUNTER10) +DECLARE_CSR(hpmcounter11, CSR_HPMCOUNTER11) +DECLARE_CSR(hpmcounter12, CSR_HPMCOUNTER12) +DECLARE_CSR(hpmcounter13, CSR_HPMCOUNTER13) +DECLARE_CSR(hpmcounter14, CSR_HPMCOUNTER14) +DECLARE_CSR(hpmcounter15, CSR_HPMCOUNTER15) +DECLARE_CSR(hpmcounter16, CSR_HPMCOUNTER16) +DECLARE_CSR(hpmcounter17, CSR_HPMCOUNTER17) +DECLARE_CSR(hpmcounter18, CSR_HPMCOUNTER18) +DECLARE_CSR(hpmcounter19, CSR_HPMCOUNTER19) +DECLARE_CSR(hpmcounter20, CSR_HPMCOUNTER20) +DECLARE_CSR(hpmcounter21, CSR_HPMCOUNTER21) +DECLARE_CSR(hpmcounter22, CSR_HPMCOUNTER22) +DECLARE_CSR(hpmcounter23, CSR_HPMCOUNTER23) +DECLARE_CSR(hpmcounter24, CSR_HPMCOUNTER24) +DECLARE_CSR(hpmcounter25, CSR_HPMCOUNTER25) +DECLARE_CSR(hpmcounter26, CSR_HPMCOUNTER26) +DECLARE_CSR(hpmcounter27, CSR_HPMCOUNTER27) +DECLARE_CSR(hpmcounter28, CSR_HPMCOUNTER28) +DECLARE_CSR(hpmcounter29, CSR_HPMCOUNTER29) +DECLARE_CSR(hpmcounter30, CSR_HPMCOUNTER30) +DECLARE_CSR(hpmcounter31, CSR_HPMCOUNTER31) +DECLARE_CSR(sstatus, CSR_SSTATUS) +DECLARE_CSR(sie, CSR_SIE) +DECLARE_CSR(stvec, CSR_STVEC) +DECLARE_CSR(sscratch, CSR_SSCRATCH) +DECLARE_CSR(sepc, CSR_SEPC) +DECLARE_CSR(scause, CSR_SCAUSE) +DECLARE_CSR(sbadaddr, CSR_SBADADDR) +DECLARE_CSR(sip, CSR_SIP) +DECLARE_CSR(sptbr, CSR_SPTBR) +DECLARE_CSR(mstatus, CSR_MSTATUS) +DECLARE_CSR(misa, CSR_MISA) +DECLARE_CSR(medeleg, CSR_MEDELEG) +DECLARE_CSR(mideleg, CSR_MIDELEG) +DECLARE_CSR(mie, CSR_MIE) +DECLARE_CSR(mtvec, CSR_MTVEC) +DECLARE_CSR(mscratch, CSR_MSCRATCH) +DECLARE_CSR(mepc, CSR_MEPC) +DECLARE_CSR(mcause, CSR_MCAUSE) +DECLARE_CSR(mbadaddr, CSR_MBADADDR) +DECLARE_CSR(mip, CSR_MIP) +DECLARE_CSR(tselect, CSR_TSELECT) +DECLARE_CSR(tdata1, CSR_TDATA1) +DECLARE_CSR(tdata2, CSR_TDATA2) +DECLARE_CSR(tdata3, CSR_TDATA3) +DECLARE_CSR(dcsr, CSR_DCSR) +DECLARE_CSR(dpc, CSR_DPC) +DECLARE_CSR(dscratch, CSR_DSCRATCH) +DECLARE_CSR(mcycle, CSR_MCYCLE) +DECLARE_CSR(minstret, CSR_MINSTRET) +DECLARE_CSR(mhpmcounter3, CSR_MHPMCOUNTER3) +DECLARE_CSR(mhpmcounter4, CSR_MHPMCOUNTER4) +DECLARE_CSR(mhpmcounter5, CSR_MHPMCOUNTER5) +DECLARE_CSR(mhpmcounter6, CSR_MHPMCOUNTER6) +DECLARE_CSR(mhpmcounter7, CSR_MHPMCOUNTER7) +DECLARE_CSR(mhpmcounter8, CSR_MHPMCOUNTER8) +DECLARE_CSR(mhpmcounter9, CSR_MHPMCOUNTER9) +DECLARE_CSR(mhpmcounter10, CSR_MHPMCOUNTER10) +DECLARE_CSR(mhpmcounter11, CSR_MHPMCOUNTER11) +DECLARE_CSR(mhpmcounter12, CSR_MHPMCOUNTER12) +DECLARE_CSR(mhpmcounter13, CSR_MHPMCOUNTER13) +DECLARE_CSR(mhpmcounter14, CSR_MHPMCOUNTER14) +DECLARE_CSR(mhpmcounter15, CSR_MHPMCOUNTER15) +DECLARE_CSR(mhpmcounter16, CSR_MHPMCOUNTER16) +DECLARE_CSR(mhpmcounter17, CSR_MHPMCOUNTER17) +DECLARE_CSR(mhpmcounter18, CSR_MHPMCOUNTER18) +DECLARE_CSR(mhpmcounter19, CSR_MHPMCOUNTER19) +DECLARE_CSR(mhpmcounter20, CSR_MHPMCOUNTER20) +DECLARE_CSR(mhpmcounter21, CSR_MHPMCOUNTER21) +DECLARE_CSR(mhpmcounter22, CSR_MHPMCOUNTER22) +DECLARE_CSR(mhpmcounter23, CSR_MHPMCOUNTER23) +DECLARE_CSR(mhpmcounter24, CSR_MHPMCOUNTER24) +DECLARE_CSR(mhpmcounter25, CSR_MHPMCOUNTER25) +DECLARE_CSR(mhpmcounter26, CSR_MHPMCOUNTER26) +DECLARE_CSR(mhpmcounter27, CSR_MHPMCOUNTER27) +DECLARE_CSR(mhpmcounter28, CSR_MHPMCOUNTER28) +DECLARE_CSR(mhpmcounter29, CSR_MHPMCOUNTER29) +DECLARE_CSR(mhpmcounter30, CSR_MHPMCOUNTER30) +DECLARE_CSR(mhpmcounter31, CSR_MHPMCOUNTER31) +DECLARE_CSR(mucounteren, CSR_MUCOUNTEREN) +DECLARE_CSR(mscounteren, CSR_MSCOUNTEREN) +DECLARE_CSR(mhpmevent3, CSR_MHPMEVENT3) +DECLARE_CSR(mhpmevent4, CSR_MHPMEVENT4) +DECLARE_CSR(mhpmevent5, CSR_MHPMEVENT5) +DECLARE_CSR(mhpmevent6, CSR_MHPMEVENT6) +DECLARE_CSR(mhpmevent7, CSR_MHPMEVENT7) +DECLARE_CSR(mhpmevent8, CSR_MHPMEVENT8) +DECLARE_CSR(mhpmevent9, CSR_MHPMEVENT9) +DECLARE_CSR(mhpmevent10, CSR_MHPMEVENT10) +DECLARE_CSR(mhpmevent11, CSR_MHPMEVENT11) +DECLARE_CSR(mhpmevent12, CSR_MHPMEVENT12) +DECLARE_CSR(mhpmevent13, CSR_MHPMEVENT13) +DECLARE_CSR(mhpmevent14, CSR_MHPMEVENT14) +DECLARE_CSR(mhpmevent15, CSR_MHPMEVENT15) +DECLARE_CSR(mhpmevent16, CSR_MHPMEVENT16) +DECLARE_CSR(mhpmevent17, CSR_MHPMEVENT17) +DECLARE_CSR(mhpmevent18, CSR_MHPMEVENT18) +DECLARE_CSR(mhpmevent19, CSR_MHPMEVENT19) +DECLARE_CSR(mhpmevent20, CSR_MHPMEVENT20) +DECLARE_CSR(mhpmevent21, CSR_MHPMEVENT21) +DECLARE_CSR(mhpmevent22, CSR_MHPMEVENT22) +DECLARE_CSR(mhpmevent23, CSR_MHPMEVENT23) +DECLARE_CSR(mhpmevent24, CSR_MHPMEVENT24) +DECLARE_CSR(mhpmevent25, CSR_MHPMEVENT25) +DECLARE_CSR(mhpmevent26, CSR_MHPMEVENT26) +DECLARE_CSR(mhpmevent27, CSR_MHPMEVENT27) +DECLARE_CSR(mhpmevent28, CSR_MHPMEVENT28) +DECLARE_CSR(mhpmevent29, CSR_MHPMEVENT29) +DECLARE_CSR(mhpmevent30, CSR_MHPMEVENT30) +DECLARE_CSR(mhpmevent31, CSR_MHPMEVENT31) +DECLARE_CSR(mvendorid, CSR_MVENDORID) +DECLARE_CSR(marchid, CSR_MARCHID) +DECLARE_CSR(mimpid, CSR_MIMPID) +DECLARE_CSR(mhartid, CSR_MHARTID) +DECLARE_CSR(cycleh, CSR_CYCLEH) +DECLARE_CSR(timeh, CSR_TIMEH) +DECLARE_CSR(instreth, CSR_INSTRETH) +DECLARE_CSR(hpmcounter3h, CSR_HPMCOUNTER3H) +DECLARE_CSR(hpmcounter4h, CSR_HPMCOUNTER4H) +DECLARE_CSR(hpmcounter5h, CSR_HPMCOUNTER5H) +DECLARE_CSR(hpmcounter6h, CSR_HPMCOUNTER6H) +DECLARE_CSR(hpmcounter7h, CSR_HPMCOUNTER7H) +DECLARE_CSR(hpmcounter8h, CSR_HPMCOUNTER8H) +DECLARE_CSR(hpmcounter9h, CSR_HPMCOUNTER9H) +DECLARE_CSR(hpmcounter10h, CSR_HPMCOUNTER10H) +DECLARE_CSR(hpmcounter11h, CSR_HPMCOUNTER11H) +DECLARE_CSR(hpmcounter12h, CSR_HPMCOUNTER12H) +DECLARE_CSR(hpmcounter13h, CSR_HPMCOUNTER13H) +DECLARE_CSR(hpmcounter14h, CSR_HPMCOUNTER14H) +DECLARE_CSR(hpmcounter15h, CSR_HPMCOUNTER15H) +DECLARE_CSR(hpmcounter16h, CSR_HPMCOUNTER16H) +DECLARE_CSR(hpmcounter17h, CSR_HPMCOUNTER17H) +DECLARE_CSR(hpmcounter18h, CSR_HPMCOUNTER18H) +DECLARE_CSR(hpmcounter19h, CSR_HPMCOUNTER19H) +DECLARE_CSR(hpmcounter20h, CSR_HPMCOUNTER20H) +DECLARE_CSR(hpmcounter21h, CSR_HPMCOUNTER21H) +DECLARE_CSR(hpmcounter22h, CSR_HPMCOUNTER22H) +DECLARE_CSR(hpmcounter23h, CSR_HPMCOUNTER23H) +DECLARE_CSR(hpmcounter24h, CSR_HPMCOUNTER24H) +DECLARE_CSR(hpmcounter25h, CSR_HPMCOUNTER25H) +DECLARE_CSR(hpmcounter26h, CSR_HPMCOUNTER26H) +DECLARE_CSR(hpmcounter27h, CSR_HPMCOUNTER27H) +DECLARE_CSR(hpmcounter28h, CSR_HPMCOUNTER28H) +DECLARE_CSR(hpmcounter29h, CSR_HPMCOUNTER29H) +DECLARE_CSR(hpmcounter30h, CSR_HPMCOUNTER30H) +DECLARE_CSR(hpmcounter31h, CSR_HPMCOUNTER31H) +DECLARE_CSR(mcycleh, CSR_MCYCLEH) +DECLARE_CSR(minstreth, CSR_MINSTRETH) +DECLARE_CSR(mhpmcounter3h, CSR_MHPMCOUNTER3H) +DECLARE_CSR(mhpmcounter4h, CSR_MHPMCOUNTER4H) +DECLARE_CSR(mhpmcounter5h, CSR_MHPMCOUNTER5H) +DECLARE_CSR(mhpmcounter6h, CSR_MHPMCOUNTER6H) +DECLARE_CSR(mhpmcounter7h, CSR_MHPMCOUNTER7H) +DECLARE_CSR(mhpmcounter8h, CSR_MHPMCOUNTER8H) +DECLARE_CSR(mhpmcounter9h, CSR_MHPMCOUNTER9H) +DECLARE_CSR(mhpmcounter10h, CSR_MHPMCOUNTER10H) +DECLARE_CSR(mhpmcounter11h, CSR_MHPMCOUNTER11H) +DECLARE_CSR(mhpmcounter12h, CSR_MHPMCOUNTER12H) +DECLARE_CSR(mhpmcounter13h, CSR_MHPMCOUNTER13H) +DECLARE_CSR(mhpmcounter14h, CSR_MHPMCOUNTER14H) +DECLARE_CSR(mhpmcounter15h, CSR_MHPMCOUNTER15H) +DECLARE_CSR(mhpmcounter16h, CSR_MHPMCOUNTER16H) +DECLARE_CSR(mhpmcounter17h, CSR_MHPMCOUNTER17H) +DECLARE_CSR(mhpmcounter18h, CSR_MHPMCOUNTER18H) +DECLARE_CSR(mhpmcounter19h, CSR_MHPMCOUNTER19H) +DECLARE_CSR(mhpmcounter20h, CSR_MHPMCOUNTER20H) +DECLARE_CSR(mhpmcounter21h, CSR_MHPMCOUNTER21H) +DECLARE_CSR(mhpmcounter22h, CSR_MHPMCOUNTER22H) +DECLARE_CSR(mhpmcounter23h, CSR_MHPMCOUNTER23H) +DECLARE_CSR(mhpmcounter24h, CSR_MHPMCOUNTER24H) +DECLARE_CSR(mhpmcounter25h, CSR_MHPMCOUNTER25H) +DECLARE_CSR(mhpmcounter26h, CSR_MHPMCOUNTER26H) +DECLARE_CSR(mhpmcounter27h, CSR_MHPMCOUNTER27H) +DECLARE_CSR(mhpmcounter28h, CSR_MHPMCOUNTER28H) +DECLARE_CSR(mhpmcounter29h, CSR_MHPMCOUNTER29H) +DECLARE_CSR(mhpmcounter30h, CSR_MHPMCOUNTER30H) +DECLARE_CSR(mhpmcounter31h, CSR_MHPMCOUNTER31H) +#endif +#ifdef DECLARE_CAUSE +DECLARE_CAUSE("misaligned fetch", CAUSE_MISALIGNED_FETCH) +DECLARE_CAUSE("fault fetch", CAUSE_FAULT_FETCH) +DECLARE_CAUSE("illegal instruction", CAUSE_ILLEGAL_INSTRUCTION) +DECLARE_CAUSE("breakpoint", CAUSE_BREAKPOINT) +DECLARE_CAUSE("misaligned load", CAUSE_MISALIGNED_LOAD) +DECLARE_CAUSE("fault load", CAUSE_FAULT_LOAD) +DECLARE_CAUSE("misaligned store", CAUSE_MISALIGNED_STORE) +DECLARE_CAUSE("fault store", CAUSE_FAULT_STORE) +DECLARE_CAUSE("user_ecall", CAUSE_USER_ECALL) +DECLARE_CAUSE("supervisor_ecall", CAUSE_SUPERVISOR_ECALL) +DECLARE_CAUSE("hypervisor_ecall", CAUSE_HYPERVISOR_ECALL) +DECLARE_CAUSE("machine_ecall", CAUSE_MACHINE_ECALL) +#endif + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103x4.lds b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103x4.lds new file mode 100644 index 0000000..fc3d331 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103x4.lds @@ -0,0 +1,175 @@ +OUTPUT_ARCH( "riscv" ) + +ENTRY( _start ) + +MEMORY +{ + /* Run in FLASH */ + flash (rxai!w) : ORIGIN = 0x08000000, LENGTH = 16k + ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 6k + + /* Run in RAM */ +/* flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 4k + ram (wxa!ri) : ORIGIN = 0x20001000, LENGTH = 2K +*/ +} + + +SECTIONS +{ + __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; + + + .init : + { + KEEP (*(SORT_NONE(.init))) + } >flash AT>flash + + .ilalign : + { + . = ALIGN(4); + PROVIDE( _ilm_lma = . ); + } >flash AT>flash + + .ialign : + { + PROVIDE( _ilm = . ); + } >flash AT>flash + + .text : + { + *(.rodata .rodata.*) + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >flash AT>flash + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >flash AT>flash + + . = ALIGN(4); + + PROVIDE (__etext = .); + PROVIDE (_etext = .);/*0x80022c8*/ + PROVIDE (etext = .);/*0x80022c8*/ + PROVIDE( _eilm = . ); + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >flash AT>flash + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >flash AT>flash + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >flash AT>flash + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >flash AT>flash + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >flash AT>flash + + . = ALIGN(4); + PROVIDE( _eilm = . ); + + .lalign : + { + . = ALIGN(4); + PROVIDE( _data_lma = . ); + } >flash AT>flash + + .dalign : + { + . = ALIGN(4); + PROVIDE( _data = . ); + } >ram AT>flash + + + .data : + { + *(.rdata) + + *(.gnu.linkonce.r.*) + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram AT>flash + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + + PROVIDE( _fbss = . ); /*0X200052A0 0X200002A0*/ + PROVIDE( __bss_start = . ); + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram AT>ram + + . = ALIGN(8); + PROVIDE( _end = . ); /*0X2000,0340*/ + PROVIDE( end = . ); + + .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : + { + PROVIDE( _heap_end = . ); + . = __stack_size; + PROVIDE( _sp = . ); + } >ram AT>ram +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103x6.lds b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103x6.lds new file mode 100644 index 0000000..3cfe58a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103x6.lds @@ -0,0 +1,175 @@ +OUTPUT_ARCH( "riscv" ) + +ENTRY( _start ) + +MEMORY +{ + /* Run in FLASH */ + flash (rxai!w) : ORIGIN = 0x08000000, LENGTH = 32k + ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 10k + + /* Run in RAM */ +/* flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 7k + ram (wxa!ri) : ORIGIN = 0x20001C00, LENGTH = 3K +*/ +} + + +SECTIONS +{ + __stack_size = DEFINED(__stack_size) ? __stack_size : 1K; + + + .init : + { + KEEP (*(SORT_NONE(.init))) + } >flash AT>flash + + .ilalign : + { + . = ALIGN(4); + PROVIDE( _ilm_lma = . ); + } >flash AT>flash + + .ialign : + { + PROVIDE( _ilm = . ); + } >flash AT>flash + + .text : + { + *(.rodata .rodata.*) + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >flash AT>flash + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >flash AT>flash + + . = ALIGN(4); + + PROVIDE (__etext = .); + PROVIDE (_etext = .);/*0x80022c8*/ + PROVIDE (etext = .);/*0x80022c8*/ + PROVIDE( _eilm = . ); + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >flash AT>flash + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >flash AT>flash + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >flash AT>flash + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >flash AT>flash + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >flash AT>flash + + . = ALIGN(4); + PROVIDE( _eilm = . ); + + .lalign : + { + . = ALIGN(4); + PROVIDE( _data_lma = . ); + } >flash AT>flash + + .dalign : + { + . = ALIGN(4); + PROVIDE( _data = . ); + } >ram AT>flash + + + .data : + { + *(.rdata) + + *(.gnu.linkonce.r.*) + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram AT>flash + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + + PROVIDE( _fbss = . ); /*0X200052A0 0X200002A0*/ + PROVIDE( __bss_start = . ); + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram AT>ram + + . = ALIGN(8); + PROVIDE( _end = . ); /*0X2000,0340*/ + PROVIDE( end = . ); + + .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : + { + PROVIDE( _heap_end = . ); + . = __stack_size; + PROVIDE( _sp = . ); + } >ram AT>ram +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103x8.lds b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103x8.lds new file mode 100644 index 0000000..a10769d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103x8.lds @@ -0,0 +1,175 @@ +OUTPUT_ARCH( "riscv" ) + +ENTRY( _start ) + +MEMORY +{ + /* Run in FLASH */ + flash (rxai!w) : ORIGIN = 0x08000000, LENGTH = 64k + ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 20k + + /* Run in RAM */ +/* flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 15k + ram (wxa!ri) : ORIGIN = 0x20003C00, LENGTH = 5K +*/ +} + + +SECTIONS +{ + __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; + + + .init : + { + KEEP (*(SORT_NONE(.init))) + } >flash AT>flash + + .ilalign : + { + . = ALIGN(4); + PROVIDE( _ilm_lma = . ); + } >flash AT>flash + + .ialign : + { + PROVIDE( _ilm = . ); + } >flash AT>flash + + .text : + { + *(.rodata .rodata.*) + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >flash AT>flash + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >flash AT>flash + + . = ALIGN(4); + + PROVIDE (__etext = .); + PROVIDE (_etext = .);/*0x80022c8*/ + PROVIDE (etext = .);/*0x80022c8*/ + PROVIDE( _eilm = . ); + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >flash AT>flash + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >flash AT>flash + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >flash AT>flash + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >flash AT>flash + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >flash AT>flash + + . = ALIGN(4); + PROVIDE( _eilm = . ); + + .lalign : + { + . = ALIGN(4); + PROVIDE( _data_lma = . ); + } >flash AT>flash + + .dalign : + { + . = ALIGN(4); + PROVIDE( _data = . ); + } >ram AT>flash + + + .data : + { + *(.rdata) + + *(.gnu.linkonce.r.*) + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram AT>flash + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + + PROVIDE( _fbss = . ); /*0X200052A0 0X200002A0*/ + PROVIDE( __bss_start = . ); + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram AT>ram + + . = ALIGN(8); + PROVIDE( _end = . ); /*0X2000,0340*/ + PROVIDE( end = . ); + + .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : + { + PROVIDE( _heap_end = . ); + . = __stack_size; + PROVIDE( _sp = . ); + } >ram AT>ram +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds new file mode 100644 index 0000000..1c32e64 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds @@ -0,0 +1,175 @@ +OUTPUT_ARCH( "riscv" ) + +ENTRY( _start ) + +MEMORY +{ + /* Run in FLASH */ + flash (rxai!w) : ORIGIN = 0x08000000, LENGTH = 128k + ram (wxa!ri) : ORIGIN = 0x20000000, LENGTH = 32K + + /* Run in RAM */ +/* flash (rxai!w) : ORIGIN = 0x20000000, LENGTH = 24k + ram (wxa!ri) : ORIGIN = 0x20006000, LENGTH = 8K +*/ +} + + +SECTIONS +{ + __stack_size = DEFINED(__stack_size) ? __stack_size : 2K; + + + .init : + { + KEEP (*(SORT_NONE(.init))) + } >flash AT>flash + + .ilalign : + { + . = ALIGN(4); + PROVIDE( _ilm_lma = . ); + } >flash AT>flash + + .ialign : + { + PROVIDE( _ilm = . ); + } >flash AT>flash + + .text : + { + *(.rodata .rodata.*) + *(.text.unlikely .text.unlikely.*) + *(.text.startup .text.startup.*) + *(.text .text.*) + *(.gnu.linkonce.t.*) + } >flash AT>flash + + .fini : + { + KEEP (*(SORT_NONE(.fini))) + } >flash AT>flash + + . = ALIGN(4); + + PROVIDE (__etext = .); + PROVIDE (_etext = .);/*0x80022c8*/ + PROVIDE (etext = .);/*0x80022c8*/ + PROVIDE( _eilm = . ); + + .preinit_array : + { + PROVIDE_HIDDEN (__preinit_array_start = .); + KEEP (*(.preinit_array)) + PROVIDE_HIDDEN (__preinit_array_end = .); + } >flash AT>flash + + .init_array : + { + PROVIDE_HIDDEN (__init_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.init_array.*) SORT_BY_INIT_PRIORITY(.ctors.*))) + KEEP (*(.init_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .ctors)) + PROVIDE_HIDDEN (__init_array_end = .); + } >flash AT>flash + + .fini_array : + { + PROVIDE_HIDDEN (__fini_array_start = .); + KEEP (*(SORT_BY_INIT_PRIORITY(.fini_array.*) SORT_BY_INIT_PRIORITY(.dtors.*))) + KEEP (*(.fini_array EXCLUDE_FILE (*crtbegin.o *crtbegin?.o *crtend.o *crtend?.o ) .dtors)) + PROVIDE_HIDDEN (__fini_array_end = .); + } >flash AT>flash + + .ctors : + { + /* gcc uses crtbegin.o to find the start of + the constructors, so we make sure it is + first. Because this is a wildcard, it + doesn't matter if the user does not + actually link against crtbegin.o; the + linker won't look for a file to match a + wildcard. The wildcard also means that it + doesn't matter which directory crtbegin.o + is in. */ + KEEP (*crtbegin.o(.ctors)) + KEEP (*crtbegin?.o(.ctors)) + /* We don't want to include the .ctor section from + the crtend.o file until after the sorted ctors. + The .ctor section from the crtend file contains the + end of ctors marker and it must be last */ + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .ctors)) + KEEP (*(SORT(.ctors.*))) + KEEP (*(.ctors)) + } >flash AT>flash + + .dtors : + { + KEEP (*crtbegin.o(.dtors)) + KEEP (*crtbegin?.o(.dtors)) + KEEP (*(EXCLUDE_FILE (*crtend.o *crtend?.o ) .dtors)) + KEEP (*(SORT(.dtors.*))) + KEEP (*(.dtors)) + } >flash AT>flash + + . = ALIGN(4); + PROVIDE( _eilm = . ); + + .lalign : + { + . = ALIGN(4); + PROVIDE( _data_lma = . ); + } >flash AT>flash + + .dalign : + { + . = ALIGN(4); + PROVIDE( _data = . ); + } >ram AT>flash + + + .data : + { + *(.rdata) + + *(.gnu.linkonce.r.*) + *(.data .data.*) + *(.gnu.linkonce.d.*) + . = ALIGN(8); + PROVIDE( __global_pointer$ = . + 0x800); + *(.sdata .sdata.*) + *(.gnu.linkonce.s.*) + . = ALIGN(8); + *(.srodata.cst16) + *(.srodata.cst8) + *(.srodata.cst4) + *(.srodata.cst2) + *(.srodata .srodata.*) + } >ram AT>flash + + . = ALIGN(4); + PROVIDE( _edata = . ); + PROVIDE( edata = . ); + + PROVIDE( _fbss = . ); /*0X200052A0 0X200002A0*/ + PROVIDE( __bss_start = . ); + .bss : + { + *(.sbss*) + *(.gnu.linkonce.sb.*) + *(.bss .bss.*) + *(.gnu.linkonce.b.*) + *(COMMON) + . = ALIGN(4); + } >ram AT>ram + + . = ALIGN(8); + PROVIDE( _end = . ); /*0X2000,0340*/ + PROVIDE( end = . ); + + .stack ORIGIN(ram) + LENGTH(ram) - __stack_size : + { + PROVIDE( _heap_end = . ); + . = __stack_size; + PROVIDE( _sp = . ); + } >ram AT>ram +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/entry.S b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/entry.S new file mode 100644 index 0000000..a95f968 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/entry.S @@ -0,0 +1,286 @@ +// See LICENSE for license details + +#ifndef ENTRY_S +#define ENTRY_S + +#include "riscv_encoding.h" +#include "riscv_bits.h" +#include "n200_eclic.h" +#include "n200_timer.h" + +############################################### +############################################### +# Disable Interrupt +# +.macro DISABLE_MIE + csrc CSR_MSTATUS, MSTATUS_MIE +.endm + + +############################################### +############################################### +#Save caller registers +.macro SAVE_CONTEXT + +#ifdef __riscv_flen + #if (__riscv_flen==64 ) + addi sp, sp, -20*REGBYTES - 20*FPREGBYTES + #else + addi sp, sp, -20*REGBYTES + #endif +#else + addi sp, sp, -20*REGBYTES +#endif + STORE x1, 0*REGBYTES(sp) + STORE x4, 1*REGBYTES(sp) + STORE x5, 2*REGBYTES(sp) + STORE x6, 3*REGBYTES(sp) + STORE x7, 4*REGBYTES(sp) + STORE x10, 5*REGBYTES(sp) + STORE x11, 6*REGBYTES(sp) + STORE x12, 7*REGBYTES(sp) + STORE x13, 8*REGBYTES(sp) + STORE x14, 9*REGBYTES(sp) + STORE x15, 10*REGBYTES(sp) +#ifndef __riscv_32e + STORE x16, 11*REGBYTES(sp) + STORE x17, 12*REGBYTES(sp) + STORE x28, 13*REGBYTES(sp) + STORE x29, 14*REGBYTES(sp) + STORE x30, 15*REGBYTES(sp) + STORE x31, 16*REGBYTES(sp) +#endif + +#ifdef __riscv_flen + #if (__riscv_flen == 64) + FPSTORE f0, (20*REGBYTES + 0*FPREGBYTES)(sp) + FPSTORE f1, (20*REGBYTES + 1*FPREGBYTES)(sp) + FPSTORE f2, (20*REGBYTES + 2*FPREGBYTES)(sp) + FPSTORE f3, (20*REGBYTES + 3*FPREGBYTES)(sp) + FPSTORE f4, (20*REGBYTES + 4*FPREGBYTES)(sp) + FPSTORE f5, (20*REGBYTES + 5*FPREGBYTES)(sp) + FPSTORE f6, (20*REGBYTES + 6*FPREGBYTES)(sp) + FPSTORE f7, (20*REGBYTES + 7*FPREGBYTES)(sp) + FPSTORE f10, (20*REGBYTES + 8*FPREGBYTES)(sp) + FPSTORE f11, (20*REGBYTES + 9*FPREGBYTES)(sp) + FPSTORE f12, (20*REGBYTES + 10*FPREGBYTES)(sp) + FPSTORE f13, (20*REGBYTES + 11*FPREGBYTES)(sp) + FPSTORE f14, (20*REGBYTES + 12*FPREGBYTES)(sp) + FPSTORE f15, (20*REGBYTES + 13*FPREGBYTES)(sp) + FPSTORE f16, (20*REGBYTES + 14*FPREGBYTES)(sp) + FPSTORE f17, (20*REGBYTES + 15*FPREGBYTES)(sp) + FPSTORE f28, (20*REGBYTES + 16*FPREGBYTES)(sp) + FPSTORE f29, (20*REGBYTES + 17*FPREGBYTES)(sp) + FPSTORE f30, (20*REGBYTES + 18*FPREGBYTES)(sp) + FPSTORE f31, (20*REGBYTES + 19*FPREGBYTES)(sp) + #endif +#endif + + +.endm + + +############################################### +############################################### +#restore caller registers +.macro RESTORE_CONTEXT + LOAD x1, 0*REGBYTES(sp) + LOAD x4, 1*REGBYTES(sp) + LOAD x5, 2*REGBYTES(sp) + LOAD x6, 3*REGBYTES(sp) + LOAD x7, 4*REGBYTES(sp) + LOAD x10, 5*REGBYTES(sp) + LOAD x11, 6*REGBYTES(sp) + LOAD x12, 7*REGBYTES(sp) + LOAD x13, 8*REGBYTES(sp) + LOAD x14, 9*REGBYTES(sp) + LOAD x15, 10*REGBYTES(sp) +#ifndef __riscv_32e + LOAD x16, 11*REGBYTES(sp) + LOAD x17, 12*REGBYTES(sp) + LOAD x28, 13*REGBYTES(sp) + LOAD x29, 14*REGBYTES(sp) + LOAD x30, 15*REGBYTES(sp) + LOAD x31, 16*REGBYTES(sp) +#endif + + +#ifdef __riscv_flen + #if (__riscv_flen==64) +/* Restore fp caller registers */ + FPLOAD f0, (20*REGBYTES + 0*FPREGBYTES)(sp) + FPLOAD f1, (20*REGBYTES + 1*FPREGBYTES)(sp) + FPLOAD f2, (20*REGBYTES + 2*FPREGBYTES)(sp) + FPLOAD f3, (20*REGBYTES + 3*FPREGBYTES)(sp) + FPLOAD f4, (20*REGBYTES + 4*FPREGBYTES)(sp) + FPLOAD f5, (20*REGBYTES + 5*FPREGBYTES)(sp) + FPLOAD f6, (20*REGBYTES + 6*FPREGBYTES)(sp) + FPLOAD f7, (20*REGBYTES + 7*FPREGBYTES)(sp) + FPLOAD f10, (20*REGBYTES + 8*FPREGBYTES)(sp) + FPLOAD f11, (20*REGBYTES + 9*FPREGBYTES)(sp) + FPLOAD f12, (20*REGBYTES + 10*FPREGBYTES)(sp) + FPLOAD f13, (20*REGBYTES + 11*FPREGBYTES)(sp) + FPLOAD f14, (20*REGBYTES + 12*FPREGBYTES)(sp) + FPLOAD f15, (20*REGBYTES + 13*FPREGBYTES)(sp) + FPLOAD f16, (20*REGBYTES + 14*FPREGBYTES)(sp) + FPLOAD f17, (20*REGBYTES + 15*FPREGBYTES)(sp) + FPLOAD f28, (20*REGBYTES + 16*FPREGBYTES)(sp) + FPLOAD f29, (20*REGBYTES + 17*FPREGBYTES)(sp) + FPLOAD f30, (20*REGBYTES + 18*FPREGBYTES)(sp) + FPLOAD f31, (20*REGBYTES + 19*FPREGBYTES)(sp) + #endif +#endif + + +#ifdef __riscv_flen + #if(__riscv_flen == 64 ) + addi sp, sp, 20*REGBYTES + 20*FPREGBYTES + #else + addi sp, sp, 20*REGBYTES + #endif +#else +// De-allocate the stack space + addi sp, sp, 20*REGBYTES +#endif +.endm + +############################################### +############################################### +#restore caller registers +.macro RESTORE_CONTEXT_EXCPT_X5 + LOAD x1, 0*REGBYTES(sp) + LOAD x6, 2*REGBYTES(sp) + LOAD x7, 3*REGBYTES(sp) + LOAD x10, 4*REGBYTES(sp) + LOAD x11, 5*REGBYTES(sp) + LOAD x12, 6*REGBYTES(sp) + LOAD x13, 7*REGBYTES(sp) + LOAD x14, 8*REGBYTES(sp) + LOAD x15, 9*REGBYTES(sp) +#ifndef __riscv_32e + LOAD x16, 10*REGBYTES(sp) + LOAD x17, 11*REGBYTES(sp) + LOAD x28, 12*REGBYTES(sp) + LOAD x29, 13*REGBYTES(sp) + LOAD x30, 14*REGBYTES(sp) + LOAD x31, 15*REGBYTES(sp) +#endif +.endm + +############################################### +############################################### +#restore caller registers +.macro RESTORE_CONTEXT_ONLY_X5 + LOAD x5, 1*REGBYTES(sp) +.endm + +############################################### +############################################### +# Save the mepc and mstatus +# +.macro SAVE_EPC_STATUS + csrr x5, CSR_MEPC + STORE x5, 16*REGBYTES(sp) + csrr x5, CSR_MSTATUS + STORE x5, 17*REGBYTES(sp) + csrr x5, CSR_MSUBM + STORE x5, 18*REGBYTES(sp) +.endm + +############################################### +############################################### +# Restore the mepc and mstatus +# +.macro RESTORE_EPC_STATUS + LOAD x5, 16*REGBYTES(sp) + csrw CSR_MEPC, x5 + LOAD x5, 17*REGBYTES(sp) + csrw CSR_MSTATUS, x5 + LOAD x5, 18*REGBYTES(sp) + csrw CSR_MSUBM, x5 +.endm + + + +############################################### +############################################### +// Trap entry point +// + .section .text.trap + .align 6// In CLIC mode, the trap entry must be 64bytes aligned + .global trap_entry +.weak trap_entry +trap_entry: + // Allocate the stack space + // addi sp, sp, -19*REGBYTES + + // Save the caller saving registers (context) + SAVE_CONTEXT + // Save the MEPC/Mstatus/Msubm reg + SAVE_EPC_STATUS + + // Set the function argument + csrr a0, mcause + mv a1, sp + // Call the function + call handle_trap + + // Restore the MEPC/Mstatus/Msubm reg + RESTORE_EPC_STATUS + // Restore the caller saving registers (context) + RESTORE_CONTEXT + + // De-allocate the stack space + // addi sp, sp, 19*REGBYTES + // Return to regular code + mret + + +############################################### +############################################### +// IRQ entry point +// + .section .text.irq + .align 2 + .global irq_entry +.weak irq_entry +irq_entry: // -------------> This label will be set to MTVT2 register + // Allocate the stack space + + + SAVE_CONTEXT// Save 16 regs + + //------This special CSR read operation, which is actually use mcause as operand to directly store it to memory + csrrwi x0, CSR_PUSHMCAUSE, 17 + //------This special CSR read operation, which is actually use mepc as operand to directly store it to memory + csrrwi x0, CSR_PUSHMEPC, 18 + //------This special CSR read operation, which is actually use Msubm as operand to directly store it to memory + csrrwi x0, CSR_PUSHMSUBM, 19 + +service_loop: + //------This special CSR read/write operation, which is actually Claim the CLIC to find its pending highest + // ID, if the ID is not 0, then automatically enable the mstatus.MIE, and jump to its vector-entry-label, and + // update the link register + csrrw ra, CSR_JALMNXTI, ra + + //RESTORE_CONTEXT_EXCPT_X5 + + #---- Critical section with interrupts disabled ----------------------- + DISABLE_MIE # Disable interrupts + + LOAD x5, 19*REGBYTES(sp) + csrw CSR_MSUBM, x5 + LOAD x5, 18*REGBYTES(sp) + csrw CSR_MEPC, x5 + LOAD x5, 17*REGBYTES(sp) + csrw CSR_MCAUSE, x5 + + + RESTORE_CONTEXT + + + // Return to regular code + mret + + +#endif \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/handlers.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/handlers.c new file mode 100644 index 0000000..0d5132f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/handlers.c @@ -0,0 +1,32 @@ +//See LICENSE for license details. +#include +#include +#include +#include "riscv_encoding.h" +#include "n200_func.h" + +__attribute__((weak)) uintptr_t handle_nmi() +{ + write(1, "nmi\n", 5); + _exit(1); + return 0; +} + + +__attribute__((weak)) uintptr_t handle_trap(uintptr_t mcause, uintptr_t sp) +{ + if(mcause == 0xFFF) { + handle_nmi(); + } + write(1, "trap\n", 5); + //printf("In trap handler, the mcause is %d\n", mcause); + //printf("In trap handler, the mepc is 0x%x\n", read_csr(mepc)); + //printf("In trap handler, the mtval is 0x%x\n", read_csr(mbadaddr)); + _exit(mcause); + return 0; +} + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/init.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/init.c new file mode 100644 index 0000000..39a72ab --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/init.c @@ -0,0 +1,34 @@ +//See LICENSE for license details. +#include +#include +#include +#include +#include "riscv_encoding.h" +#include "n200_func.h" + +extern uint32_t disable_mcycle_minstret(); +void _init() +{ + SystemInit(); + + //ECLIC init + eclic_init(ECLIC_NUM_INTERRUPTS); + eclic_mode_enable(); + + //printf("After ECLIC mode enabled, the mtvec value is %x \n\n\r", read_csr(mtvec)); + + // // It must be NOTED: + // // * In the RISC-V arch, if user mode and PMP supported, then by default if PMP is not configured + // // with valid entries, then user mode cannot access any memory, and cannot execute any instructions. + // // * So if switch to user-mode and still want to continue, then you must configure PMP first + //pmp_open_all_space(); + //switch_m2u_mode(); + + /* Before enter into main, add the cycle/instret disable by default to save power, + only use them when needed to measure the cycle/instret */ + disable_mcycle_minstret(); +} + +void _fini() +{ +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/start.S b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/start.S new file mode 100644 index 0000000..d54d01f --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/start.S @@ -0,0 +1,258 @@ +// See LICENSE for license details. + +#include "riscv_encoding.h" + + .section .init + + .weak eclic_msip_handler + .weak eclic_mtip_handler + .weak eclic_bwei_handler + .weak eclic_pmovi_handler + .weak WWDGT_IRQHandler + .weak LVD_IRQHandler + .weak TAMPER_IRQHandler + .weak RTC_IRQHandler + .weak FMC_IRQHandler + .weak RCU_IRQHandler + .weak EXTI0_IRQHandler + .weak EXTI1_IRQHandler + .weak EXTI2_IRQHandler + .weak EXTI3_IRQHandler + .weak EXTI4_IRQHandler + .weak DMA0_Channel0_IRQHandler + .weak DMA0_Channel1_IRQHandler + .weak DMA0_Channel2_IRQHandler + .weak DMA0_Channel3_IRQHandler + .weak DMA0_Channel4_IRQHandler + .weak DMA0_Channel5_IRQHandler + .weak DMA0_Channel6_IRQHandler + .weak ADC0_1_IRQHandler + .weak CAN0_TX_IRQHandler + .weak CAN0_RX0_IRQHandler + .weak CAN0_RX1_IRQHandler + .weak CAN0_EWMC_IRQHandler + .weak EXTI5_9_IRQHandler + .weak TIMER0_BRK_IRQHandler + .weak TIMER0_UP_IRQHandler + .weak TIMER0_TRG_CMT_IRQHandler + .weak TIMER0_Channel_IRQHandler + .weak TIMER1_IRQHandler + .weak TIMER2_IRQHandler + .weak TIMER3_IRQHandler + .weak I2C0_EV_IRQHandler + .weak I2C0_ER_IRQHandler + .weak I2C1_EV_IRQHandler + .weak I2C1_ER_IRQHandler + .weak SPI0_IRQHandler + .weak SPI1_IRQHandler + .weak USART0_IRQHandler + .weak USART1_IRQHandler + .weak USART2_IRQHandler + .weak EXTI10_15_IRQHandler + .weak RTC_Alarm_IRQHandler + .weak USBFS_WKUP_IRQHandler + .weak EXMC_IRQHandler + .weak TIMER4_IRQHandler + .weak SPI2_IRQHandler + .weak UART3_IRQHandler + .weak UART4_IRQHandler + .weak TIMER5_IRQHandler + .weak TIMER6_IRQHandler + .weak DMA1_Channel0_IRQHandler + .weak DMA1_Channel1_IRQHandler + .weak DMA1_Channel2_IRQHandler + .weak DMA1_Channel3_IRQHandler + .weak DMA1_Channel4_IRQHandler + .weak CAN1_TX_IRQHandler + .weak CAN1_RX0_IRQHandler + .weak CAN1_RX1_IRQHandler + .weak CAN1_EWMC_IRQHandler + .weak USBFS_IRQHandler + +vector_base: + j _start + .align 2 + .word 0 + .word 0 + .word eclic_msip_handler + .word 0 + .word 0 + .word 0 + .word eclic_mtip_handler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word eclic_bwei_handler + .word eclic_pmovi_handler + .word WWDGT_IRQHandler + .word LVD_IRQHandler + .word TAMPER_IRQHandler + .word RTC_IRQHandler + .word FMC_IRQHandler + .word RCU_IRQHandler + .word EXTI0_IRQHandler + .word EXTI1_IRQHandler + .word EXTI2_IRQHandler + .word EXTI3_IRQHandler + .word EXTI4_IRQHandler + .word DMA0_Channel0_IRQHandler + .word DMA0_Channel1_IRQHandler + .word DMA0_Channel2_IRQHandler + .word DMA0_Channel3_IRQHandler + .word DMA0_Channel4_IRQHandler + .word DMA0_Channel5_IRQHandler + .word DMA0_Channel6_IRQHandler + .word ADC0_1_IRQHandler + .word CAN0_TX_IRQHandler + .word CAN0_RX0_IRQHandler + .word CAN0_RX1_IRQHandler + .word CAN0_EWMC_IRQHandler + .word EXTI5_9_IRQHandler + .word TIMER0_BRK_IRQHandler + .word TIMER0_UP_IRQHandler + .word TIMER0_TRG_CMT_IRQHandler + .word TIMER0_Channel_IRQHandler + .word TIMER1_IRQHandler + .word TIMER2_IRQHandler + .word TIMER3_IRQHandler + .word I2C0_EV_IRQHandler + .word I2C0_ER_IRQHandler + .word I2C1_EV_IRQHandler + .word I2C1_ER_IRQHandler + .word SPI0_IRQHandler + .word SPI1_IRQHandler + .word USART0_IRQHandler + .word USART1_IRQHandler + .word USART2_IRQHandler + .word EXTI10_15_IRQHandler + .word RTC_Alarm_IRQHandler + .word USBFS_WKUP_IRQHandler + .word 0 + .word 0 + .word 0 + .word 0 + .word 0 + .word EXMC_IRQHandler + .word 0 + .word TIMER4_IRQHandler + .word SPI2_IRQHandler + .word UART3_IRQHandler + .word UART4_IRQHandler + .word TIMER5_IRQHandler + .word TIMER6_IRQHandler + .word DMA1_Channel0_IRQHandler + .word DMA1_Channel1_IRQHandler + .word DMA1_Channel2_IRQHandler + .word DMA1_Channel3_IRQHandler + .word DMA1_Channel4_IRQHandler + .word 0 + .word 0 + .word CAN1_TX_IRQHandler + .word CAN1_RX0_IRQHandler + .word CAN1_RX1_IRQHandler + .word CAN1_EWMC_IRQHandler + .word USBFS_IRQHandler + + .globl _start + .type _start,@function + +_start: + + csrc CSR_MSTATUS, MSTATUS_MIE + /* Jump to logical address first to ensure correct operation of RAM region */ + la a0, _start + li a1, 1 + slli a1, a1, 29 + bleu a1, a0, _start0800 + srli a1, a1, 2 + bleu a1, a0, _start0800 + la a0, _start0800 + add a0, a0, a1 + jr a0 + +_start0800: + + /* Set the the NMI base to share with mtvec by setting CSR_MMISC_CTL */ + li t0, 0x200 + csrs CSR_MMISC_CTL, t0 + + /* Intial the mtvt*/ + la t0, vector_base + csrw CSR_MTVT, t0 + + /* Intial the mtvt2 and enable it*/ + la t0, irq_entry + csrw CSR_MTVT2, t0 + csrs CSR_MTVT2, 0x1 + + /* Intial the CSR MTVEC for the Trap ane NMI base addr*/ + la t0, trap_entry + csrw CSR_MTVEC, t0 + +#ifdef __riscv_flen + /* Enable FPU */ + li t0, MSTATUS_FS + csrs mstatus, t0 + csrw fcsr, x0 +#endif + +.option push +.option norelax + la gp, __global_pointer$ +.option pop + la sp, _sp + + /* Load data section */ + la a0, _data_lma + la a1, _data + la a2, _edata + bgeu a1, a2, 2f +1: + lw t0, (a0) + sw t0, (a1) + addi a0, a0, 4 + addi a1, a1, 4 + bltu a1, a2, 1b +2: + /* Clear bss section */ + la a0, __bss_start + la a1, _end + bgeu a0, a1, 2f +1: + sw zero, (a0) + addi a0, a0, 4 + bltu a0, a1, 1b +2: + /*enable mcycle_minstret*/ + csrci CSR_MCOUNTINHIBIT, 0x5 + /* Call global constructors */ + la a0, __libc_fini_array + call atexit + call __libc_init_array + + + /* argc = argv = 0 */ + li a0, 0 + li a1, 0 + call main + tail exit + +1: + j 1b + + .global disable_mcycle_minstret +disable_mcycle_minstret: + csrsi CSR_MCOUNTINHIBIT, 0x5 + ret + + .global enable_mcycle_minstret +enable_mcycle_minstret: + csrci CSR_MCOUNTINHIBIT, 0x5 + ret + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/your_printf.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/your_printf.c new file mode 100644 index 0000000..bbb95b6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/env_Eclipse/your_printf.c @@ -0,0 +1,5 @@ +int __wrap_printf(const char* fmt, ...) +{ + // You can implement your own printf to reduce the code size, because the printf is really a big function +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/_exit.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/_exit.c new file mode 100644 index 0000000..33467d0 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/_exit.c @@ -0,0 +1,17 @@ +/* See LICENSE of license details. */ + +#include + +#include "stub.h" + + +void _exit(int code) +{ + const char message[] = "\nProgram has exited with code:"; + + write(STDERR_FILENO, message, sizeof(message) - 1); + write_hex(STDERR_FILENO, code); + write(STDERR_FILENO, "\n", 1); + + for (;;); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/close.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/close.c new file mode 100644 index 0000000..e50362e --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/close.c @@ -0,0 +1,9 @@ +/* See LICENSE of license details. */ + +#include +#include "stub.h" + +int _close(int fd) +{ + return _stub(EBADF); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/fstat.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/fstat.c new file mode 100644 index 0000000..c30d27c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/fstat.c @@ -0,0 +1,16 @@ +/* See LICENSE of license details. */ + +#include +#include +#include +#include "stub.h" + +int _fstat(int fd, struct stat* st) +{ + if (isatty(fd)) { + st->st_mode = S_IFCHR; + return 0; + } + + return _stub(EBADF); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/isatty.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/isatty.c new file mode 100644 index 0000000..a590eba --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/isatty.c @@ -0,0 +1,11 @@ +/* See LICENSE of license details. */ + +#include + +int _isatty(int fd) +{ + if (fd == STDOUT_FILENO || fd == STDERR_FILENO) + return 1; + + return 0; +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/lseek.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/lseek.c new file mode 100644 index 0000000..f519b51 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/lseek.c @@ -0,0 +1,14 @@ +/* See LICENSE of license details. */ + +#include +#include +#include +#include "stub.h" + +off_t _lseek(int fd, off_t ptr, int dir) +{ + if (isatty(fd)) + return 0; + + return _stub(EBADF); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/read.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/read.c new file mode 100644 index 0000000..c874f67 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/read.c @@ -0,0 +1,13 @@ +/* See LICENSE of license details. */ + +#include +#include +#include +#include + +#include "stub.h" + +ssize_t _read(int fd, void* ptr, size_t len) +{ + return _stub(EBADF); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/sbrk.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/sbrk.c new file mode 100644 index 0000000..7d28568 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/sbrk.c @@ -0,0 +1,16 @@ +/* See LICENSE of license details. */ + +#include + +void *_sbrk(ptrdiff_t incr) +{ + extern char _end[]; + extern char _heap_end[]; + static char *curbrk = _end; + + if ((curbrk + incr < _end) || (curbrk + incr > _heap_end)) + return NULL - 1; + + curbrk += incr; + return curbrk - incr; +} \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/stub.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/stub.h new file mode 100644 index 0000000..88039e5 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/stub.h @@ -0,0 +1,16 @@ +/* See LICENSE of license details. */ +#ifndef _NUCLEI_SYS_STUB_H +#define _NUCLEI_SYS_STUB_H + +#include +#include + +void write_hex(int fd, unsigned long int hex); + +static inline int _stub(int err) +{ + return -1; +} + + +#endif /* _NUCLEI_SYS_STUB_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/write.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/write.c new file mode 100644 index 0000000..8836b70 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/write.c @@ -0,0 +1,47 @@ +/* See LICENSE of license details. */ + +#include +#include +#include +#include +#include +#include + +#include "stub.h" +#include "gd32vf103.h" + +typedef unsigned int size_t; + +extern int _put_char(int ch) __attribute__((weak)); + +ssize_t _write(int fd, const void* ptr, size_t len) { + const uint8_t * current = (const uint8_t *) ptr; + +// if (isatty(fd)) + { + for (size_t jj = 0; jj < len; jj++) { + _put_char(current[jj]); + + if (current[jj] == '\n') { + _put_char('\r'); + } + } + return len; + } + + return _stub(EBADF); +} + +int puts(const char* string) { + return _write(0, (const void *) string, strlen(string)); +} + +int _put_char(int ch) +{ + usart_data_transmit(USART0, (uint8_t) ch ); + while (usart_flag_get(USART0, USART_FLAG_TBE)== RESET){ + } + + return ch; +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/write_hex.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/write_hex.c new file mode 100644 index 0000000..f7aa9a4 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Firmware/RISCV/stubs/write_hex.c @@ -0,0 +1,18 @@ +/* See LICENSE of license details. */ + +#include +#include + +void write_hex(int fd, unsigned long int hex) +{ + uint8_t ii; + uint8_t jj; + char towrite; + write(fd , "0x", 2); + for (ii = sizeof(unsigned long int) * 2 ; ii > 0; ii--) { + jj = ii - 1; + uint8_t digit = ((hex & (0xF << (jj*4))) >> (jj*4)); + towrite = digit < 0xA ? ('0' + digit) : ('A' + (digit - 0xA)); + write(fd, &towrite, 1); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.cproject b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.cproject new file mode 100644 index 0000000..0dd7ab6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.cproject @@ -0,0 +1,700 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.project b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.project new file mode 100644 index 0000000..ac37c5b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.project @@ -0,0 +1,333 @@ + + + GD32VF103 + + + + + + org.eclipse.cdt.managedbuilder.core.genmakebuilder + clean,full,incremental, + + + + + org.eclipse.cdt.managedbuilder.core.ScannerConfigBuilder + full,incremental, + + + + + + org.eclipse.cdt.core.cnature + org.eclipse.cdt.managedbuilder.core.managedBuildNature + org.eclipse.cdt.managedbuilder.core.ScannerConfigNature + + + + Application + 2 + virtual:/virtual + + + Doc + 2 + virtual:/virtual + + + Peripherals + 2 + virtual:/virtual + + + RISCV + 2 + virtual:/virtual + + + Utilities + 2 + virtual:/virtual + + + Application/main.c + 1 + PARENT-1-PROJECT_LOC/main.c + + + Application/systick.c + 1 + PARENT-1-PROJECT_LOC/systick.c + + + Doc/readme.txt + 1 + PARENT-1-PROJECT_LOC/readme.txt + + + Peripherals/Source + 2 + virtual:/virtual + + + Peripherals/system_gd32vf103.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/system_gd32vf103.c + + + RISCV/drivers + 2 + virtual:/virtual + + + RISCV/env_Eclipse + 2 + virtual:/virtual + + + RISCV/stubs + 2 + virtual:/virtual + + + Utilities/gd32vf103v_eval.c + 1 + PARENT-2-PROJECT_LOC/Utilities/gd32vf103v_eval.c + + + Peripherals/Source/gd32vf103_adc.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_adc.c + + + Peripherals/Source/gd32vf103_bkp.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_bkp.c + + + Peripherals/Source/gd32vf103_can.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_can.c + + + Peripherals/Source/gd32vf103_crc.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_crc.c + + + Peripherals/Source/gd32vf103_dac.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dac.c + + + Peripherals/Source/gd32vf103_dbg.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dbg.c + + + Peripherals/Source/gd32vf103_dma.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_dma.c + + + Peripherals/Source/gd32vf103_eclic.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_eclic.c + + + Peripherals/Source/gd32vf103_exmc.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exmc.c + + + Peripherals/Source/gd32vf103_exti.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_exti.c + + + Peripherals/Source/gd32vf103_fmc.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fmc.c + + + Peripherals/Source/gd32vf103_fwdgt.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_fwdgt.c + + + Peripherals/Source/gd32vf103_gpio.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_gpio.c + + + Peripherals/Source/gd32vf103_i2c.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_i2c.c + + + Peripherals/Source/gd32vf103_pmu.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_pmu.c + + + Peripherals/Source/gd32vf103_rcu.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rcu.c + + + Peripherals/Source/gd32vf103_rtc.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_rtc.c + + + Peripherals/Source/gd32vf103_spi.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_spi.c + + + Peripherals/Source/gd32vf103_timer.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_timer.c + + + Peripherals/Source/gd32vf103_usart.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_usart.c + + + Peripherals/Source/gd32vf103_wwdgt.c + 1 + PARENT-2-PROJECT_LOC/Firmware/GD32VF103_standard_peripheral/Source/gd32vf103_wwdgt.c + + + RISCV/drivers/n200_eclic.h + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/drivers/n200_eclic.h + + + RISCV/drivers/n200_func.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.c + + + RISCV/drivers/n200_func.h + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/drivers/n200_func.h + + + RISCV/drivers/n200_timer.h + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/drivers/n200_timer.h + + + RISCV/drivers/riscv_bits.h + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/drivers/riscv_bits.h + + + RISCV/drivers/riscv_const.h + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/drivers/riscv_const.h + + + RISCV/drivers/riscv_encoding.h + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/drivers/riscv_encoding.h + + + RISCV/env_Eclipse/GD32VF103x4.lds + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103x4.lds + + + RISCV/env_Eclipse/GD32VF103x6.lds + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103x6.lds + + + RISCV/env_Eclipse/GD32VF103x8.lds + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103x8.lds + + + RISCV/env_Eclipse/GD32VF103xB.lds + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/env_Eclipse/GD32VF103xB.lds + + + RISCV/env_Eclipse/entry.S + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/env_Eclipse/entry.S + + + RISCV/env_Eclipse/handlers.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/env_Eclipse/handlers.c + + + RISCV/env_Eclipse/init.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/env_Eclipse/init.c + + + RISCV/env_Eclipse/start.S + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/env_Eclipse/start.S + + + RISCV/env_Eclipse/your_printf.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/env_Eclipse/your_printf.c + + + RISCV/stubs/_exit.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/stubs/_exit.c + + + RISCV/stubs/close.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/stubs/close.c + + + RISCV/stubs/fstat.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/stubs/fstat.c + + + RISCV/stubs/isatty.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/stubs/isatty.c + + + RISCV/stubs/lseek.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/stubs/lseek.c + + + RISCV/stubs/read.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/stubs/read.c + + + RISCV/stubs/sbrk.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/stubs/sbrk.c + + + RISCV/stubs/stub.h + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/stubs/stub.h + + + RISCV/stubs/write.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/stubs/write.c + + + RISCV/stubs/write_hex.c + 1 + PARENT-2-PROJECT_LOC/Firmware/RISCV/stubs/write_hex.c + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.settings/language.settings.xml b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.settings/language.settings.xml new file mode 100644 index 0000000..648135c --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.settings/language.settings.xml @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.settings/org.eclipse.cdt.codan.core.prefs b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.settings/org.eclipse.cdt.codan.core.prefs new file mode 100644 index 0000000..067d6fd --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.settings/org.eclipse.cdt.codan.core.prefs @@ -0,0 +1,73 @@ +eclipse.preferences.version=1 +org.eclipse.cdt.codan.checkers.errnoreturn=Warning +org.eclipse.cdt.codan.checkers.errnoreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return\\")",implicit\=>false} +org.eclipse.cdt.codan.checkers.errreturnvalue=Error +org.eclipse.cdt.codan.checkers.errreturnvalue.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused return value\\")"} +org.eclipse.cdt.codan.checkers.nocommentinside=-Error +org.eclipse.cdt.codan.checkers.nocommentinside.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Nesting comments\\")"} +org.eclipse.cdt.codan.checkers.nolinecomment=-Error +org.eclipse.cdt.codan.checkers.nolinecomment.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Line comments\\")"} +org.eclipse.cdt.codan.checkers.noreturn=Error +org.eclipse.cdt.codan.checkers.noreturn.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No return value\\")",implicit\=>false} +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation=Error +org.eclipse.cdt.codan.internal.checkers.AbstractClassCreation.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Abstract class cannot be instantiated\\")"} +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem=Error +org.eclipse.cdt.codan.internal.checkers.AmbiguousProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Ambiguous problem\\")"} +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.AssignmentInConditionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment in condition\\")"} +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem=Error +org.eclipse.cdt.codan.internal.checkers.AssignmentToItselfProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Assignment to itself\\")"} +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem=Warning +org.eclipse.cdt.codan.internal.checkers.CaseBreakProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"No break at end of case\\")",no_break_comment\=>"no break",last_case_param\=>false,empty_case_param\=>false,enable_fallthrough_quickfix_param\=>false} +org.eclipse.cdt.codan.internal.checkers.CatchByReference=Warning +org.eclipse.cdt.codan.internal.checkers.CatchByReference.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Catching by reference is recommended\\")",unknown\=>false,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem=Error +org.eclipse.cdt.codan.internal.checkers.CircularReferenceProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Circular inheritance\\")"} +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization=Warning +org.eclipse.cdt.codan.internal.checkers.ClassMembersInitialization.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class members should be properly initialized\\")",skip\=>true} +org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem=Error +org.eclipse.cdt.codan.internal.checkers.DecltypeAutoProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid 'decltype(auto)' specifier\\")"} +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FieldResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Field cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.FunctionResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Function cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.InvalidArguments=Error +org.eclipse.cdt.codan.internal.checkers.InvalidArguments.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid arguments\\")"} +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem=Error +org.eclipse.cdt.codan.internal.checkers.InvalidTemplateArgumentsProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid template argument\\")"} +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.LabelStatementNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Label statement not found\\")"} +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem=Error +org.eclipse.cdt.codan.internal.checkers.MemberDeclarationNotFoundProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Member declaration not found\\")"} +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.MethodResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Method cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker=-Info +org.eclipse.cdt.codan.internal.checkers.NamingConventionFunctionChecker.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Name convention for function\\")",pattern\=>"^[a-z]",macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem=Warning +org.eclipse.cdt.codan.internal.checkers.NonVirtualDestructorProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Class has a virtual method and non-virtual destructor\\")"} +org.eclipse.cdt.codan.internal.checkers.OverloadProblem=Error +org.eclipse.cdt.codan.internal.checkers.OverloadProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid overload\\")"} +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redeclaration\\")"} +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem=Error +org.eclipse.cdt.codan.internal.checkers.RedefinitionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Invalid redefinition\\")"} +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ReturnStyleProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Return with parenthesis\\")"} +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem=-Warning +org.eclipse.cdt.codan.internal.checkers.ScanfFormatStringSecurityProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Format String Vulnerability\\")"} +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem=Warning +org.eclipse.cdt.codan.internal.checkers.StatementHasNoEffectProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Statement has no effect\\")",macro\=>true,exceptions\=>()} +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuggestedParenthesisProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suggested parenthesis around expression\\")",paramNot\=>false} +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem=Warning +org.eclipse.cdt.codan.internal.checkers.SuspiciousSemicolonProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Suspicious semicolon\\")",else\=>false,afterelse\=>false} +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.TypeResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Type cannot be resolved\\")"} +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedFunctionDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused function declaration\\")",macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedStaticFunctionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused static function\\")",macro\=>true} +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem=Warning +org.eclipse.cdt.codan.internal.checkers.UnusedVariableDeclarationProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Unused variable declaration in file scope\\")",macro\=>true,exceptions\=>("@(\#)","$Id")} +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem=Error +org.eclipse.cdt.codan.internal.checkers.VariableResolutionProblem.params={launchModes\=>{RUN_ON_FULL_BUILD\=>true,RUN_ON_INC_BUILD\=>true,RUN_ON_FILE_OPEN\=>false,RUN_ON_FILE_SAVE\=>false,RUN_AS_YOU_TYPE\=>true,RUN_ON_DEMAND\=>true},suppression_comment\=>"@suppress(\\"Symbol is not resolved\\")"} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.settings/org.eclipse.cdt.core.prefs b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.settings/org.eclipse.cdt.core.prefs new file mode 100644 index 0000000..8cc8662 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/eclipse/.settings/org.eclipse.cdt.core.prefs @@ -0,0 +1,9 @@ +eclipse.preferences.version=1 +environment/project/ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.1146769190.1656381579/CWD/delimiter=; +environment/project/ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.1146769190.1656381579/CWD/operation=replace +environment/project/ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.1146769190.1656381579/CWD/value=E\:\\Delivered_Pattern\\GD32501\\fw32501\\GD32VF103_Firmware_Library_V1.0.0\\project\\eclipse\\FLASH +environment/project/ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.1146769190.1656381579/PWD/delimiter=; +environment/project/ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.1146769190.1656381579/PWD/operation=replace +environment/project/ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.1146769190.1656381579/PWD/value=E\:\\Delivered_Pattern\\GD32501\\fw32501\\GD32VF103_Firmware_Library_V1.0.0\\project\\eclipse\\FLASH +environment/project/ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.1146769190.1656381579/append=true +environment/project/ilg.gnumcueclipse.managedbuild.cross.riscv.config.elf.debug.1146769190.1656381579/appendContributed=true diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/gd32vf103_libopt.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/gd32vf103_libopt.h new file mode 100644 index 0000000..0381461 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/gd32vf103_libopt.h @@ -0,0 +1,61 @@ +/*! + \file gd32vf103_libopt.h + \brief library optional for gd32vf103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_LIBOPT_H +#define GD32VF103_LIBOPT_H + +#include "gd32vf103_adc.h" +#include "gd32vf103_bkp.h" +#include "gd32vf103_can.h" +#include "gd32vf103_crc.h" +#include "gd32vf103_dac.h" +#include "gd32vf103_dma.h" +#include "gd32vf103_eclic.h" +#include "gd32vf103_exmc.h" +#include "gd32vf103_exti.h" +#include "gd32vf103_fmc.h" +#include "gd32vf103_gpio.h" +#include "gd32vf103_i2c.h" +#include "gd32vf103_fwdgt.h" +#include "gd32vf103_dbg.h" +#include "gd32vf103_pmu.h" +#include "gd32vf103_rcu.h" +#include "gd32vf103_rtc.h" +#include "gd32vf103_spi.h" +#include "gd32vf103_timer.h" +#include "gd32vf103_usart.h" +#include "gd32vf103_wwdgt.h" +#include "n200_func.h" + +#endif /* GD32VF103_LIBOPT_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/main.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/main.c new file mode 100644 index 0000000..661eea8 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/main.c @@ -0,0 +1,71 @@ +/*! + \file main.c + \brief running led + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "gd32vf103v_eval.h" +#include "systick.h" +#include + +/*! + \brief main function + \param[in] none + \param[out] none + \retval none +*/ +int main(void) +{ + gd_eval_led_init(LED1); + gd_eval_led_init(LED2); + gd_eval_led_init(LED3); + gd_eval_led_init(LED4); + + while(1){ + /* turn on led1, turn off led4 */ + gd_eval_led_on(LED1); + gd_eval_led_off(LED4); + delay_1ms(1000); + /* turn on led2, turn off led1 */ + gd_eval_led_on(LED2); + gd_eval_led_off(LED1); + delay_1ms(1000); + /* turn on led3, turn off led2 */ + gd_eval_led_on(LED3); + gd_eval_led_off(LED2); + delay_1ms(1000); + /* turn on led4, turn off led3 */ + gd_eval_led_on(LED4); + gd_eval_led_off(LED3); + delay_1ms(1000); + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/main.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/main.h new file mode 100644 index 0000000..9df3992 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/main.h @@ -0,0 +1,41 @@ +/*! + \file main.h + \brief the header file of main + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __MAIN_H +#define __MAIN_H + +/* led spark function */ +void led_spark(void); + +#endif /* __MAIN_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/readme.txt b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/readme.txt new file mode 100644 index 0000000..2ca093d --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/readme.txt @@ -0,0 +1,40 @@ +/*! + \file readme.txt + \brief description of running led example + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + + This example is based on the GD32VF103V-EVAL-V1.0 board, it provides a description +of Running_led. After system start-up, firstly, LED1 on, then, LED2 on, four +LEDs can light periodically. + + On the GD32VF103V-EVAL-V1.0 board,LED1 connected to PC0, LED2 connected to PC2, LED3 +connected to PE0, LED4 connected to PE1. diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/systick.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/systick.c new file mode 100644 index 0000000..4296e59 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/systick.c @@ -0,0 +1,57 @@ +/*! + \file systick.c + \brief the systick configuration file + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103.h" +#include "systick.h" + +/*! + \brief delay a time in milliseconds + \param[in] count: count in milliseconds + \param[out] none + \retval none +*/ +void delay_1ms(uint32_t count) +{ + uint64_t start_mtime, delta_mtime; + + // Don't start measuruing until we see an mtime tick + uint64_t tmp = get_timer_value(); + do { + start_mtime = get_timer_value(); + } while (start_mtime == tmp); + + do { + delta_mtime = get_timer_value() - start_mtime; + }while(delta_mtime <(SystemCoreClock/4000.0 *count )); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/systick.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/systick.h new file mode 100644 index 0000000..9a74c22 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Template/systick.h @@ -0,0 +1,42 @@ +/*! + \file systick.h + \brief the header file of systick + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef SYS_TICK_H +#define SYS_TICK_H + +#include + +void delay_1ms(uint32_t count); + +#endif /* SYS_TICK_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/LCD_common/lcd_font.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/LCD_common/lcd_font.c new file mode 100644 index 0000000..5704bd8 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/LCD_common/lcd_font.c @@ -0,0 +1,711 @@ +/*! + \file lcd_font.c + \brief text fonts driver + + \version 2019-06-05, V1.0.0, demo for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "lcd_font.h" + +unsigned char const ascii_8x16[1536] = { +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x3C,0x3C,0x3C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x66,0x66,0x66,0x24,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x6C,0x6C,0xFE,0x6C,0x6C,0x6C,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00, +0x18,0x18,0x7C,0xC6,0xC2,0xC0,0x7C,0x06,0x86,0xC6,0x7C,0x18,0x18,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0xC2,0xC6,0x0C,0x18,0x30,0x60,0xC6,0x86,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0x6C,0x38,0x76,0xDC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x30,0x30,0x30,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x0C,0x18,0x30,0x30,0x30,0x30,0x30,0x30,0x18,0x0C,0x00,0x00,0x00,0x00, +0x00,0x00,0x30,0x18,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x18,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x66,0x3C,0xFF,0x3C,0x66,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x7E,0x18,0x18,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x18,0x30,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x02,0x06,0x0C,0x18,0x30,0x60,0xC0,0x80,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xCE,0xD6,0xD6,0xE6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x38,0x78,0x18,0x18,0x18,0x18,0x18,0x18,0x7E,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0x06,0x0C,0x18,0x30,0x60,0xC0,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0x06,0x06,0x3C,0x06,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x0C,0x1C,0x3C,0x6C,0xCC,0xFE,0x0C,0x0C,0x0C,0x1E,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC0,0xC0,0xC0,0xFC,0x0E,0x06,0x06,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x60,0xC0,0xC0,0xFC,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC6,0x06,0x06,0x0C,0x18,0x30,0x30,0x30,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7C,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0x7E,0x06,0x06,0x06,0x0C,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x18,0x18,0x30,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x06,0x0C,0x18,0x30,0x60,0x30,0x18,0x0C,0x06,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0xFE,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x60,0x30,0x18,0x0C,0x06,0x0C,0x18,0x30,0x60,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0x0C,0x18,0x18,0x18,0x00,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x7C,0xC6,0xC6,0xDE,0xDE,0xDE,0xDC,0xC0,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x66,0x66,0x66,0x66,0xFC,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xC0,0xC0,0xC2,0x66,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xF8,0x6C,0x66,0x66,0x66,0x66,0x66,0x66,0x6C,0xF8,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0x66,0x62,0x68,0x78,0x68,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x66,0xC2,0xC0,0xC0,0xDE,0xC6,0xC6,0x66,0x3A,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xFE,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x1E,0x0C,0x0C,0x0C,0x0C,0x0C,0xCC,0xCC,0xCC,0x78,0x00,0x00,0x00,0x00, +0x00,0x00,0xE6,0x66,0x6C,0x6C,0x78,0x78,0x6C,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0xF0,0x60,0x60,0x60,0x60,0x60,0x60,0x62,0x66,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xEE,0xFE,0xFE,0xD6,0xC6,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xE6,0xF6,0xFE,0xDE,0xCE,0xC6,0xC6,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x00,0x00,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xDE,0x7C,0x0C,0x0E,0x00,0x00, +0x00,0x00,0xFC,0x66,0x66,0x66,0x7C,0x6C,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x7C,0xC6,0xC6,0x60,0x38,0x0C,0x06,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x7E,0x7E,0x5A,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x6C,0x38,0x10,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x6C,0x00,0x00,0x00,0x00, +0x00,0x00,0xC6,0xC6,0x6C,0x6C,0x38,0x38,0x6C,0x6C,0xC6,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x66,0x66,0x66,0x66,0x3C,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0xFE,0xC6,0x86,0x0C,0x18,0x30,0x60,0xC2,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x30,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x80,0xC0,0xE0,0x70,0x38,0x1C,0x0E,0x06,0x02,0x00,0x00,0x00,0x00, +0x00,0x00,0x3C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x0C,0x3C,0x00,0x00,0x00,0x00, +0x10,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00, +0x30,0x30,0x18,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x78,0x0C,0x7C,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0xE0,0x60,0x60,0x78,0x6C,0x66,0x66,0x66,0x66,0xDC,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC0,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x1C,0x0C,0x0C,0x3C,0x6C,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xFE,0xC0,0xC0,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x6C,0x64,0x60,0xF0,0x60,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0xCC,0x78,0x00, +0x00,0x00,0xE0,0x60,0x60,0x6C,0x76,0x66,0x66,0x66,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x06,0x06,0x00,0x0E,0x06,0x06,0x06,0x06,0x06,0x06,0x66,0x66,0x3C,0x00, +0x00,0x00,0xE0,0x60,0x60,0x66,0x6C,0x78,0x78,0x6C,0x66,0xE6,0x00,0x00,0x00,0x00, +0x00,0x00,0x38,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x18,0x3C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xEC,0xFE,0xD6,0xD6,0xD6,0xD6,0xD6,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x66,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0xC6,0xC6,0xC6,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x66,0x66,0x66,0x66,0x66,0x7C,0x60,0x60,0xF0,0x00, +0x00,0x00,0x00,0x00,0x00,0x76,0xCC,0xCC,0xCC,0xCC,0xCC,0x7C,0x0C,0x0C,0x1E,0x00, +0x00,0x00,0x00,0x00,0x00,0xDC,0x76,0x62,0x60,0x60,0x60,0xF0,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x7C,0xC6,0x60,0x38,0x0C,0xC6,0x7C,0x00,0x00,0x00,0x00, +0x00,0x00,0x10,0x30,0x30,0xFC,0x30,0x30,0x30,0x30,0x36,0x1C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xCC,0xCC,0xCC,0xCC,0xCC,0xCC,0x76,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0x66,0x66,0x66,0x66,0x66,0x3C,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xD6,0xD6,0xFE,0x6C,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0x6C,0x38,0x38,0x38,0x6C,0xC6,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x00,0xC6,0xC6,0xC6,0xC6,0xC6,0xC6,0x7E,0x06,0x0C,0xF8,0x00, +0x00,0x00,0x00,0x00,0x00,0xFE,0xCC,0x18,0x30,0x60,0xC6,0xFE,0x00,0x00,0x00,0x00, +0x00,0x00,0x0E,0x18,0x18,0x18,0x70,0x18,0x18,0x18,0x18,0x0E,0x00,0x00,0x00,0x00, +0x00,0x00,0x18,0x18,0x18,0x18,0x00,0x18,0x18,0x18,0x18,0x18,0x00,0x00,0x00,0x00, +0x00,0x00,0x70,0x18,0x18,0x18,0x0E,0x18,0x18,0x18,0x18,0x70,0x00,0x00,0x00,0x00, +0x00,0x00,0x76,0xDC,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, +0x00,0x00,0x00,0x00,0x10,0x38,0x6C,0xC6,0xC6,0xC6,0xFE,0x00,0x00,0x00,0x00,0x00 +}; + + + +/* ASCII Table: each character is 16 column (16dots large) and 24 raw (24 dots high) */ +const uint16_t ASCII_Table_16x24[] = +{ +/** + * @brief Space ' ' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '!' + */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '"' + */ + 0x0000, 0x0000, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, 0x00CC, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '#' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0C60, 0x0C60, + 0x0C60, 0x0630, 0x0630, 0x1FFE, 0x1FFE, 0x0630, 0x0738, 0x0318, + 0x1FFE, 0x1FFE, 0x0318, 0x0318, 0x018C, 0x018C, 0x018C, 0x0000, +/** + * @brief '$' + */ + 0x0000, 0x0080, 0x03E0, 0x0FF8, 0x0E9C, 0x1C8C, 0x188C, 0x008C, + 0x0098, 0x01F8, 0x07E0, 0x0E80, 0x1C80, 0x188C, 0x188C, 0x189C, + 0x0CB8, 0x0FF0, 0x03E0, 0x0080, 0x0080, 0x0000, 0x0000, 0x0000, +/** + * @brief '%' + */ + 0x0000, 0x0000, 0x0000, 0x180E, 0x0C1B, 0x0C11, 0x0611, 0x0611, + 0x0311, 0x0311, 0x019B, 0x018E, 0x38C0, 0x6CC0, 0x4460, 0x4460, + 0x4430, 0x4430, 0x4418, 0x6C18, 0x380C, 0x0000, 0x0000, 0x0000, +/** + * @brief '&' + */ + 0x0000, 0x01E0, 0x03F0, 0x0738, 0x0618, 0x0618, 0x0330, 0x01F0, + 0x00F0, 0x00F8, 0x319C, 0x330E, 0x1E06, 0x1C06, 0x1C06, 0x3F06, + 0x73FC, 0x21F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ''' + */ + 0x0000, 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '(' + */ + 0x0000, 0x0200, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x0060, 0x0060, + 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0060, 0x0060, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0200, 0x0000, +/** + * @brief ')' + */ + 0x0000, 0x0020, 0x0060, 0x00C0, 0x0180, 0x0180, 0x0300, 0x0300, + 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0300, 0x0300, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0020, 0x0000, +/** + * @brief '*' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x06D8, 0x07F8, 0x01E0, 0x0330, 0x0738, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '+' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x3FFC, 0x3FFC, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ',' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, +/** + * @brief '-' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x07E0, 0x07E0, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '.' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '/' + */ + 0x0000, 0x0C00, 0x0C00, 0x0600, 0x0600, 0x0600, 0x0300, 0x0300, + 0x0300, 0x0380, 0x0180, 0x0180, 0x0180, 0x00C0, 0x00C0, 0x00C0, + 0x0060, 0x0060, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '0' + */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x180C, 0x180C, 0x180C, + 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '1' + */ + 0x0000, 0x0100, 0x0180, 0x01C0, 0x01F0, 0x0198, 0x0188, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '2' + */ + 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x1800, + 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, + 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '3' + */ + 0x0000, 0x01E0, 0x07F8, 0x0E18, 0x0C0C, 0x0C0C, 0x0C00, 0x0600, + 0x03C0, 0x07C0, 0x0C00, 0x1800, 0x1800, 0x180C, 0x180C, 0x0C18, + 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '4' + */ + 0x0000, 0x0C00, 0x0E00, 0x0F00, 0x0F00, 0x0D80, 0x0CC0, 0x0C60, + 0x0C60, 0x0C30, 0x0C18, 0x0C0C, 0x3FFC, 0x3FFC, 0x0C00, 0x0C00, + 0x0C00, 0x0C00, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '5' + */ + 0x0000, 0x0FF8, 0x0FF8, 0x0018, 0x0018, 0x000C, 0x03EC, 0x07FC, + 0x0E1C, 0x1C00, 0x1800, 0x1800, 0x1800, 0x180C, 0x0C1C, 0x0E18, + 0x07F8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '6' + */ + 0x0000, 0x07C0, 0x0FF0, 0x1C38, 0x1818, 0x0018, 0x000C, 0x03CC, + 0x0FEC, 0x0E3C, 0x1C1C, 0x180C, 0x180C, 0x180C, 0x1C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '7' + */ + 0x0000, 0x1FFC, 0x1FFC, 0x0C00, 0x0600, 0x0600, 0x0300, 0x0380, + 0x0180, 0x01C0, 0x00C0, 0x00E0, 0x0060, 0x0060, 0x0070, 0x0030, + 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '8' + */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C18, 0x0C18, 0x0C18, 0x0638, + 0x07F0, 0x07F0, 0x0C18, 0x180C, 0x180C, 0x180C, 0x180C, 0x0C38, + 0x0FF8, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '9' + */ + 0x0000, 0x03E0, 0x07F0, 0x0E38, 0x0C1C, 0x180C, 0x180C, 0x180C, + 0x1C1C, 0x1E38, 0x1BF8, 0x19E0, 0x1800, 0x0C00, 0x0C00, 0x0E1C, + 0x07F8, 0x01F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ':' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ';' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0180, 0x0180, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0180, 0x0180, 0x0100, 0x0100, 0x0080, 0x0000, 0x0000, 0x0000, +/** + * @brief '<' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1000, 0x1C00, 0x0F80, 0x03E0, 0x00F8, 0x0018, 0x00F8, 0x03E0, + 0x0F80, 0x1C00, 0x1000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '=' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x1FF8, 0x0000, 0x0000, 0x0000, 0x1FF8, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '>' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0008, 0x0038, 0x01F0, 0x07C0, 0x1F00, 0x1800, 0x1F00, 0x07C0, + 0x01F0, 0x0038, 0x0008, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '?' + */ + 0x0000, 0x03E0, 0x0FF8, 0x0C18, 0x180C, 0x180C, 0x1800, 0x0C00, + 0x0600, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x0000, 0x0000, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '@' + */ + 0x0000, 0x0000, 0x07E0, 0x1818, 0x2004, 0x29C2, 0x4A22, 0x4411, + 0x4409, 0x4409, 0x4409, 0x2209, 0x1311, 0x0CE2, 0x4002, 0x2004, + 0x1818, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'A' + */ + 0x0000, 0x0380, 0x0380, 0x06C0, 0x06C0, 0x06C0, 0x0C60, 0x0C60, + 0x1830, 0x1830, 0x1830, 0x3FF8, 0x3FF8, 0x701C, 0x600C, 0x600C, + 0xC006, 0xC006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'B' + */ + 0x0000, 0x03FC, 0x0FFC, 0x0C0C, 0x180C, 0x180C, 0x180C, 0x0C0C, + 0x07FC, 0x0FFC, 0x180C, 0x300C, 0x300C, 0x300C, 0x300C, 0x180C, + 0x1FFC, 0x07FC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'C' + */ + 0x0000, 0x07C0, 0x1FF0, 0x3838, 0x301C, 0x700C, 0x6006, 0x0006, + 0x0006, 0x0006, 0x0006, 0x0006, 0x0006, 0x6006, 0x700C, 0x301C, + 0x1FF0, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'D' + */ + 0x0000, 0x03FE, 0x0FFE, 0x0E06, 0x1806, 0x1806, 0x3006, 0x3006, + 0x3006, 0x3006, 0x3006, 0x3006, 0x3006, 0x1806, 0x1806, 0x0E06, + 0x0FFE, 0x03FE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'E' + */ + 0x0000, 0x3FFC, 0x3FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x1FFC, 0x1FFC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x3FFC, 0x3FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'F' + */ + 0x0000, 0x3FF8, 0x3FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'G' + */ + 0x0000, 0x0FE0, 0x3FF8, 0x783C, 0x600E, 0xE006, 0xC007, 0x0003, + 0x0003, 0xFE03, 0xFE03, 0xC003, 0xC007, 0xC006, 0xC00E, 0xF03C, + 0x3FF8, 0x0FE0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'H' + */ + 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x3FFC, 0x3FFC, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x300C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'I' + */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'J' + */ + 0x0000, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, + 0x0600, 0x0600, 0x0600, 0x0600, 0x0600, 0x0618, 0x0618, 0x0738, + 0x03F0, 0x01E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'K' + */ + 0x0000, 0x3006, 0x1806, 0x0C06, 0x0606, 0x0306, 0x0186, 0x00C6, + 0x0066, 0x0076, 0x00DE, 0x018E, 0x0306, 0x0606, 0x0C06, 0x1806, + 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'L' + */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, + 0x1FF8, 0x1FF8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'M' + */ + 0x0000, 0xE00E, 0xF01E, 0xF01E, 0xF01E, 0xD836, 0xD836, 0xD836, + 0xD836, 0xCC66, 0xCC66, 0xCC66, 0xC6C6, 0xC6C6, 0xC6C6, 0xC6C6, + 0xC386, 0xC386, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'N' + */ + 0x0000, 0x300C, 0x301C, 0x303C, 0x303C, 0x306C, 0x306C, 0x30CC, + 0x30CC, 0x318C, 0x330C, 0x330C, 0x360C, 0x360C, 0x3C0C, 0x3C0C, + 0x380C, 0x300C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'O' + */ + 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xC003, 0xC003, + 0xC003, 0xC003, 0xC003, 0xC003, 0xC003, 0x6006, 0x700E, 0x381C, + 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'P' + */ + 0x0000, 0x0FFC, 0x1FFC, 0x380C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x180C, 0x1FFC, 0x07FC, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, + 0x000C, 0x000C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'Q' + */ + 0x0000, 0x07E0, 0x1FF8, 0x381C, 0x700E, 0x6006, 0xE003, 0xC003, + 0xC003, 0xC003, 0xC003, 0xC003, 0xE007, 0x6306, 0x3F0E, 0x3C1C, + 0x3FF8, 0xF7E0, 0xC000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'R' + */ + 0x0000, 0x0FFE, 0x1FFE, 0x3806, 0x3006, 0x3006, 0x3006, 0x3806, + 0x1FFE, 0x07FE, 0x0306, 0x0606, 0x0C06, 0x1806, 0x1806, 0x3006, + 0x3006, 0x6006, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'S' + */ + 0x0000, 0x03E0, 0x0FF8, 0x0C1C, 0x180C, 0x180C, 0x000C, 0x001C, + 0x03F8, 0x0FE0, 0x1E00, 0x3800, 0x3006, 0x3006, 0x300E, 0x1C1C, + 0x0FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'T' + */ + 0x0000, 0x7FFE, 0x7FFE, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'U' + */ + 0x0000, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, + 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x300C, 0x1818, + 0x1FF8, 0x07E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'V' + */ + 0x0000, 0x6003, 0x3006, 0x3006, 0x3006, 0x180C, 0x180C, 0x180C, + 0x0C18, 0x0C18, 0x0E38, 0x0630, 0x0630, 0x0770, 0x0360, 0x0360, + 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'W' + */ + 0x0000, 0x6003, 0x61C3, 0x61C3, 0x61C3, 0x3366, 0x3366, 0x3366, + 0x3366, 0x3366, 0x3366, 0x1B6C, 0x1B6C, 0x1B6C, 0x1A2C, 0x1E3C, + 0x0E38, 0x0E38, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'X' + */ + 0x0000, 0xE00F, 0x700C, 0x3018, 0x1830, 0x0C70, 0x0E60, 0x07C0, + 0x0380, 0x0380, 0x03C0, 0x06E0, 0x0C70, 0x1C30, 0x1818, 0x300C, + 0x600E, 0xE007, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'Y' + */ + 0x0000, 0xC003, 0x6006, 0x300C, 0x381C, 0x1838, 0x0C30, 0x0660, + 0x07E0, 0x03C0, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'Z' + */ + 0x0000, 0x7FFC, 0x7FFC, 0x6000, 0x3000, 0x1800, 0x0C00, 0x0600, + 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, 0x000C, 0x0006, + 0x7FFE, 0x7FFE, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '[' + */ + 0x0000, 0x03E0, 0x03E0, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, + 0x0060, 0x0060, 0x0060, 0x0060, 0x0060, 0x03E0, 0x03E0, 0x0000, +/** + * @brief '\' + */ + 0x0000, 0x0030, 0x0030, 0x0060, 0x0060, 0x0060, 0x00C0, 0x00C0, + 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0300, 0x0300, 0x0300, + 0x0600, 0x0600, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ']' + */ + 0x0000, 0x03E0, 0x03E0, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, + 0x0300, 0x0300, 0x0300, 0x0300, 0x0300, 0x03E0, 0x03E0, 0x0000, +/** + * @brief '^' + */ + 0x0000, 0x0000, 0x01C0, 0x01C0, 0x0360, 0x0360, 0x0360, 0x0630, + 0x0630, 0x0C18, 0x0C18, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '_' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0xFFFF, 0xFFFF, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief ''' + */ + 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'a' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03F0, 0x07F8, + 0x0C1C, 0x0C0C, 0x0F00, 0x0FF0, 0x0CF8, 0x0C0C, 0x0C0C, 0x0F1C, + 0x0FF8, 0x18F0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'b' + */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x03D8, 0x0FF8, + 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, + 0x0FF8, 0x03D8, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'c' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x07F0, + 0x0E30, 0x0C18, 0x0018, 0x0018, 0x0018, 0x0018, 0x0C18, 0x0E30, + 0x07F0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'd' + */ + 0x0000, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x1BC0, 0x1FF0, + 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, + 0x1FF0, 0x1BC0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'e' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, + 0x0C30, 0x1818, 0x1FF8, 0x1FF8, 0x0018, 0x0018, 0x1838, 0x1C30, + 0x0FF0, 0x07C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'f' + */ + 0x0000, 0x0F80, 0x0FC0, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'g' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0DE0, 0x0FF8, + 0x0E18, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0C0C, 0x0E18, + 0x0FF8, 0x0DE0, 0x0C00, 0x0C0C, 0x061C, 0x07F8, 0x01F0, 0x0000, +/** + * @brief 'h' + */ + 0x0000, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x07D8, 0x0FF8, + 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, + 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'i' + */ + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'j' + */ + 0x0000, 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00F8, 0x0078, 0x0000, +/** + * @brief 'k' + */ + 0x0000, 0x000C, 0x000C, 0x000C, 0x000C, 0x000C, 0x0C0C, 0x060C, + 0x030C, 0x018C, 0x00CC, 0x006C, 0x00FC, 0x019C, 0x038C, 0x030C, + 0x060C, 0x0C0C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'l' + */ + 0x0000, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'm' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3C7C, 0x7EFF, + 0xE3C7, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, 0xC183, + 0xC183, 0xC183, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'n' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0798, 0x0FF8, + 0x1C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, + 0x1818, 0x1818, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'o' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03C0, 0x0FF0, + 0x0C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C30, + 0x0FF0, 0x03C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'p' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03D8, 0x0FF8, + 0x0C38, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x0C38, + 0x0FF8, 0x03D8, 0x0018, 0x0018, 0x0018, 0x0018, 0x0018, 0x0000, +/** + * @brief 'q' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1BC0, 0x1FF0, + 0x1C30, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C30, + 0x1FF0, 0x1BC0, 0x1800, 0x1800, 0x1800, 0x1800, 0x1800, 0x0000, +/** + * @brief 'r' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x07B0, 0x03F0, + 0x0070, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, 0x0030, + 0x0030, 0x0030, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 's' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x03E0, 0x03F0, + 0x0E38, 0x0C18, 0x0038, 0x03F0, 0x07C0, 0x0C00, 0x0C18, 0x0E38, + 0x07F0, 0x03E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 't' + */ + 0x0000, 0x0000, 0x0080, 0x00C0, 0x00C0, 0x00C0, 0x07F0, 0x07F0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x07C0, 0x0780, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'u' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1818, 0x1818, + 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1818, 0x1C38, + 0x1FF0, 0x19E0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'v' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x180C, 0x0C18, + 0x0C18, 0x0C18, 0x0630, 0x0630, 0x0630, 0x0360, 0x0360, 0x0360, + 0x01C0, 0x01C0, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'w' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x41C1, 0x41C1, + 0x61C3, 0x6363, 0x6363, 0x6363, 0x3636, 0x3636, 0x3636, 0x1C1C, + 0x1C1C, 0x1C1C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'x' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x381C, 0x1C38, + 0x0C30, 0x0660, 0x0360, 0x0360, 0x0360, 0x0360, 0x0660, 0x0C30, + 0x1C38, 0x381C, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief 'y' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x3018, 0x1830, + 0x1830, 0x1870, 0x0C60, 0x0C60, 0x0CE0, 0x06C0, 0x06C0, 0x0380, + 0x0380, 0x0380, 0x0180, 0x0180, 0x01C0, 0x00F0, 0x0070, 0x0000, +/** + * @brief 'z' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x1FFC, 0x1FFC, + 0x0C00, 0x0600, 0x0300, 0x0180, 0x00C0, 0x0060, 0x0030, 0x0018, + 0x1FFC, 0x1FFC, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +/** + * @brief '{' + */ + 0x0000, 0x0300, 0x0180, 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x00C0, + 0x00C0, 0x0060, 0x0060, 0x0030, 0x0060, 0x0040, 0x00C0, 0x00C0, + 0x00C0, 0x00C0, 0x00C0, 0x00C0, 0x0180, 0x0300, 0x0000, 0x0000, +/** + * @brief '|' + */ + 0x0000, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0180, 0x0000, +/** + * @brief '}' + */ + 0x0000, 0x0060, 0x00C0, 0x01C0, 0x0180, 0x0180, 0x0180, 0x0180, + 0x0180, 0x0300, 0x0300, 0x0600, 0x0300, 0x0100, 0x0180, 0x0180, + 0x0180, 0x0180, 0x0180, 0x0180, 0x00C0, 0x0060, 0x0000, 0x0000, +/** + * @brief '~' + */ + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x10F0, 0x1FF8, 0x0F08, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, + 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, +}; diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/LCD_common/lcd_font.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/LCD_common/lcd_font.h new file mode 100644 index 0000000..24d49e7 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/LCD_common/lcd_font.h @@ -0,0 +1,45 @@ +/*! + \file lcd_font.h + \brief the header file of LCD font + + \version 2019-06-05, V1.0.0, demo for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef LCD_FONT_H +#define LCD_FONT_H + +#include + +extern unsigned char const ascii_8x16[1536]; + +extern const uint16_t ASCII_Table_16x24[]; + +#endif /* LCD_FONT_H */ + diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_eval.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_eval.c new file mode 100644 index 0000000..688c9ed --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_eval.c @@ -0,0 +1,247 @@ +/*! + \file gd32vf103v_eval.c + \brief firmware functions to manage leds, keys, COM ports + + \version 2019-06-05, V1.0.0, demo for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103v_eval.h" + +/* private variables */ +static uint32_t GPIO_PORT[LEDn] = {LED1_GPIO_PORT, LED2_GPIO_PORT, + LED3_GPIO_PORT, LED4_GPIO_PORT}; +static uint32_t GPIO_PIN[LEDn] = {LED1_PIN, LED2_PIN, LED3_PIN, LED4_PIN}; + +static rcu_periph_enum COM_CLK[COMn] = {EVAL_COM0_CLK, EVAL_COM1_CLK}; +static uint32_t COM_TX_PIN[COMn] = {EVAL_COM0_TX_PIN, EVAL_COM1_TX_PIN}; +static uint32_t COM_RX_PIN[COMn] = {EVAL_COM0_RX_PIN, EVAL_COM1_RX_PIN}; +static uint32_t COM_GPIO_PORT[COMn] = {EVAL_COM0_GPIO_PORT, EVAL_COM1_GPIO_PORT}; +static rcu_periph_enum COM_GPIO_CLK[COMn] = {EVAL_COM0_GPIO_CLK, EVAL_COM1_GPIO_CLK}; + +static rcu_periph_enum GPIO_CLK[LEDn] = {LED1_GPIO_CLK, LED2_GPIO_CLK, + LED3_GPIO_CLK, LED4_GPIO_CLK}; + +static uint32_t KEY_PORT[KEYn] = {KEY_A_GPIO_PORT, + KEY_B_GPIO_PORT, + KEY_C_GPIO_PORT, + KEY_D_GPIO_PORT, + KEY_CET_GPIO_PORT}; +static uint32_t KEY_PIN[KEYn] = {KEY_A_PIN, + KEY_B_PIN, + KEY_C_PIN, + KEY_D_PIN, + KEY_CET_PIN}; +static rcu_periph_enum KEY_CLK[KEYn] = {KEY_A_GPIO_CLK, + KEY_B_GPIO_CLK, + KEY_C_GPIO_CLK, + KEY_D_GPIO_CLK, + KEY_CET_GPIO_CLK}; +static exti_line_enum KEY_EXTI_LINE[KEYn] = {KEY_A_EXTI_LINE, + KEY_B_EXTI_LINE, + KEY_C_EXTI_LINE, + KEY_D_EXTI_LINE, + KEY_CET_EXTI_LINE}; +static uint8_t KEY_PORT_SOURCE[KEYn] = {KEY_A_EXTI_PORT_SOURCE, + KEY_B_EXTI_PORT_SOURCE, + KEY_C_EXTI_PORT_SOURCE, + KEY_D_EXTI_PORT_SOURCE, + KEY_CET_EXTI_PORT_SOURCE}; +static uint8_t KEY_PIN_SOURCE[KEYn] = {KEY_A_EXTI_PIN_SOURCE, + KEY_B_EXTI_PIN_SOURCE, + KEY_C_EXTI_PIN_SOURCE, + KEY_D_EXTI_PIN_SOURCE, + KEY_CET_EXTI_PIN_SOURCE}; +static uint8_t KEY_IRQn[KEYn] = {KEY_A_EXTI_IRQn, + KEY_B_EXTI_IRQn, + KEY_C_EXTI_IRQn, + KEY_D_EXTI_IRQn, + KEY_CET_EXTI_IRQn}; + +/*! + \brief configure led GPIO + \param[in] lednum: specify the led to be configured + \arg LED1 + \arg LED2 + \arg LED3 + \arg LED4 + \param[out] none + \retval none +*/ +void gd_eval_led_init(led_typedef_enum lednum) +{ + /* enable the led clock */ + rcu_periph_clock_enable(GPIO_CLK[lednum]); + /* configure led GPIO port */ + gpio_init(GPIO_PORT[lednum], GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN[lednum]); + + GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; +} + +/*! + \brief turn on selected led + \param[in] lednum: specify the led to be turned on + \arg LED1 + \arg LED2 + \arg LED3 + \arg LED4 + \param[out] none + \retval none +*/ +void gd_eval_led_on(led_typedef_enum lednum) +{ + GPIO_BOP(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; +} + +/*! + \brief turn off selected led + \param[in] lednum: specify the led to be turned off + \arg LED1 + \arg LED2 + \arg LED3 + \arg LED4 + \param[out] none + \retval none +*/ +void gd_eval_led_off(led_typedef_enum lednum) +{ + GPIO_BC(GPIO_PORT[lednum]) = GPIO_PIN[lednum]; +} + +/*! + \brief toggle selected led + \param[in] lednum: specify the led to be toggled + \arg LED1 + \arg LED2 + \arg LED3 + \arg LED4 + \param[out] none + \retval none +*/ +void gd_eval_led_toggle(led_typedef_enum lednum) +{ + gpio_bit_write(GPIO_PORT[lednum], GPIO_PIN[lednum], + (bit_status)(1-gpio_input_bit_get(GPIO_PORT[lednum], GPIO_PIN[lednum]))); +} + +/*! + \brief configure key + \param[in] key_num: specify the key to be configured + \arg KEY_A: wakeup key + \arg KEY_B: tamper key + \arg KEY_C: user key + \arg KEY_D: user key + \arg KEY_CET: user key + \param[in] key_mode: specify button mode + \arg KEY_MODE_GPIO: key will be used as simple IO + \arg KEY_MODE_EXTI: key will be connected to EXTI line with interrupt + \param[out] none + \retval none +*/ + +void gd_eval_key_init(key_typedef_enum key_num, keymode_typedef_enum key_mode) +{ + /* enable the key clock */ + rcu_periph_clock_enable(KEY_CLK[key_num]); + rcu_periph_clock_enable(RCU_AF); + + /* configure button pin as input */ + gpio_init(KEY_PORT[key_num], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, KEY_PIN[key_num]); + + if (key_mode == KEY_MODE_EXTI) { + /* enable and set key EXTI interrupt to the lowest priority */ + eclic_global_interrupt_enable(); + eclic_irq_enable(KEY_IRQn[key_num],1, 1); + + /* connect key EXTI line to key GPIO pin */ + gpio_exti_source_select(KEY_PORT_SOURCE[key_num], KEY_PIN_SOURCE[key_num]); + + /* configure key EXTI line */ + exti_init(KEY_EXTI_LINE[key_num], EXTI_INTERRUPT, EXTI_TRIG_FALLING); + exti_interrupt_flag_clear(KEY_EXTI_LINE[key_num]); + } +} + +/*! + \brief return the selected key state + \param[in] key: specify the key to be checked + \arg KEY_A: wakeup key + \arg KEY_B: tamper key + \arg KEY_C: user key + \arg KEY_D: user key + \arg KEY_CET: user key + \param[out] none + \retval the key's GPIO pin value +*/ +uint8_t gd_eval_key_state_get(key_typedef_enum key) +{ + return gpio_input_bit_get(KEY_PORT[key], KEY_PIN[key]); +} + +/*! + \brief configure COM port + \param[in] com: COM on the board + \arg EVAL_COM0: COM0 on the board + \arg EVAL_COM1: COM1 on the board + \param[out] none + \retval none +*/ +void gd_eval_com_init(uint32_t com) +{ + uint32_t com_id = 0U; + if(EVAL_COM0 == com){ + com_id = 0U; + }else if(EVAL_COM1 == com){ + com_id = 1U; + } + + /* enable GPIO clock */ + rcu_periph_clock_enable(COM_GPIO_CLK[com_id]); + + /* enable USART clock */ + rcu_periph_clock_enable(COM_CLK[com_id]); + + /* connect port to USARTx_Tx */ + gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, COM_TX_PIN[com_id]); + + /* connect port to USARTx_Rx */ + gpio_init(COM_GPIO_PORT[com_id], GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, COM_RX_PIN[com_id]); + + /* USART configure */ + usart_deinit(com); + usart_baudrate_set(com, 115200U); + usart_word_length_set(com, USART_WL_8BIT); + usart_stop_bit_set(com, USART_STB_1BIT); + usart_parity_config(com, USART_PM_NONE); + usart_hardware_flow_rts_config(com, USART_RTS_DISABLE); + usart_hardware_flow_cts_config(com, USART_CTS_DISABLE); + usart_receive_config(com, USART_RECEIVE_ENABLE); + usart_transmit_config(com, USART_TRANSMIT_ENABLE); + usart_enable(com); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_eval.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_eval.h new file mode 100644 index 0000000..3a2fcb6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_eval.h @@ -0,0 +1,168 @@ +/*! + \file gd32vf103v_eval.h + \brief definitions for GD32VF103V_EVAL's leds, keys and COM ports hardware resources + + \version 2019-06-05, V1.0.0, demo for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103V_EVAL_H +#define GD32VF103V_EVAL_H + +#ifdef cplusplus + extern "C" { +#endif + +#include "gd32vf103.h" + +/* exported types */ +typedef enum +{ + LED1 = 0, + LED2 = 1, + LED3 = 2, + LED4 = 3 +} led_typedef_enum; + +typedef enum +{ + KEY_A = 0, + KEY_B = 1, + KEY_C = 2, + KEY_D = 3, + KEY_CET = 4 +} key_typedef_enum; + +typedef enum +{ + KEY_MODE_GPIO = 0, + KEY_MODE_EXTI = 1 +} keymode_typedef_enum; + +/* eval board low layer led */ +#define LEDn 4U + +#define LED1_PIN GPIO_PIN_0 +#define LED1_GPIO_PORT GPIOC +#define LED1_GPIO_CLK RCU_GPIOC + +#define LED2_PIN GPIO_PIN_2 +#define LED2_GPIO_PORT GPIOC +#define LED2_GPIO_CLK RCU_GPIOC + +#define LED3_PIN GPIO_PIN_0 +#define LED3_GPIO_PORT GPIOE +#define LED3_GPIO_CLK RCU_GPIOE + +#define LED4_PIN GPIO_PIN_1 +#define LED4_GPIO_PORT GPIOE +#define LED4_GPIO_CLK RCU_GPIOE + +#define COMn 2U + +#define EVAL_COM0 USART0 +#define EVAL_COM0_CLK RCU_USART0 +#define EVAL_COM0_TX_PIN GPIO_PIN_9 +#define EVAL_COM0_RX_PIN GPIO_PIN_10 +#define EVAL_COM0_GPIO_PORT GPIOA +#define EVAL_COM0_GPIO_CLK RCU_GPIOA + +#define EVAL_COM1 USART1 +#define EVAL_COM1_CLK RCU_USART1 +#define EVAL_COM1_TX_PIN GPIO_PIN_2 +#define EVAL_COM1_RX_PIN GPIO_PIN_3 +#define EVAL_COM1_GPIO_PORT GPIOA +#define EVAL_COM1_GPIO_CLK RCU_GPIOA + +#define KEYn 5U + +/* wakeup push-button */ +#define KEY_A_PIN GPIO_PIN_0 +#define KEY_A_GPIO_PORT GPIOA +#define KEY_A_GPIO_CLK RCU_GPIOA +#define KEY_A_EXTI_LINE EXTI_0 +#define KEY_A_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOA +#define KEY_A_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_0 +#define KEY_A_EXTI_IRQn EXTI0_IRQn + +/* tamper push-button */ +#define KEY_B_PIN GPIO_PIN_13 +#define KEY_B_GPIO_PORT GPIOC +#define KEY_B_GPIO_CLK RCU_GPIOC +#define KEY_B_EXTI_LINE EXTI_13 +#define KEY_B_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOC +#define KEY_B_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_13 +#define KEY_B_EXTI_IRQn EXTI10_15_IRQn + +/* user push-button */ +#define KEY_C_PIN GPIO_PIN_14 +#define KEY_C_GPIO_PORT GPIOB +#define KEY_C_GPIO_CLK RCU_GPIOB +#define KEY_C_EXTI_LINE EXTI_14 +#define KEY_C_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOB +#define KEY_C_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_14 +#define KEY_C_EXTI_IRQn EXTI10_15_IRQn + +#define KEY_D_PIN GPIO_PIN_5 +#define KEY_D_GPIO_PORT GPIOC +#define KEY_D_GPIO_CLK RCU_GPIOC +#define KEY_D_EXTI_LINE EXTI_5 +#define KEY_D_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOC +#define KEY_D_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_5 +#define KEY_D_EXTI_IRQn EXTI5_9_IRQn + +#define KEY_CET_PIN GPIO_PIN_4 +#define KEY_CET_GPIO_PORT GPIOC +#define KEY_CET_GPIO_CLK RCU_GPIOC +#define KEY_CET_EXTI_LINE EXTI_4 +#define KEY_CET_EXTI_PORT_SOURCE GPIO_PORT_SOURCE_GPIOC +#define KEY_CET_EXTI_PIN_SOURCE GPIO_PIN_SOURCE_4 +#define KEY_CET_EXTI_IRQn EXTI4_IRQn + +/* function declarations */ +/* configure led GPIO */ +void gd_eval_led_init(led_typedef_enum lednum); +/* turn on selected led */ +void gd_eval_led_on(led_typedef_enum lednum); +/* turn off selected led */ +void gd_eval_led_off(led_typedef_enum lednum); +/* toggle the selected led */ +void gd_eval_led_toggle(led_typedef_enum lednum); +/* configure key */ +void gd_eval_key_init(key_typedef_enum key_num, keymode_typedef_enum key_mode); +/* return the selected key state */ +uint8_t gd_eval_key_state_get(key_typedef_enum key); +/* configure COM port */ +void gd_eval_com_init(uint32_t com); + +#ifdef cplusplus +} +#endif + +#endif /* GD32VF103V_EVAL_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_lcd_eval.c b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_lcd_eval.c new file mode 100644 index 0000000..6c96741 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_lcd_eval.c @@ -0,0 +1,607 @@ +/*! + \file gd32vf103v_lcd_eval.c + \brief LCD driver functions + + \version 2019-06-05, V1.0.1, demo for GD32VF103 + \version 2019-09-18, V1.0.2, demo for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "gd32vf103v_lcd_eval.h" +#include "lcd_font.h" + +#define LCD_ILI9320 0x9320 +#define LCD_ILI9325 0x9325 + +#define ABS(X) ((X) > 0 ? (X) : -(X)) + +uint16_t device_code; + +/*! + \brief lcd peripheral initialize + \param[in] none + \param[out] none + \retval none +*/ +void exmc_lcd_init(void) +{ + exmc_norsram_parameter_struct lcd_init_struct; + exmc_norsram_timing_parameter_struct lcd_timing_init_struct; + + /* EXMC clock enable */ + rcu_periph_clock_enable(RCU_EXMC); + rcu_periph_clock_enable(RCU_AF); + /* GPIO clock enable */ + rcu_periph_clock_enable(RCU_GPIOD); + rcu_periph_clock_enable(RCU_GPIOE); + + /* configure EXMC_D[0~15]*/ + /* PD14(EXMC_D0), PD15(EXMC_D1),PD0(EXMC_D2), PD1(EXMC_D3), PD8(EXMC_D13), PD9(EXMC_D14), PD10(EXMC_D15) */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0 | GPIO_PIN_1| GPIO_PIN_8 | GPIO_PIN_9 | + GPIO_PIN_10 | GPIO_PIN_14 | GPIO_PIN_15); + + /* PE7(EXMC_D4), PE8(EXMC_D5), PE9(EXMC_D6), PE10(EXMC_D7), PE11(EXMC_D8), PE12(EXMC_D9), + PE13(EXMC_D10), PE14(EXMC_D11), PE15(EXMC_D12) */ + gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, 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); + + /* configure PE2(EXMC_A23) */ + gpio_init(GPIOE, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); + + /* configure NOE and NWE */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4 | GPIO_PIN_5); + + /* configure EXMC NE0 */ + gpio_init(GPIOD, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_7); + + lcd_timing_init_struct.bus_latency = 2; + lcd_timing_init_struct.asyn_data_setuptime = 10; + lcd_timing_init_struct.asyn_address_holdtime = 2; + lcd_timing_init_struct.asyn_address_setuptime = 5; + + lcd_init_struct.norsram_region = EXMC_BANK0_NORSRAM_REGION0; + lcd_init_struct.asyn_wait = DISABLE; + lcd_init_struct.nwait_signal = DISABLE; + lcd_init_struct.memory_write = ENABLE; + lcd_init_struct.nwait_polarity = EXMC_NWAIT_POLARITY_LOW; + lcd_init_struct.databus_width = EXMC_NOR_DATABUS_WIDTH_16B; + lcd_init_struct.memory_type = EXMC_MEMORY_TYPE_SRAM; + lcd_init_struct.address_data_mux = ENABLE; + lcd_init_struct.read_write_timing = &lcd_timing_init_struct; + + exmc_norsram_init(&lcd_init_struct); + + exmc_norsram_enable(EXMC_BANK0_NORSRAM_REGION0); +} + + +/*! + \brief write data to the selected LCD register + \param[in] register_id: the selected register id + \param[in] value: the register value to be written + \param[out] none + \retval none +*/ + +void lcd_register_write(uint16_t register_id,uint16_t value) +{ + *(__IO uint16_t *) (BANK0_LCD_C)= register_id; + *(__IO uint16_t *) (BANK0_LCD_D)= value; +} + +/*! + \brief read the value of LCD register + \param[in] register_id: the register id + \param[out] none + \retval the register value +*/ +uint16_t lcd_register_read(uint8_t register_id) +{ + uint16_t data; + *(__IO uint16_t *) (BANK0_LCD_C)= register_id; + data = *(__IO uint16_t *) (BANK0_LCD_D); + return data; +} + +/*! + \brief write command to LCD register + \param[in] value: the register value to be written + \param[out] none + \retval none +*/ +void lcd_command_write(uint16_t value) +{ + /* write 16-bit index, then write reg */ + *(__IO uint16_t *) (BANK0_LCD_C) = value; +} + +/*! + \brief prepare to write to the LCD GRAM register(R22h) + \param[in] none + \param[out] none + \retval none +*/ +void lcd_gram_write_prepare(void) +{ + *(__IO uint16_t *) (BANK0_LCD_C) = 0x0022; +} + +/*! + \brief write RGB code to the LCD GRAM register + \param[in] rgb_code: the pixel color in RGB mode (5-6-5) + \param[out] none + \retval none +*/ +void lcd_gram_write(uint16_t rgb_code) +{ + /* write 16-bit GRAM register */ + *(__IO uint16_t *) (BANK0_LCD_D) = rgb_code; +} + +/*! + \brief read data from GRAM + \param[in] none + \param[out] none + \retval GRAM value +*/ +uint16_t lcd_gram_read(void) +{ + uint16_t data; + + /* write GRAM register (R22h) */ + *(__IO uint16_t *) (BANK0_LCD_C) = 0x0022; + /* dummy read (invalid data) */ + data = *(__IO uint16_t *) (BANK0_LCD_D); + + data = *(__IO uint16_t *) (BANK0_LCD_D); + return data; +} + +/*! + \brief initialize the LCD + \param[in] none + \param[out] none + \retval none +*/ +void lcd_init(void) +{ + __IO uint16_t i; + + /* read the LCD controller device code */ + device_code = lcd_register_read(0x0000); + + if(0x8989 == device_code){ // SSD1289 + lcd_register_write(0x0000,0x0001); + lcd_register_write(0x0003,0xA8A4); + lcd_register_write(0x000C,0x0000); + lcd_register_write(0x000D,0x080C); + lcd_register_write(0x000E,0x2B00); + lcd_register_write(0x001E,0x00B0); + lcd_register_write(0x0001,0x2B3F); + lcd_register_write(0x0002,0x0600); + lcd_register_write(0x0010,0x0000); + lcd_register_write(0x0011,0x6070); + lcd_register_write(0x0005,0x0000); + lcd_register_write(0x0006,0x0000); + lcd_register_write(0x0016,0xEF1C); + lcd_register_write(0x0017,0x0003); + lcd_register_write(0x0007,0x0233); + lcd_register_write(0x000B,0x0000); + lcd_register_write(0x000F,0x0000); + lcd_register_write(0x0041,0x0000); + lcd_register_write(0x0042,0x0000); + lcd_register_write(0x0048,0x0000); + lcd_register_write(0x0049,0x013F); + lcd_register_write(0x004A,0x0000); + lcd_register_write(0x004B,0x0000); + lcd_register_write(0x0044,0xEF00); + lcd_register_write(0x0045,0x0000); + lcd_register_write(0x0046,0x013F); + lcd_register_write(0x0030,0x0707); + lcd_register_write(0x0031,0x0204); + lcd_register_write(0x0032,0x0204); + lcd_register_write(0x0033,0x0502); + lcd_register_write(0x0034,0x0507); + lcd_register_write(0x0035,0x0204); + lcd_register_write(0x0036,0x0204); + lcd_register_write(0x0037,0x0502); + lcd_register_write(0x003A,0x0302); + lcd_register_write(0x003B,0x0302); + lcd_register_write(0x0023,0x0000); + lcd_register_write(0x0024,0x0000); + lcd_register_write(0x0025,0x8000); + lcd_register_write(0x004e,0); + lcd_register_write(0x004f,0); + }else if((0x9320 == device_code) || (0x9300 == device_code)){ //ILI9320 + lcd_register_write(0x01,0x0100); //driver output control + lcd_register_write(0x02,0x0700); //lcd driver waveform control + lcd_register_write(0x03,0x1020); //entry mode set + + lcd_register_write(0x04,0x0000); //resizing control + lcd_register_write(0x08,0x0202); //display control 2 + lcd_register_write(0x09,0x0000); //display control 3 + lcd_register_write(0x0a,0x0000); //frame cycle control + lcd_register_write(0x0c,(1<<0)); //extern display interface control 1 + lcd_register_write(0x0d,0x0000); //frame maker position + lcd_register_write(0x0f,0x0000); //extern display interface control 2 + + for(i=50000;i>0;i--); + lcd_register_write(0x07,0x0101); //display control + for(i=50000;i>0;i--); + + lcd_register_write(0x10,(1<<12)|(0<<8)|(1<<7)|(1<<6)|(0<<4)); //power control 1 + lcd_register_write(0x11,0x0007); //power control 2 + lcd_register_write(0x12,(1<<8)|(1<<4)|(0<<0)); //power control 3 + lcd_register_write(0x13,0x0b00); //power control 4 + lcd_register_write(0x29,0x0000); //power control 7 + lcd_register_write(0x2b,(1<<14)|(1<<4)); + lcd_register_write(0x50,0); //set x start + lcd_register_write(0x51,239); //set x end + lcd_register_write(0x52,0); //set y start + lcd_register_write(0x53,319); //set y end + + lcd_register_write(0x60,0x2700); //driver output control + lcd_register_write(0x61,0x0001); //driver output control + lcd_register_write(0x6a,0x0000); //vertical srcoll control + + lcd_register_write(0x80,0x0000); //display position? partial display 1 + lcd_register_write(0x81,0x0000); //ram address start? partial display 1 + lcd_register_write(0x82,0x0000); //ram address end-partial display 1 + lcd_register_write(0x83,0x0000); //display position? partial display 2 + lcd_register_write(0x84,0x0000); //ram address start? partial display 2 + lcd_register_write(0x85,0x0000); //ram address end? partial display 2 + + lcd_register_write(0x90,(0<<7)|(16<<0)); //frame cycle control + lcd_register_write(0x92,0x0000); //panel interface control 2 + lcd_register_write(0x93,0x0001); //panel interface control 3 + lcd_register_write(0x95,0x0110); //frame cycle control + lcd_register_write(0x97,(0<<8)); + lcd_register_write(0x98,0x0000); //frame cycle control + for(i=50000;i>0;i--); + lcd_register_write(0x07,0x0173); + for(i=50000;i>0;i--); + + }else{ + return; + } + + for(i=50000;i>0;i--); +} + +/*! + \brief set the cursor of LCD + \param[in] x: the row-coordinate + \param[in] y: the column-coordinate + \param[out] none + \retval none +*/ +void lcd_cursor_set(uint16_t x,uint16_t y) +{ + lcd_register_write(0x004e,x); + lcd_register_write(0x004f,y); +} + +/*! + \brief clear the LCD screen to the specified color + \param[in] color: specified screen color + \param[out] none + \retval none +*/ +void lcd_clear(uint16_t color) +{ + uint32_t index=0; + if(0x8989 == device_code){ // SSD1289 + lcd_cursor_set(0,0); + /* prepare to write GRAM */ + lcd_gram_write_prepare(); + for(index=0; index LCD_PIXEL_HEIGHT)||(y > LCD_PIXEL_WIDTH)){ + return; + } + if(0x8989 == device_code){ // SSD1289 + lcd_cursor_set(x,y); + lcd_gram_write_prepare(); + lcd_gram_write(point); + }else if((0x9320 == device_code) || (0x9300 == device_code)){ //ILI9320 + lcd_register_write(0x20, x); + lcd_register_write(0x21, y); + lcd_register_write(0x22, point); + } + +} + +/*! + \brief get point GRAM according to the specified position + \param[in] x: the row-coordinate + \param[in] y: the column-coordinate + \param[out] none + \retval GRAM value of point +*/ +uint16_t lcd_point_get(uint16_t x,uint16_t y) +{ + uint16_t data; + + if ((x > LCD_PIXEL_HEIGHT)||(y > LCD_PIXEL_WIDTH)){ + return 0; + } + + lcd_cursor_set(x,y); + data = lcd_gram_read(); + + return data; +} + +/*! + \brief set window area + \param[in] start_x: the start position of row-coordinate + \param[in] start_y: the start position of column-coordinate + \param[in] end_x: the end position of row-coordinate + \param[in] end_y: the end position of column-coordinate + \param[out] none + \retval none +*/ +void lcd_windows_set(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y) +{ + lcd_cursor_set(start_x, start_y); + + lcd_register_write(0x0050, start_x); + lcd_register_write(0x0052, start_y); + lcd_register_write(0x0051, end_x); + lcd_register_write(0x0053, end_y); +} + +/*! + \brief draw a horizontal line on LCD screen + \param[in] x: the row-coordinate + \param[in] start_y: the start column-coordinate + \param[in] end_y: the end column-coordinate + \param[in] color: specified color of the point + \param[in] width: line width + \param[out] none + \retval none +*/ + +void lcd_hline_draw(uint16_t x,uint16_t start_y,uint16_t end_y,uint16_t color,uint16_t width) +{ + uint16_t i, y; + + for (i = 0; i < width; i++) { + uint16_t sx = x + i; + + for (y = start_y; y < end_y; y++) { + lcd_point_set(sx, y, color); + } + } +} + +/*! + \brief draw a vertical line on LCD screen + \param[in] start_x: the start column-coordinate + \param[in] end_x: the end column-coordinate + \param[in] y: the row-coordinate + \param[in] color: specified color of the point + \param[in] width: line width + \param[out] none + \retval none +*/ + +void lcd_vline_draw(uint16_t start_x,uint16_t end_x,uint16_t y,uint16_t color,uint16_t width) +{ + uint16_t i, x; + + for (i = 0; i < width; i++) { + uint16_t sy = y + i; + + for (x = start_x; x < end_x; x++) { + lcd_point_set(x, sy, color); + } + } +} + +/*! + \brief draw a rectangle according to the specified position and color + \param[in] start_x: the start position of row-coordinate + \param[in] start_y: the start position of column-coordinate + \param[in] end_x: the end position of row-coordinate + \param[in] end_y: the end position of column-coordinate + \param[in] point: specified color of the point + \param[out] none + \retval none +*/ +void lcd_rectangle_draw(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t point) +{ + uint16_t x,y; + x=start_x; + y=start_y; + /* draw four lines */ + for(x=start_x;xstart_x;x--){ + lcd_point_set(x,y,point); + } + for(y=end_y;y>start_y;y--){ + lcd_point_set(x,y,point); + } +} + +/*! + \brief fill the specified color to a rectangle + \param[in] start_x: the start position of row-coordinate + \param[in] start_y: the start position of column-coordinate + \param[in] end_x: the end position of row-coordinate + \param[in] end_y: the end position of column-coordinate + \param[in] color: specified color + \param[out] none + \retval none +*/ +void lcd_rectangle_fill(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t color) +{ + uint16_t x, y; + x = start_x; + y = start_y; + + for (x = start_x; x < end_x; x++) { + for (y = start_y; y < end_y; y++) { + lcd_point_set(x, y, color); + } + } +} + +/*! + \brief draw a picture on LCD screen according to the specified position + \param[in] start_x: the start position of row-coordinate + \param[in] start_y: the start position of column-coordinate + \param[in] end_x: the end position of row-coordinate + \param[in] end_y: the end position of column-coordinate + \param[in] pic: the picture pointer + \param[out] none + \retval none +*/ +void lcd_picture_draw(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t *pic) +{ + uint32_t i, total; + uint16_t *picturepointer = pic; + uint16_t x,y; + + x = start_x; + y = start_y; + + total = (end_x - start_x + 1) * (end_y - start_y + 1); + + for(i = 0; i < total; i ++){ + /* set point according to the specified position and color */ + lcd_point_set(x,y,*picturepointer++); + x++; + if(x > end_x){ + y++; + x = start_x; + } + } +} + +/*! + \brief display a char on LCD screen according to the specified position + \param[in] x: the start position of row-coordinate + \param[in] y: the start position of column-coordinate + \param[in] c: the char + \param[in] char_color: the color of char + \param[in] c_format: the structure of char format + font: CHAR_FONT_8_16 or CHAR_FONT_16_24 + direction: CHAR_DIRECTION_HORIZONTAL or CHAR_DIRECTION_VERTICAL + char_color: the color of char + bk_color: the color of background + \param[out] none + \retval none +*/ +void lcd_char_display(uint16_t x,uint16_t y,uint8_t c,char_format_struct c_format) +{ + uint16_t i = 0, j = 0; + uint8_t temp_char = 0; + uint16_t temp_char_16 = 0; + + if(CHAR_FONT_8_16 == c_format.font){ /* 8x16 ASCII */ + for (i = 0; i < 16; i++) { + temp_char = ascii_8x16[((c - 0x20) * 16) + i]; + if(CHAR_DIRECTION_HORIZONTAL == c_format.direction){ + for (j = 0; j < 8; j++) { + if (((temp_char >> (7 - j)) & 0x01) == 0x01) { + /* set point of char */ + lcd_point_set(x - i, y + j, c_format.char_color); + } else { + /* set point of background */ + lcd_point_set(x - i, y + j, c_format.bk_color); + } + } + }else{ + for (j = 0; j < 8; j++) { + if (((temp_char >> (7 - j)) & 0x01) == 0x01) { + /* set point of char */ + lcd_point_set(x + j, y + i, c_format.char_color); + } else { + /* set point of background */ + lcd_point_set(x + j, y + i, c_format.bk_color); + } + } + } + } + }else if(CHAR_FONT_16_24 == c_format.font){ /* 16x24 ASCII */ + for (i = 0; i < 24; i++) { + temp_char_16 = ASCII_Table_16x24[((c - 0x20) * 24) + i]; + if(CHAR_DIRECTION_HORIZONTAL == c_format.direction){ + for (j = 0; j < 16; j++) { + if (((temp_char_16 >> j) & 0x01) == 0x01) { + /* set point of char */ + lcd_point_set(x - i, y + j, c_format.char_color); + } else { + /* set point of background */ + lcd_point_set(x - i, y + j, c_format.bk_color); + } + } + }else{ + for (j = 0; j < 16; j++) { + if (((temp_char_16 >> j) & 0x01) == 0x01) { + /* set point of char */ + lcd_point_set(x + j, y + i, c_format.char_color); + } else { + /* set point of background */ + lcd_point_set(x + j, y + i, c_format.bk_color); + } + } + } + } + } +} diff --git a/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_lcd_eval.h b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_lcd_eval.h new file mode 100644 index 0000000..29ed44b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/GD32VF103_Firmware_Library_V1.0.1/Utilities/gd32vf103v_lcd_eval.h @@ -0,0 +1,237 @@ +/*! + \file gd32vf103v_lcd_eval.h + \brief LCD driver header file + + \version 2019-06-05, V1.0.0, demo for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103V_LCD_EVAL_H +#define GD32VF103V_LCD_EVAL_H + +#include "gd32vf103.h" + +#define BANK0_LCD_C ((uint32_t)0x60000000) /*!< LCD register address */ +#define BANK0_LCD_D ((uint32_t)0x61000000) /*!< LCD data address */ + +/* 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 R11 0x0B +#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 R35 0x23 +#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 R58 0x3A +#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 LCD_COLOR_WHITE 0xFFFF +#define LCD_COLOR_BLACK 0x0000 +#define LCD_COLOR_GREY 0xF7DE +#define LCD_COLOR_BLUE 0x001F +#define LCD_COLOR_BLUE2 0x051F +#define LCD_COLOR_RED 0xF800 +#define LCD_COLOR_MAGENTA 0xF81F +#define LCD_COLOR_GREEN 0x07E0 +#define LCD_COLOR_CYAN 0x7FFF +#define LCD_COLOR_YELLOW 0xFFE0 + +/* definitions of LCD lines */ +#define LCD_LINE_0 0 +#define LCD_LINE_1 24 +#define LCD_LINE_2 48 +#define LCD_LINE_3 72 +#define LCD_LINE_4 96 +#define LCD_LINE_5 120 +#define LCD_LINE_6 144 +#define LCD_LINE_7 168 +#define LCD_LINE_8 192 +#define LCD_LINE_9 216 + +#define CHAR_FONT_8_16 ((uint16_t)0x0000U) /*!< the font of char is 8X16 */ +#define CHAR_FONT_16_24 ((uint16_t)0x0001U) /*!< the font of char is 16X24 */ + +#define CHAR_DIRECTION_HORIZONTAL ((uint16_t)0x0000U) /*!< character display direction is horizontal */ +#define CHAR_DIRECTION_VERTICAL ((uint16_t)0x0001U) /*!< character display direction is vertical */ + +#define LCD_PIXEL_WIDTH ((uint16_t)320) +#define LCD_PIXEL_HEIGHT ((uint16_t)240) + +/* char format struct definitions */ +typedef struct +{ + uint16_t font; /*!< the type of font */ + uint16_t direction; /*!< the direction of char */ + uint16_t char_color; /*!< the color of char */ + uint16_t bk_color; /*!< the color of backgroud */ +}char_format_struct; + +/* lcd peripheral initialize */ +void exmc_lcd_init(void); +/* initialize the LCD */ +void lcd_init(void); +/* write data to the selected LCD register */ +void lcd_register_write(uint16_t register_id,uint16_t value); +/* read the value of LCD register */ +uint16_t lcd_register_read(uint8_t register_id); +/* write command to LCD register */ +void lcd_command_write (uint16_t value); +/* prepare to write to the LCD GRAM */ +void lcd_gram_write_prepare(void); +/* write RGB code to the LCD GRAM register */ +void lcd_gram_write(uint16_t rgb_code); +/* read data from GRAM */ +uint16_t lcd_gram_read(void); +/* set the cursor of LCD */ +void lcd_cursor_set(uint16_t x,uint16_t y); +/* clear the LCD screen to the specified color */ +void lcd_clear(uint16_t Color); +/* set the point according to the specified position and color */ +void lcd_point_set(uint16_t x,uint16_t y,uint16_t point); +/* get the point according to the specified position */ +uint16_t lcd_point_get(uint16_t x,uint16_t y); +/* set window area */ +void lcd_windows_set(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y); +/* draw a horizontal line on LCD screen */ +void lcd_hline_draw(uint16_t x,uint16_t start_y,uint16_t end_y,uint16_t color,uint16_t width); +/* draw a vertical line on LCD screen */ +void lcd_vline_draw(uint16_t start_x,uint16_t end_x,uint16_t y,uint16_t color,uint16_t width); +/* draw a rectangle according to the specified position and color */ +void lcd_rectangle_draw(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t point); +/* fill the specified color to a rectangle */ +void lcd_rectangle_fill(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t color); +/* draw a picture on LCD screen according to the specified position */ +void lcd_picture_draw(uint16_t start_x,uint16_t start_y,uint16_t end_x,uint16_t end_y,uint16_t *pic); +/* display a char on LCD screen according to the specified position */ +void lcd_char_display(uint16_t x,uint16_t y,uint8_t c,char_format_struct c_format); + +#endif /* GD32VF103V_LCD_EVAL_H */ diff --git a/firmware/midi2cv/src/drivers/usbfs/midi.c b/firmware/midi2cv/src/drivers/usbfs/midi.c new file mode 100644 index 0000000..9778a39 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/midi.c @@ -0,0 +1,319 @@ +/* + MIT License + + Copyright (c) 2019 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#include +#include "midi.h" + +typedef enum _Parse_MIDI_Message_Event { + PARSE_MIDI_EVENT_RCV_STS_CH_MSG_1 = 0, + PARSE_MIDI_EVENT_RCV_STS_CH_MSG_2, + PARSE_MIDI_EVENT_RCV_SYS_RT, + PARSE_MIDI_EVENT_RCV_DAT, + PARSE_MIDI_EVENT_RCV_SYS_EX_START, + PARSE_MIDI_EVENT_RCV_SYS_EX_EOX, + NUM_OF_PARSE_MIDI_MESSAGE_EVENT +}Parse_MIDI_Message_Event_t; + +typedef struct _Parse_MIDI_FSM { + Parse_MIDI_Message_State_t next; + void (*pTransStateFunc)(MIDI_Handle_t *phMIDI, uint8_t msg); +}Parse_MIDI_FSM_t; + + +MIDI_Handle_t *MIDI_Alloc(void); +void MIDI_Free(MIDI_Handle_t *phMIDI); + + +static inline Parse_MIDI_Message_Event_t _GetParseMIDIMessageEvent(uint8_t msg) { + + if ( (msg & 0x80) == 0 ) { + return PARSE_MIDI_EVENT_RCV_DAT; + } + else if ( (msg & 0xF0) == 0xF0 ) { + switch ( msg ) { + case 0xF0: + return PARSE_MIDI_EVENT_RCV_SYS_EX_START; + + case 0xF7: + return PARSE_MIDI_EVENT_RCV_SYS_EX_EOX; + + default: + return PARSE_MIDI_EVENT_RCV_SYS_RT; + } + } + else { + + switch ( msg & 0xF0 ) { + case 0x80: + case 0x90: + case 0xA0: + case 0xB0: + case 0xE0: + return PARSE_MIDI_EVENT_RCV_STS_CH_MSG_2; + + case 0xC0: + case 0xD0: + return PARSE_MIDI_EVENT_RCV_STS_CH_MSG_1; + + default: + // unexpected + return PARSE_MIDI_EVENT_RCV_SYS_RT; + } + } + +} + + +static void _StoreChannelMessageStatus(MIDI_Handle_t *phMIDI, uint8_t msg); +static void _StoreChannelMessageData(MIDI_Handle_t *phMIDI, uint8_t msg); +static void _StoreSystemExclusiveMessage(MIDI_Handle_t *phMIDI, uint8_t msg); +static void _ExecChannelMessage1(MIDI_Handle_t *phMIDI, uint8_t msg); +static void _ExecChannelMessage2(MIDI_Handle_t *phMIDI, uint8_t msg); +static void _ExecSystemExclusiveMessage(MIDI_Handle_t *phMIDI, uint8_t msg); + +static const Parse_MIDI_FSM_t _midi_trans_state_tbl[NUM_OF_PARSE_MIDI_MESSAGE_STATE][NUM_OF_PARSE_MIDI_MESSAGE_EVENT] = { + /* IDLE */ + { + {PARSE_MIDI_CH_MSG_1, _StoreChannelMessageStatus}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_CH_MSG_2_1, _StoreChannelMessageStatus}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_RT + {PARSE_MIDI_IDLE, NULL}, // RCV_DAT + {PARSE_MIDI_SYS_EX, _StoreSystemExclusiveMessage}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_EOX + }, + /* CH_MSG_1 */ + { + {PARSE_MIDI_IDLE, NULL}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_IDLE, NULL}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_RT + {PARSE_MIDI_CH_MSG_RUNNING_1, _ExecChannelMessage1}, // RCV_DAT + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_EOX + }, + /* CH_MSG_2_1 */ + { + {PARSE_MIDI_IDLE, NULL}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_IDLE, NULL}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_RT + {PARSE_MIDI_CH_MSG_2_2, _StoreChannelMessageData}, // RCV_DAT + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_EOX + }, + /* CH_MSG_2_2 */ + { + {PARSE_MIDI_IDLE, NULL}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_IDLE, NULL}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_RT + {PARSE_MIDI_CH_MSG_RUNNING_2, _ExecChannelMessage2}, // RCV_DAT + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_EOX + }, + /* CH_MSG_RUNNING_1 */ + { + {PARSE_MIDI_CH_MSG_1, _StoreChannelMessageStatus}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_CH_MSG_2_1, _StoreChannelMessageStatus}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_RT + {PARSE_MIDI_CH_MSG_RUNNING_1, _ExecChannelMessage1}, // RCV_DAT + {PARSE_MIDI_SYS_EX, NULL}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_EOX + }, + /* CH_MSG_RUNNING_2 */ + { + {PARSE_MIDI_CH_MSG_1, _StoreChannelMessageStatus}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_CH_MSG_2_1, _StoreChannelMessageStatus}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_RT + {PARSE_MIDI_CH_MSG_2_2, _StoreChannelMessageData}, // RCV_DAT + {PARSE_MIDI_SYS_EX, NULL}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, NULL}, // RCV_SYS_EX_EOX + }, + /* PARSE_MIDI_SYS_EX */ + { + {PARSE_MIDI_SYS_EX, _StoreSystemExclusiveMessage}, // RCV_STS_CH_MSG_1 + {PARSE_MIDI_SYS_EX, _StoreSystemExclusiveMessage}, // RCV_STS_CH_MSG_2 + {PARSE_MIDI_SYS_EX, _StoreSystemExclusiveMessage}, // RCV_SYS_RT + {PARSE_MIDI_SYS_EX, _StoreSystemExclusiveMessage}, // RCV_DAT + {PARSE_MIDI_SYS_EX, _StoreSystemExclusiveMessage}, // RCV_SYS_EX_START + {PARSE_MIDI_IDLE, _ExecSystemExclusiveMessage}, // RCV_SYS_EX_EOX + } +}; + + +MIDI_Handle_t *MIDI_Init(const MIDI_Message_Callbacks_t *pcallbacks ) { + + MIDI_Handle_t *phMIDI = NULL; + phMIDI = MIDI_Alloc(); + + if ( phMIDI != NULL ) { + uint32_t i = 0; + phMIDI->chmsg_buf.msg0 = 0; + phMIDI->chmsg_buf.msg1 = 0; + phMIDI->chmsg_buf.msg2 = 0; + phMIDI->chmsg_buf.pad = 0; + phMIDI->sysex_buf.len = 0; + for ( i = 0; i < MAX_SYS_EX_BUF_SIZE; i++ ) { + phMIDI->sysex_buf.msg[i] = 0; + } + + phMIDI->state = PARSE_MIDI_IDLE; + phMIDI->pcallback = pcallbacks; + } + + return phMIDI; +} + +void MIDI_DeInit( MIDI_Handle_t *phMIDI ) { + + if ( phMIDI != NULL ) { + MIDI_Free(phMIDI); + } +} + +int32_t MIDI_Play(MIDI_Handle_t *phMIDI, const uint8_t *midi_msg, size_t len) { + + uint32_t i = 0; + Parse_MIDI_Message_Event_t event = PARSE_MIDI_EVENT_RCV_STS_CH_MSG_1; + const Parse_MIDI_FSM_t *pfsm = NULL; + + for ( i = 0; i < len; i++ ) { + event = _GetParseMIDIMessageEvent(midi_msg[i]); + + pfsm = &_midi_trans_state_tbl[phMIDI->state][event]; + + if ( pfsm->pTransStateFunc != NULL ) { + pfsm->pTransStateFunc(phMIDI, midi_msg[i]); + } + phMIDI->state = pfsm->next; + } + + return 0; +} + +__WEAK__ MIDI_Handle_t *MIDI_Alloc(void) +{ + static MIDI_Handle_t hMIDI; + return &hMIDI; +} + +__WEAK__ void MIDI_Free(MIDI_Handle_t *phMIDI) +{ + (void)phMIDI; +} + +static void _StoreChannelMessageStatus(MIDI_Handle_t *phMIDI, uint8_t msg) { + phMIDI->chmsg_buf.msg0 = msg; +} + +static void _StoreChannelMessageData(MIDI_Handle_t *phMIDI, uint8_t msg) { + phMIDI->chmsg_buf.msg1 = msg; +} + +static void _StoreSystemExclusiveMessage(MIDI_Handle_t *phMIDI, uint8_t msg) { + MIDI_System_Exclusive_Buffer_t *psys_ex_buf = &phMIDI->sysex_buf; + if ( psys_ex_buf->len < MAX_SYS_EX_BUF_SIZE ) { + psys_ex_buf->msg[(psys_ex_buf->len)++] = msg; + } +} + +static void _ExecChannelMessage1(MIDI_Handle_t *phMIDI, uint8_t msg) { + + const MIDI_ChannelVoiceMessage_t *pchvmsg = &phMIDI->pcallback->channel.voice_msg; + + phMIDI->chmsg_buf.msg1 = msg; + + switch (phMIDI->chmsg_buf.msg0 & 0xF0) { + case 0xC0: + if ( pchvmsg->pProgramChange != NULL ) { + pchvmsg->pProgramChange(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1); + } + break; + + case 0xD0: + if ( pchvmsg->pChannelPressure != NULL ) { + pchvmsg->pChannelPressure(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1); + } + break; + + default: + break; + } +} + +static void _ExecChannelMessage2(MIDI_Handle_t *phMIDI, uint8_t msg) { + + const MIDI_ChannelVoiceMessage_t *pchvmsg = &phMIDI->pcallback->channel.voice_msg; + phMIDI->chmsg_buf.msg2 = msg; + + switch (phMIDI->chmsg_buf.msg0 & 0xF0) { + case 0x80: + if ( pchvmsg->pNoteOff != NULL ) { + pchvmsg->pNoteOff(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1, phMIDI->chmsg_buf.msg2); + gpio_bit_set(GPIOA, GPIO_PIN_2); + } + break; + + case 0x90: + if ( pchvmsg->pNoteOn != NULL ) { + pchvmsg->pNoteOn(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1, phMIDI->chmsg_buf.msg2); + gpio_bit_reset(GPIOA, GPIO_PIN_2); + } + break; + + case 0xA0: + if ( pchvmsg->pPolyphonicKeyPressure != NULL ) { + pchvmsg->pPolyphonicKeyPressure(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1, phMIDI->chmsg_buf.msg2); + } + break; + + case 0xB0: + if ( pchvmsg->pControlChange != NULL ) { + pchvmsg->pControlChange(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1, phMIDI->chmsg_buf.msg2); + } + break; + + case 0xE0: + if ( pchvmsg->pPitchBendChange != NULL ) { + pchvmsg->pPitchBendChange(phMIDI->chmsg_buf.msg0 & 0x0F, phMIDI->chmsg_buf.msg1, phMIDI->chmsg_buf.msg2); + } + break; + + default: + break; + } +} + + +static void _ExecSystemExclusiveMessage(MIDI_Handle_t *phMIDI, uint8_t msg) { + + const MIDI_SystemExclusiveMessage_t *psys_ex = &phMIDI->pcallback->system.exclusive_msg; + MIDI_System_Exclusive_Buffer_t *psys_ex_buf = &phMIDI->sysex_buf; + + (void)msg; + + if ( psys_ex->pSystemExclusive != NULL ) { + psys_ex->pSystemExclusive(psys_ex_buf->msg, psys_ex_buf->len); + } + + // clear + psys_ex_buf->len = 0; +} \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/midi.h b/firmware/midi2cv/src/drivers/usbfs/midi.h new file mode 100644 index 0000000..bfa1af6 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/midi.h @@ -0,0 +1,93 @@ +/* + MIT License + + Copyright (c) 2019 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#ifndef __MIDI_H__ +#define __MIDI_H__ + +#include "midiconf.h" + +typedef struct _MIDI_Channel_Message_Buffer { + uint8_t msg0; // status byte + uint8_t msg1; // data byte 1 + uint8_t msg2; // data byte 2 + uint8_t pad; // padding +}MIDI_Channel_Message_Buffer_t; + +typedef struct _MIDI_System_Exclusive_Buffer { + uint8_t msg[MAX_SYS_EX_BUF_SIZE]; + size_t len; +}MIDI_System_Exclusive_Buffer_t; + + +typedef enum _Parse_MIDI_Message_State { + PARSE_MIDI_IDLE = 0, + PARSE_MIDI_CH_MSG_1, + PARSE_MIDI_CH_MSG_2_1, + PARSE_MIDI_CH_MSG_2_2, + PARSE_MIDI_CH_MSG_RUNNING_1, + PARSE_MIDI_CH_MSG_RUNNING_2, + PARSE_MIDI_SYS_EX, + NUM_OF_PARSE_MIDI_MESSAGE_STATE +}Parse_MIDI_Message_State_t; + + +typedef struct _MIDI_ChannelVoiceMessage { + void (*pNoteOff)(uint8_t ch, uint8_t kk, uint8_t uu); + void (*pNoteOn)(uint8_t ch, uint8_t kk, uint8_t vv); + void (*pPolyphonicKeyPressure)(uint8_t ch, uint8_t kk, uint8_t vv); + void (*pControlChange)(uint8_t ch, uint8_t cc, uint8_t vv); + void (*pProgramChange)(uint8_t ch, uint8_t pp); + void (*pChannelPressure)(uint8_t ch, uint8_t vv); + void (*pPitchBendChange)(uint8_t ch, uint8_t ll, uint8_t hh); +}MIDI_ChannelVoiceMessage_t; + +typedef struct _MIDI_ChannelMessage { + MIDI_ChannelVoiceMessage_t voice_msg; +}MIDI_ChannelMessage_t; + +typedef struct _MIDI_SystemExclusiveMessage { + void (*pSystemExclusive)(uint8_t *dat, size_t len); +}MIDI_SystemExclusiveMessage_t; + +typedef struct _MIDI_SystemMessage { + MIDI_SystemExclusiveMessage_t exclusive_msg; +}MIDI_SystemMessage_t; + +typedef struct _MIDI_Message_Callbacks { + MIDI_ChannelMessage_t channel; + MIDI_SystemMessage_t system; +}MIDI_Message_Callbacks_t; + +typedef struct _MIDI_Handle { + MIDI_Channel_Message_Buffer_t chmsg_buf; + MIDI_System_Exclusive_Buffer_t sysex_buf; + const MIDI_Message_Callbacks_t *pcallback; + Parse_MIDI_Message_State_t state; +}MIDI_Handle_t; + +extern MIDI_Handle_t *MIDI_Init(const MIDI_Message_Callbacks_t *pcallbacks ); +extern void MIDI_DeInit( MIDI_Handle_t *phMIDI ); +extern int32_t MIDI_Play(MIDI_Handle_t *phMIDI, const uint8_t *midi_msg, size_t len); + +#endif // __MIDI_H__ diff --git a/firmware/midi2cv/src/drivers/usbfs/midi_cdc_core.c b/firmware/midi2cv/src/drivers/usbfs/midi_cdc_core.c new file mode 100644 index 0000000..4307063 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/midi_cdc_core.c @@ -0,0 +1,430 @@ +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ +#include +#include + +#include +#include +#include +#include "usbd_core.h" +#include "drv_usb_hw.h" +#include "usbd_enum.h" +#include "midi_cdc_desc.h" +#include "midi_cdc_core.h" + + +// usb cdc acm data send buffer page +#define USB_CDC_TX_BUF_PAGE_NUM 2 + +// each usb cdc acm data send buffer size +#ifndef USB_CDC_TX_BUF_SIZE +#define USB_CDC_TX_BUF_SIZE (CDC_ACM_DATA_PACKET_SIZE * 10) +#endif + +#define SEND_ENCAPSULATED_COMMAND 0x00 +#define GET_ENCAPSULATED_RESPONSE 0x01 +#define SET_COMM_FEATURE 0x02 +#define GET_COMM_FEATURE 0x03 +#define CLEAR_COMM_FEATURE 0x04 +#define SET_LINE_CODING 0x20 +#define GET_LINE_CODING 0x21 +#define SET_CONTROL_LINE_STATE 0x22 +#define SEND_BREAK 0x23 +#define NO_CMD 0xFF + +// usb cdc acm data send status +typedef enum +{ + USB_CDC_SEND_STATUS_INIT = 0, + USB_CDC_SEND_STATUS_BUSY, + USB_CDC_SEND_STATUS_FINISHED +}usb_cdc_send_status_t; + +typedef struct +{ + uint32_t dwDTERate; /* data terminal rate */ + uint8_t bCharFormat; /* stop bits */ + uint8_t bParityType; /* parity */ + uint8_t bDataBits; /* data bits */ +}line_coding_struct; + + +static uint32_t cdc_cmd = 0xFFU; +static uint8_t usb_cmd_buffer[CDC_ACM_CMD_PACKET_SIZE]; + + +// current usb cdc acm data send status +static usb_cdc_send_status_t usb_cdc_send_status = USB_CDC_SEND_STATUS_INIT; + +// current usb cdc acm data buffer page +static uint8_t current_buffer_page = 0; + +// current usb cdc acm data buffer position +static uint16_t current_end_position = 0; + +// usb cdc acm data send buffer (double buffer) +static uint8_t usb_cdc_tx_buffer[USB_CDC_TX_BUF_PAGE_NUM][USB_CDC_TX_BUF_SIZE]; + +// usb cdc data receive buffer +uint8_t usb_cdc_receive_buffer[CDC_ACM_DATA_PACKET_SIZE]; + +// usb midi receive buffer +uint8_t usb_midi_receive_buffer[AUDIO_MS_PACKET_SIZE]; + +// receive callback functions +static pf_usb_midi_receive_callback_t usb_midi_recv_cb = (pf_usb_midi_receive_callback_t)0; +static pf_usb_cdc_receive_callback_t usb_cdc_recv_cb = (pf_usb_cdc_receive_callback_t)0; + + +static uint8_t midi_cdc_init(usb_dev *udev, uint8_t config_index); +static uint8_t midi_cdc_deinit(usb_dev *udev, uint8_t config_index); +static uint8_t midi_cdc_req_proc(usb_dev *udev, usb_req *req); +static uint8_t midi_cdc_data_in(usb_dev *udev, uint8_t ep_num); +static uint8_t midi_cdc_data_out(usb_dev *udev, uint8_t ep_num); + + +static uint8_t cdc_acm_req_handler (usb_dev *pudev, usb_req *req); +static uint8_t cdc_acm_EP0_RxReady (usb_dev *pudev); + + +static void start_usb_cdc_send_service_irq(void); + + +static line_coding_struct linecoding = +{ + 115200, /* baud rate */ + 0x00, /* stop bits - 1 */ + 0x00, /* parity - none */ + 0x08 /* num of bits 8 */ +}; + +static usb_class_core class_core = +{ + .command = NO_CMD, /*!< device class request command */ + .alter_set = 0, /*!< alternative set */ + .init = midi_cdc_init, /*!< initialize handler */ + .deinit = midi_cdc_deinit, /*!< de-initialize handler */ + .req_proc = midi_cdc_req_proc, /*!< device request handler */ + .data_in = midi_cdc_data_in, /*!< device data in handler */ + .data_out = midi_cdc_data_out, /*!< device data out handler */ + .SOF = NULL, /*!< Start of frame handler */ + .incomplete_isoc_in = NULL, /*!< Incomplete synchronization IN transfer handler */ + .incomplete_isoc_out = NULL, /*!< Incomplete synchronization OUT transfer handler */ +}; + + +void init_usbd_midi(const pf_usb_midi_receive_callback_t midi_recv_cb) +{ + // register_usb_cdc_receive_callback(cdc_recv_cb); + + register_usb_midi_receive_callback(midi_recv_cb); + + eclic_irq_enable(TIMER2_IRQn, 2, 0); + + /* USB device stack configure */ + usbd_init (&g_midi_cdc_udev, USB_CORE_ENUM_FS, &class_core); + + // start_usb_cdc_send_service_irq(); + + /* USB interrupt configure */ + usb_intr_config(); + + /* check if USB device is enumerated successfully */ + while (g_midi_cdc_udev.dev.cur_status != USBD_CONFIGURED) + { + } +} + +// register a callback function to be called when usb midi message received. +void register_usb_midi_receive_callback(const pf_usb_midi_receive_callback_t callback) +{ + usb_midi_recv_cb = callback; +} + +// register a callback function to be called when usb cdc data received. +void register_usb_cdc_receive_callback(const pf_usb_cdc_receive_callback_t callback) +{ + usb_cdc_recv_cb = callback; +} + +int usb_cdc_printf(const char *format, ...) +{ + int written_num = 0; + size_t max_write_num = 0; + + va_list arg; + va_start(arg, format); + + // entry critical section + eclic_global_interrupt_disable(); + max_write_num = USB_CDC_TX_BUF_SIZE - current_end_position; + written_num = vsnprintf( + (char *)&usb_cdc_tx_buffer[current_buffer_page][current_end_position] + ,max_write_num, format, arg); + + if ( ( 0 < written_num ) && ( written_num < max_write_num ) ) + { + current_end_position += written_num; + } + // leave critical section + eclic_global_interrupt_enable(); + + va_end(arg); + + return 0; +} + +// send data and switch send buffer page. +void usb_cdc_send_service_irq(void) +{ + if (RESET != timer_flag_get(TIMER6, TIMER_FLAG_UP)) + { + if (USBD_CONFIGURED == g_midi_cdc_udev.dev.cur_status) + { + // entry critical section + eclic_global_interrupt_disable(); + if ( usb_cdc_send_status != USB_CDC_SEND_STATUS_BUSY ) + { + if ( current_end_position > 0 ) + { + usb_cdc_send_status = USB_CDC_SEND_STATUS_BUSY; + usbd_ep_send(&g_midi_cdc_udev, CDC_IN_EP, &usb_cdc_tx_buffer[current_buffer_page][0] , current_end_position); + current_end_position = 0; + current_buffer_page++; + if ( current_buffer_page >= USB_CDC_TX_BUF_PAGE_NUM ) + { + current_buffer_page = 0; + } + } + } + // leave critical section + eclic_global_interrupt_enable(); + } + + timer_flag_clear(TIMER6, TIMER_FLAG_UP); + } +} + +static uint8_t midi_cdc_init(usb_dev *udev, uint8_t config_index) +{ + midi_cdc_desc_ep_setup(udev); + + // prepare receive data + usbd_ep_recev(udev, MIDI_OUT_EP, usb_midi_receive_buffer, AUDIO_MS_PACKET_SIZE); + usbd_ep_recev(udev, CDC_OUT_EP, usb_cdc_receive_buffer, CDC_ACM_DATA_PACKET_SIZE); + + return 0; +} + + +static uint8_t midi_cdc_deinit(usb_dev *udev, uint8_t config_index) +{ + midi_cdc_desc_ep_clear(udev); + return 0; +} + + +static uint8_t midi_cdc_req_proc(usb_dev *udev, usb_req *req) +{ + switch (req->wIndex) + { + case AUDIO_AC_ITF_NUMBER: + break; + + case AUDIO_MS_ITF_NUMBER: + break; + + case CDC_CDC_ITF_NUMBER: + cdc_acm_req_handler(udev, req); + break; + + case CDC_DATA_ITF_NUMBER: + break; + + default: + break; + } + return 0; +} + + +static uint8_t midi_cdc_data_in(usb_dev *udev, uint8_t ep_num) +{ + if ((CDC_IN_EP & 0x7F) == ep_num) + { + usb_transc *transc = &udev->dev.transc_in[EP_ID(ep_num)]; + + if ((transc->xfer_len % transc->max_len == 0) && (transc->xfer_len != 0)) + { + usbd_ep_send (udev, ep_num, NULL, 0U); + } + else + { + usb_cdc_send_status = USB_CDC_SEND_STATUS_FINISHED; + } + } + + return 0; +} + + +static uint8_t midi_cdc_data_out(usb_dev *udev, uint8_t ep_num) +{ + uint32_t receive_length = 0U; + + if ((EP0_OUT & 0x7F) == ep_num) + { + cdc_acm_EP0_RxReady (udev); + } + else if ((CDC_OUT_EP & 0x7F) == ep_num) + { + receive_length = usbd_rxcount_get(udev, CDC_OUT_EP); + if ( usb_cdc_recv_cb ) + { + usb_cdc_recv_cb(usb_cdc_receive_buffer, receive_length); + } + usbd_ep_recev(udev, CDC_OUT_EP, usb_cdc_receive_buffer, CDC_ACM_DATA_PACKET_SIZE); + } + else if ((MIDI_OUT_EP & 0x7F) == ep_num) + { + receive_length = usbd_rxcount_get(udev, MIDI_OUT_EP); + if ( usb_midi_recv_cb ) + { + usb_midi_recv_cb(usb_midi_receive_buffer, receive_length); + } + usbd_ep_recev(udev, MIDI_OUT_EP, usb_midi_receive_buffer, AUDIO_MS_PACKET_SIZE); + } + else + { + } + + return 0; +} + +/*! + \brief handle the CDC ACM class-specific requests + \param[in] pudev: pointer to USB device instance + \param[in] req: device class-specific request + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_req_handler (usb_dev *pudev, usb_req *req) +{ + switch (req->bRequest) + { + case SEND_ENCAPSULATED_COMMAND: + break; + case GET_ENCAPSULATED_RESPONSE: + break; + case SET_COMM_FEATURE: + break; + case GET_COMM_FEATURE: + break; + case CLEAR_COMM_FEATURE: + break; + case SET_LINE_CODING: + /* set the value of the current command to be processed */ + cdc_cmd = req->bRequest; + /* enable EP0 prepare to receive command data packet */ + pudev->dev.transc_out[0].xfer_buf = usb_cmd_buffer; + pudev->dev.transc_out[0].remain_len = req->wLength; + break; + case GET_LINE_CODING: + usb_cmd_buffer[0] = (uint8_t)(linecoding.dwDTERate); + usb_cmd_buffer[1] = (uint8_t)(linecoding.dwDTERate >> 8); + usb_cmd_buffer[2] = (uint8_t)(linecoding.dwDTERate >> 16); + usb_cmd_buffer[3] = (uint8_t)(linecoding.dwDTERate >> 24); + usb_cmd_buffer[4] = linecoding.bCharFormat; + usb_cmd_buffer[5] = linecoding.bParityType; + usb_cmd_buffer[6] = linecoding.bDataBits; + /* send the request data to the host */ + pudev->dev.transc_in[0].xfer_buf = usb_cmd_buffer; + pudev->dev.transc_in[0].remain_len = req->wLength; + break; + case SET_CONTROL_LINE_STATE: + break; + case SEND_BREAK: + break; + default: + break; + } + + return USBD_OK; +} + +/*! + \brief command data received on control endpoint + \param[in] pudev: pointer to USB device instance + \param[out] none + \retval USB device operation status +*/ +static uint8_t cdc_acm_EP0_RxReady (usb_dev *pudev) +{ + if (NO_CMD != cdc_cmd) { + /* process the command data */ + linecoding.dwDTERate = (uint32_t)(usb_cmd_buffer[0] | + (usb_cmd_buffer[1] << 8) | + (usb_cmd_buffer[2] << 16) | + (usb_cmd_buffer[3] << 24)); + + linecoding.bCharFormat = usb_cmd_buffer[4]; + linecoding.bParityType = usb_cmd_buffer[5]; + linecoding.bDataBits = usb_cmd_buffer[6]; + + cdc_cmd = NO_CMD; + } + + return USBD_OK; +} + +// start usb cdc send service routine. +static void start_usb_cdc_send_service_irq(void) +{ + timer_parameter_struct timer_initpara; + + eclic_irq_enable(TIMER6_IRQn, 2, 0); + + timer_struct_para_init(&timer_initpara); + + timer_initpara.clockdivision = TIMER_CKDIV_DIV1; + timer_initpara.prescaler = 9599;// 96 MHz/ 9600 = 10 kHz + timer_initpara.alignedmode = TIMER_COUNTER_EDGE; + timer_initpara.counterdirection = TIMER_COUNTER_UP; + timer_initpara.period = 10; + + timer_deinit(TIMER6); + timer_init(TIMER6, &timer_initpara); + + timer_update_event_enable(TIMER6); + timer_interrupt_enable(TIMER6,TIMER_INT_UP); + timer_flag_clear(TIMER6, TIMER_FLAG_UP); + timer_update_source_config(TIMER6, TIMER_UPDATE_SRC_GLOBAL); + + /* TIMER6 counter enable */ + timer_enable(TIMER6); +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/midi_cdc_core.h b/firmware/midi2cv/src/drivers/usbfs/midi_cdc_core.h new file mode 100644 index 0000000..f095b48 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/midi_cdc_core.h @@ -0,0 +1,46 @@ +/* + MIT License + + Copyright (c) 2020 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#ifndef MIDI_CDC_CORE_H +#define MIDI_CDC_CORE_H + +#include +#include + + + + +typedef int32_t (*pf_usb_midi_receive_callback_t)(const uint8_t *recv_msg, size_t len); +typedef int32_t (*pf_usb_cdc_receive_callback_t)(const uint8_t *recv_data, size_t len); + +extern void register_usb_midi_receive_callback(const pf_usb_midi_receive_callback_t callback); +extern void register_usb_cdc_receive_callback(const pf_usb_cdc_receive_callback_t callback); + +extern void init_usbd_midi(const pf_usb_midi_receive_callback_t midi_recv_cb); + +extern void usb_cdc_send_service_irq(void); + +extern int usb_cdc_printf(const char *format, ...); + +#endif/* MIDI_CDC_CORE_H */ + diff --git a/firmware/midi2cv/src/drivers/usbfs/midi_cdc_desc.c b/firmware/midi2cv/src/drivers/usbfs/midi_cdc_desc.c new file mode 100644 index 0000000..5c09539 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/midi_cdc_desc.c @@ -0,0 +1,386 @@ +/* + MIT License + + Copyright (c) 2020 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#include "usbd_core.h" +#include "usbd_enum.h" +#include "midi_cdc_desc.h" + +#define USBD_VID 0xaaaa// replace 0xaaaa with your vid +#define USBD_PID 0xbbbb// replace 0xbbbb with your pid + +#define LITTLE_ENDIAN_16(x) (x) + +static const usb_desc_dev device_descriptor = +{ + .header = + { + .bLength = USB_DEV_DESC_LEN, + .bDescriptorType = USB_DESCTYPE_DEV + }, + .bcdUSB = 0x0200, + .bDeviceClass = 0xEF, + .bDeviceSubClass = 0x02, + .bDeviceProtocol = 0x01, + .bMaxPacketSize0 = USB_FS_EP0_MAX_LEN, + .idVendor = USBD_VID, + .idProduct = USBD_PID, + .bcdDevice = LITTLE_ENDIAN_16(0x0100), + .iManufacturer = STR_IDX_MFC, + .iProduct = STR_IDX_PRODUCT, + .iSerialNumber = STR_IDX_SERIAL, + .bNumberConfigurations = USBD_CFG_MAX_NUM +}; + +static const usb_descriptor_configuration_set_struct configuration_descriptor= +{ + .config = + {/* Configuration 1 */ + .header = + { + .bLength = 0x09, + .bDescriptorType = USB_DESCTYPE_CONFIG, + }, + .wTotalLength = LITTLE_ENDIAN_16(0x00AF), + .bNumInterfaces = 0x04, /* audio 2 + cdc 2 = 4 */ + .bConfigurationValue = 0x01, + .iConfiguration = 0x00, + .bmAttributes = 0xC0, + .bMaxPower = 0x32, + }, + .usb_iad_audio = + {/* Interface Associated Descriptor */ + .bLength = 0x08, + .bDescriptorType = 0x0B, + .bFirstInterface = AUDIO_AC_ITF_NUMBER, + .bInterfaceCount = 0x02, + .bFunctionClass = 0x01, + .bFunctionSubClass = 0x01, + .bFunctionProtocol = 0x00, + .iFunction = 0x02, + }, + .audio = + {/* Audio device */ + .standard_ac_itf = + {/* Standard AC Interface Descriptor */ + .header = + { + .bLength = 0x09, + .bDescriptorType = USB_DESCTYPE_ITF, + }, + .bInterfaceNumber = AUDIO_AC_ITF_NUMBER, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x00, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x01, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00, + }, + .class_specific_ac_itf = + {/* Class-specific AC Interface Descriptor */ + .bLength = 0x09, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x01, + .bcdADC = LITTLE_ENDIAN_16(0x0100),/* 1.00 */ + .wTotalLength = LITTLE_ENDIAN_16(0x0009), + .bInCollection = 0x01, + .baInterfaceNr = AUDIO_MS_ITF_NUMBER, + }, + .standard_ms_itf = + {/* Standard MS Interface Descriptor */ + .header = + { + .bLength = 0x09, + .bDescriptorType = USB_DESCTYPE_ITF, + }, + .bInterfaceNumber = AUDIO_MS_ITF_NUMBER, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x02, + .bInterfaceClass = 0x01, + .bInterfaceSubClass = 0x03, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00, + }, + .class_specific_ms_itf = + {/* Class-specific MS Interface Descriptor */ + .bLength = 0x07, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x01, + .BcdADC = LITTLE_ENDIAN_16(0x0100), + .wTotalLength = LITTLE_ENDIAN_16(0x0025), + }, + .midi_in_jack_embedded = + {/* MIDI IN Jack Descriptor (Embedded) */ + .bLength = 0x06, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x02, + .bJackType = 0x01,/* embedded */ + .bJackID = 0x01, + .iJack = 0x00, + }, + .midi_in_jack_external = + {/* MIDI In Jack Descriptor (External) */ + .bLength = 0x06, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x02, + .bJackType = 0x02, /* external */ + .bJackID = 0x02, + .iJack = 0x00, + }, + .midi_out_jack_embedded = + {/* MIDI OUT Jack Descriptor (Embedded) */ + .bLength = 0x09, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x03, + .bJackType = 0x01, + .bJackID = 0x03, + .bNtInputPins = 0x01, + .BaSourceID = 0x02, + .BaSourcePin = 0x01, + .iJack = 0x00, + }, + .midi_out_jack_external = + {/* MIDI OUT Jack Descriptor (External) */ + .bLength = 0x09, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x03, + .bJackType = 0x02, + .bJackID = 0x04, + .bNtInputPins = 0x01, + .BaSourceID = 0x01, + .BaSourcePin = 0x01, + .iJack = 0x00, + }, + .bulk_out_ep_desc = + {/* Standard Bulk OUT EndPoint Descriptor */ + .desc_ep = + { + .header = + { + .bLength = 0x09, + .bDescriptorType= 0x05, + }, + .bEndpointAddress = MIDI_OUT_EP, + .bmAttributes = 0x02, + .wMaxPacketSize = LITTLE_ENDIAN_16(AUDIO_MS_PACKET_SIZE), + .bInterval = 0x01, + }, + .bRefresh = 0x00, + .bSynchAddress = 0x00, + }, + .class_specific_ms_bulk_out_ep = + {/* Class-specific Bulk OUT EndPoint Descriptor */ + .bLength = 0x05, + .bDescriptorType = 0x25, + .bDescriptorSubtype = 0x01, + .bNumEmbMIDIJack = 0x01, + .BaAssocJackID = 0x01, + }, + .bulk_in_ep_desc = + {/* Standard Bulk IN EndPoint Descriptor */ + .desc_ep = + { + .header = + { + .bLength = 0x09, + .bDescriptorType= 0x05, + }, + .bEndpointAddress = MIDI_IN_EP, + .bmAttributes = 0x02, + .wMaxPacketSize = LITTLE_ENDIAN_16(AUDIO_MS_PACKET_SIZE), + .bInterval = 0x00, + }, + .bRefresh = 0x00, + .bSynchAddress = 0x00, + }, + .class_specific_ms_bulk_in_ep = + {/* Class-specific Bulk IN EndPoint Descriptor */ + .bLength = 0x05, + .bDescriptorType = 0x25, + .bDescriptorSubtype = 0x01, + .bNumEmbMIDIJack = 0x01, + .BaAssocJackID = 0x03, + }, + }, + .usb_iad_cdc = + {/* Interface Associated Descriptor */ + .bLength = 0x08, + .bDescriptorType = 0x0B, + .bFirstInterface = CDC_CDC_ITF_NUMBER, + .bInterfaceCount = 0x02, + .bFunctionClass = 0x02, + .bFunctionSubClass = 0x02, + .bFunctionProtocol = 0x01, + .iFunction = 0x02, + }, + .cdc = + { + .cdc_cdc_itf = + {/* Interface Descriptor */ + .header = + { + .bLength = 0x09, + .bDescriptorType = 0x04, + }, + .bInterfaceNumber = CDC_CDC_ITF_NUMBER, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x01, + .bInterfaceClass = 0x02, + .bInterfaceSubClass = 0x02, + .bInterfaceProtocol = 0x01, + .iInterface = 0x00, + }, + .header_func_desc = + {/* Header Functional Descriptor */ + .bLength = 0x05, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x00, + .bcdCDC = LITTLE_ENDIAN_16(0x0110), + }, + .call_mng_func_desc = + {/* Call Management Functional Descriptor */ + .bFunctionLength = 0x05, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x01, + .bmCapabilities = 0x00, + .bDataInterface = 0x01, + }, + .acm_func_desc = + {/* ACM Functional Descriptor */ + .bFunctionLength = 0x04, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x02, + .bmCapabilities = 0x02, + }, + .union_func_desc = + {/* Union Functional Descriptor */ + .bFunctionLength = 0x05, + .bDescriptorType = 0x24, + .bDescriptorSubtype = 0x06, + .bMasterInterface = CDC_CDC_ITF_NUMBER, + .bSlaveInterface0 = CDC_DATA_ITF_NUMBER, + }, + .cmd_ep = + {/* Endpoint Descriptor */ + .header = + { + .bLength = 0x07, + .bDescriptorType = 0x05, + }, + .bEndpointAddress = CDC_CMD_EP, + .bmAttributes = 0x03, + .wMaxPacketSize = LITTLE_ENDIAN_16(CDC_ACM_CMD_PACKET_SIZE), + .bInterval = 0x10, + }, + .cdc_data_itf = + {/* Data Class Interface Descriptor */ + .header = + { + .bLength = 0x09, + .bDescriptorType = 0x04, + }, + .bInterfaceNumber = CDC_DATA_ITF_NUMBER, + .bAlternateSetting = 0x00, + .bNumEndpoints = 0x02, + .bInterfaceClass = 0x0A, + .bInterfaceSubClass = 0x00, + .bInterfaceProtocol = 0x00, + .iInterface = 0x00, + }, + .end_out = + {/* Endpoint OUT Descriptor */ + .header = + { + .bLength = 0x07, + .bDescriptorType = 0x05, + }, + .bEndpointAddress = CDC_OUT_EP, + .bmAttributes = 0x02, + .wMaxPacketSize = LITTLE_ENDIAN_16(CDC_ACM_DATA_PACKET_SIZE), + .bInterval = 0x00, + }, + .end_in = + {/* Endpoint IN Descriptor */ + .header = + { + .bLength = 0x07, + .bDescriptorType = 0x05, + }, + .bEndpointAddress = CDC_IN_EP, + .bmAttributes = 0x02, + .wMaxPacketSize = LITTLE_ENDIAN_16(CDC_ACM_DATA_PACKET_SIZE), + .bInterval = 0x00, + }, + }, +}; + +static const usb_desc_LANGID usbd_language_id_desc = +{ + .header = + { + .bLength = sizeof(usb_desc_LANGID), + .bDescriptorType = USB_DESCTYPE_STR + }, + .wLANGID = ENG_LANGID +}; + +static void* const usbd_strings[] = +{ + [STR_IDX_LANGID] = (uint8_t *)&usbd_language_id_desc, + [STR_IDX_MFC] = USBD_STRING_DESC("GigaDevice"), + [STR_IDX_PRODUCT] = USBD_STRING_DESC("nano_midi"), + [STR_IDX_SERIAL] = USBD_STRING_DESC("GD32XXX-3.0.0-7z8x9yer") +}; + +usb_core_driver g_midi_cdc_udev = +{ + .dev = + { + .desc = + { + .dev_desc = (uint8_t *)&device_descriptor, + .config_desc = (uint8_t *)&configuration_descriptor, + .strings = usbd_strings + + } + } +}; + +void midi_cdc_desc_ep_setup(usb_dev *udev) +{ + usbd_ep_setup(udev, &configuration_descriptor.audio.bulk_in_ep_desc.desc_ep); + usbd_ep_setup(udev, &configuration_descriptor.audio.bulk_out_ep_desc.desc_ep); + + usbd_ep_setup(udev, &configuration_descriptor.cdc.end_in); + usbd_ep_setup(udev, &configuration_descriptor.cdc.end_out); + usbd_ep_setup(udev, &configuration_descriptor.cdc.cmd_ep); +} + +void midi_cdc_desc_ep_clear(usb_dev *udev) +{ + usbd_ep_clear(udev, configuration_descriptor.audio.bulk_in_ep_desc.desc_ep.bEndpointAddress); + usbd_ep_clear(udev, configuration_descriptor.audio.bulk_out_ep_desc.desc_ep.bEndpointAddress); + + usbd_ep_clear(udev, configuration_descriptor.cdc.end_in.bEndpointAddress); + usbd_ep_clear(udev, configuration_descriptor.cdc.end_out.bEndpointAddress); + usbd_ep_clear(udev, configuration_descriptor.cdc.cmd_ep.bEndpointAddress); +} diff --git a/firmware/midi2cv/src/drivers/usbfs/midi_cdc_desc.h b/firmware/midi2cv/src/drivers/usbfs/midi_cdc_desc.h new file mode 100644 index 0000000..f868e8b --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/midi_cdc_desc.h @@ -0,0 +1,199 @@ +/* + MIT License + + Copyright (c) 2020 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#ifndef __MIDI_CDC_DESC_H__ +#define __MIDI_CDC_DESC_H__ + + +#define CDC_ACM_CMD_PACKET_SIZE 0x0008 // 8 byte +#define CDC_ACM_DATA_PACKET_SIZE 0x0040 // 64 byte +#define AUDIO_MS_PACKET_SIZE 0x0040 // 64 byte + +#pragma pack(1) + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint16_t bcdADC; + uint16_t wTotalLength; + uint8_t bInCollection; + uint8_t baInterfaceNr; +} usb_desc_class_specific_ac_itf;/* 9 byte */ + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint16_t BcdADC; + uint16_t wTotalLength; +} usb_desc_class_specific_ms_itf;/* 7 byte */ + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bJackType; + uint8_t bJackID; + uint8_t iJack; +} usb_desc_midi_in_jack_desc; /* 6 byte */ + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bJackType; + uint8_t bJackID; + uint8_t bNtInputPins; + uint8_t BaSourceID; + uint8_t BaSourcePin; + uint8_t iJack; +} usb_desc_midi_out_jack_desc; /* 9 byte */ + + +typedef struct +{ + usb_desc_ep desc_ep; + uint8_t bRefresh; + uint8_t bSynchAddress; +} usb_desc_ep_audio; /* 9 byte */ + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bNumEmbMIDIJack; + uint8_t BaAssocJackID; +} usb_desc_class_specific_ms_ep; /* 5 byte */ + + +typedef struct +{ + usb_desc_itf standard_ac_itf; + usb_desc_class_specific_ac_itf class_specific_ac_itf; + usb_desc_itf standard_ms_itf; + usb_desc_class_specific_ms_itf class_specific_ms_itf; + usb_desc_midi_in_jack_desc midi_in_jack_embedded; + usb_desc_midi_in_jack_desc midi_in_jack_external; + usb_desc_midi_out_jack_desc midi_out_jack_embedded; + usb_desc_midi_out_jack_desc midi_out_jack_external; + usb_desc_ep_audio bulk_out_ep_desc; + usb_desc_class_specific_ms_ep class_specific_ms_bulk_out_ep; + usb_desc_ep_audio bulk_in_ep_desc; + usb_desc_class_specific_ms_ep class_specific_ms_bulk_in_ep; +} usb_desc_audio; + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bFirstInterface; + uint8_t bInterfaceCount; + uint8_t bFunctionClass; + uint8_t bFunctionSubClass; + uint8_t bFunctionProtocol; + uint8_t iFunction; +} usb_desc_iad; /* 8 byte */ + + +typedef struct +{ + uint8_t bLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint16_t bcdCDC; +} usb_desc_header_func_desc; /* 5 byte */ + + +typedef struct +{ + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmCapabilities; + uint8_t bDataInterface; +} usb_desc_call_mng_func_desc; /* 5 byte */ + + +typedef struct +{ + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bmCapabilities; +} usb_desc_acm_func_desc; /* 4 byte */ + + +typedef struct +{ + uint8_t bFunctionLength; + uint8_t bDescriptorType; + uint8_t bDescriptorSubtype; + uint8_t bMasterInterface; + uint8_t bSlaveInterface0; +} usb_desc_union_func_desc; /* 5 byte */ + + +typedef struct +{ + usb_desc_itf cdc_cdc_itf; + usb_desc_header_func_desc header_func_desc; + usb_desc_call_mng_func_desc call_mng_func_desc; + usb_desc_acm_func_desc acm_func_desc; + usb_desc_union_func_desc union_func_desc; + usb_desc_ep cmd_ep; + usb_desc_itf cdc_data_itf; + usb_desc_ep end_out; + usb_desc_ep end_in; +} usb_desc_cdc; + + +typedef struct +{ + usb_desc_config config; + usb_desc_iad usb_iad_audio; + usb_desc_audio audio; + usb_desc_iad usb_iad_cdc; + usb_desc_cdc cdc; +} usb_descriptor_configuration_set_struct; + +#pragma pack() + + + +extern usb_core_driver g_midi_cdc_udev; + +extern void midi_cdc_desc_ep_setup(usb_dev *udev); +extern void midi_cdc_desc_ep_clear(usb_dev *udev); + +#endif/*__MIDI_CDC_DESC_H__*/ diff --git a/firmware/midi2cv/src/drivers/usbfs/midiconf.h b/firmware/midi2cv/src/drivers/usbfs/midiconf.h new file mode 100644 index 0000000..d4d9152 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/midiconf.h @@ -0,0 +1,37 @@ +/* + MIT License + + Copyright (c) 2019 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +#ifndef __MIDICONF_H__ +#define __MIDICONF_H__ + +#include +#include + +#define __WEAK__ __attribute__((weak)) + +#ifndef MAX_SYS_EX_BUF_SIZE +#define MAX_SYS_EX_BUF_SIZE 256 +#endif + +#endif /* __MIDICONF_H__ */ \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/usb_conf.h b/firmware/midi2cv/src/drivers/usbfs/usb_conf.h new file mode 100644 index 0000000..84fceb2 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/usb_conf.h @@ -0,0 +1,75 @@ +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ +#ifndef __USB_CONF_H__ +#define __USB_CONF_H__ + +#include "gd32vf103.h" + +#ifdef USE_USB_FS +#define USB_FS_CORE +#endif + +#ifdef USB_FS_CORE + #define RX_FIFO_FS_SIZE 128 + #define TX0_FIFO_FS_SIZE 64 + #define TX1_FIFO_FS_SIZE 128 + #define TX2_FIFO_FS_SIZE 0 + #define TX3_FIFO_FS_SIZE 0 +#endif /* USB_FS_CORE */ + +#define USB_SOF_OUTPUT 1 +#define USB_LOW_POWER 1 + +#if defined ( __GNUC__ ) + #ifndef __weak + #define __weak __attribute__((weak)) + #endif /* __weak */ + #ifndef __packed + #define __packed __attribute__((__packed__)) + #endif /* __packed */ +#endif /* __GNUC__ */ + + +/* In HS mode and when the DMA is used, all variables and data structures dealing + with the DMA during the transaction process should be 4-bytes aligned */ + +#if defined (__GNUC__) /* GNU Compiler */ + #define __ALIGN_END __attribute__ ((aligned (4))) + #define __ALIGN_BEGIN +#else + #define __ALIGN_END + #if defined (__CC_ARM) /* ARM Compiler */ + #define __ALIGN_BEGIN __align(4) + #elif defined (__ICCARM__) /* IAR Compiler */ + #define __ALIGN_BEGIN + #elif defined (__TASKING__) /* TASKING Compiler */ + #define __ALIGN_BEGIN __align(4) + #endif /* __CC_ARM */ +#endif /* __GNUC__ */ + + +#endif \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/usb_midi_app.c b/firmware/midi2cv/src/drivers/usbfs/usb_midi_app.c new file mode 100644 index 0000000..7359b86 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/usb_midi_app.c @@ -0,0 +1,98 @@ +/* + MIT License + + Copyright (c) 2020 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#include "usb_midi_app.h" +#include "midi.h" +//#include "mode4_ymf825.h" +//#include "music_box_ymf825.h" +//#include "single_ymz294.h" + + +#include + +#define MAX_MIDI_HANDLE_LIST_COUNT 2 +#define MIDI_HANDLE_FREE 0 +#define MIDI_HANDLE_OCCUPIED 1 + +#define USB_MIDI_APP_ASSERT(cond) + +typedef struct +{ + uint32_t status; + MIDI_Handle_t hMIDI; +} midi_handle_list_t; + +typedef struct _usb_midi_event_packet +{ + uint8_t header; + uint8_t midi[3]; +} usb_midi_event_packet_t; + +typedef struct +{ + MIDI_Handle_t* (*midi_init)(void); + void (*midi_deinit)(MIDI_Handle_t *phMIDI); +} sound_driver_api_t; + +static midi_handle_list_t hmidi_list[MAX_MIDI_HANDLE_LIST_COUNT]; + + +int32_t usb_midi_proc(const uint8_t *mid_msg, size_t len) +{ + gpio_bit_set(GPIOA, GPIO_PIN_1); + if(gpio_input_bit_get(GPIOA, GPIO_PIN_2)){ + gpio_bit_reset(GPIOA, GPIO_PIN_2); + } else{ + gpio_bit_set(GPIOA, GPIO_PIN_2); + } + return 0; +} + + +MIDI_Handle_t *MIDI_Alloc(void) +{ + uint32_t i = 0; + for ( i = 0; i < MAX_MIDI_HANDLE_LIST_COUNT; i++ ) + { + if ( hmidi_list[i].status == MIDI_HANDLE_FREE ) + { + hmidi_list[i].status = MIDI_HANDLE_OCCUPIED; + return &hmidi_list[i].hMIDI; + } + } + return (MIDI_Handle_t * )0; +} + +void MIDI_Free(MIDI_Handle_t *phMIDI) +{ + uint32_t i = 0; + for ( i = 0; i < MAX_MIDI_HANDLE_LIST_COUNT; i++ ) + { + if ( &hmidi_list[i].hMIDI == phMIDI ) + { + hmidi_list[i].status = MIDI_HANDLE_FREE; + break; + } + } +} + diff --git a/firmware/midi2cv/src/drivers/usbfs/usb_midi_app.h b/firmware/midi2cv/src/drivers/usbfs/usb_midi_app.h new file mode 100644 index 0000000..b4dd370 --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/usb_midi_app.h @@ -0,0 +1,43 @@ +/* + MIT License + + Copyright (c) 2020 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ +#ifndef __USB_MIDI_H__ +#define __USB_MIDI_H__ + +#include +#include + +typedef enum +{ + YMF825_SOUND_DRIVER_MODE4 = 0, + YMF825_SOUND_DRIVER_MUSIC_BOX, + NUM_OF_YMF825_SOUND_DRIVER +} ymf825_sound_driver_t; + + +extern void init_usb_midi_app(void); +extern int32_t usb_midi_proc(const uint8_t *mid_msg, size_t len); +extern int32_t switch_ymf825_sound_driver(ymf825_sound_driver_t driver); +extern ymf825_sound_driver_t get_selected_ymf825_sound_driver(void); + +#endif//__USB_MIDI_H__ diff --git a/firmware/midi2cv/src/drivers/usbfs/usbd_conf.h b/firmware/midi2cv/src/drivers/usbfs/usbd_conf.h new file mode 100644 index 0000000..c30e68a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/usbd_conf.h @@ -0,0 +1,23 @@ +#ifndef __USBD_CONF_H__ +#define __USBD_CONF_H__ + +#include "usb_conf.h" + +#define USBD_CFG_MAX_NUM 1 + + +#define CDC_OUT_EP 0x01U +#define CDC_CMD_EP 0x82U +#define CDC_IN_EP 0x81U + +#define MIDI_OUT_EP 0x02U +#define MIDI_IN_EP 0x83U + +#define AUDIO_AC_ITF_NUMBER 0 +#define AUDIO_MS_ITF_NUMBER 1 +#define CDC_CDC_ITF_NUMBER 2 +#define CDC_DATA_ITF_NUMBER 3 +#define USBD_ITF_MAX_NUM CDC_DATA_ITF_NUMBER + + +#endif//__USBD_CONF_H__ \ No newline at end of file diff --git a/firmware/midi2cv/src/drivers/usbfs/usbd_core.c b/firmware/midi2cv/src/drivers/usbfs/usbd_core.c new file mode 100644 index 0000000..d7a8eae --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/usbd_core.c @@ -0,0 +1,329 @@ +/*! + \file usbd_core.c + \brief USB device mode core functions + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#include "../Include/usbd_core.h" +#include "../Include/drv_usb_hw.h" + +/* endpoint type */ +const uint32_t ep_type[] = { + [USB_EP_ATTR_CTL] = USB_EPTYPE_CTRL, + [USB_EP_ATTR_BULK] = USB_EPTYPE_BULK, + [USB_EP_ATTR_INT] = USB_EPTYPE_INTR, + [USB_EP_ATTR_ISO] = USB_EPTYPE_ISOC +}; + +/*! + \brief initailizes the USB device-mode stack and load the class driver + \param[in] udev: pointer to USB core instance + \param[in] core: usb core type + \param[in] class_core: class driver + \param[out] none + \retval none +*/ +void usbd_init (usb_core_driver *udev, usb_core_enum core, usb_class_core *class_core) +{ + /* device descriptor, class and user callbacks */ + udev->dev.class_core = class_core; + + /* configure USB capabilites */ + usb_basic_init (&udev->bp, &udev->regs, core); + + /* initailizes the USB core*/ + usb_core_init (udev->bp, &udev->regs); + + /* set device disconnect */ + usbd_disconnect (udev); + + /* initailizes device mode */ + usb_devcore_init (udev); + + /* set device connect */ + usbd_connect (udev); + + udev->dev.cur_status = USBD_DEFAULT; +} + +/*! + \brief endpoint initialization + \param[in] udev: pointer to USB core instance + \param[in] ep_desc: pointer to endpoint descriptor + \param[out] none + \retval none +*/ +uint32_t usbd_ep_setup (usb_core_driver *udev, const usb_desc_ep *ep_desc) +{ + usb_transc *transc; + + uint8_t ep_addr = ep_desc->bEndpointAddress; + uint8_t max_len = ep_desc->wMaxPacketSize; + + /* set endpoint direction */ + if (EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + + transc->ep_addr.dir = 1U; + } else { + transc = &udev->dev.transc_out[ep_addr]; + + transc->ep_addr.dir = 0U; + } + + transc->ep_addr.num = EP_ID(ep_addr); + transc->max_len = max_len; + transc->ep_type = ep_type[ep_desc->bmAttributes & USB_EPTYPE_MASK]; + + /* active USB endpoint function */ + usb_transc_active (udev, transc); + + return 0; +} + +/*! + \brief configure the endpoint when it is disabled + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_ep_clear (usb_core_driver *udev, uint8_t ep_addr) +{ + usb_transc *transc; + + if (EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + } else { + transc = &udev->dev.transc_out[ep_addr]; + } + + /* deactive USB endpoint function */ + usb_transc_deactivate (udev, transc); + + return 0; +} + + +/*! + \brief endpoint prepare to receive data + \param[in] udev: pointer to usb core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[in] pbuf: user buffer address pointer + \param[in] len: buffer length + \param[out] none + \retval none +*/ +uint32_t usbd_ep_recev (usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t len) +{ + usb_transc *transc = &udev->dev.transc_out[EP_ID(ep_addr)]; + + /* setup the transfer */ + transc->xfer_buf = pbuf; + transc->xfer_len = len; + transc->xfer_count = 0; + + if (USB_USE_DMA == udev->bp.transfer_mode) { + transc->dma_addr = (uint32_t)pbuf; + } + + /* start the transfer */ + usb_transc_outxfer (udev, transc); + + return 0; +} + +/*! + \brief endpoint prepare to transmit data + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[in] pbuf: transmit buffer address pointer + \param[in] len: buffer length + \param[out] none + \retval none +*/ +uint32_t usbd_ep_send (usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t len) +{ + usb_transc *transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + + /* setup the transfer */ + transc->xfer_buf = pbuf; + transc->xfer_len = len; + transc->xfer_count = 0; + + if (USB_USE_DMA == udev->bp.transfer_mode) { + transc->dma_addr = (uint32_t)pbuf; + } + + /* start the transfer */ + usb_transc_inxfer (udev, transc); + + return 0; +} + +/*! + \brief set an endpoint to STALL status + \param[in] udev: pointer to USB core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_ep_stall (usb_core_driver *udev, uint8_t ep_addr) +{ + usb_transc *transc = NULL; + + if (EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + } else { + transc = &udev->dev.transc_out[ep_addr]; + } + + transc->ep_stall = 1; + + usb_transc_stall (udev, transc); + + return (0); +} + +/*! + \brief clear endpoint STALLed status + \param[in] udev: pointer to usb core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_ep_stall_clear (usb_core_driver *udev, uint8_t ep_addr) +{ + usb_transc *transc = NULL; + + if (EP_DIR(ep_addr)) { + transc = &udev->dev.transc_in[EP_ID(ep_addr)]; + } else { + transc = &udev->dev.transc_out[ep_addr]; + } + + transc->ep_stall = 0; + + usb_transc_clrstall (udev, transc); + + return (0); +} + +/*! + \brief flush the endpoint FIFOs + \param[in] udev: pointer to usb core instance + \param[in] ep_addr: endpoint address + in this parameter: + bit0..bit6: endpoint number (0..7) + bit7: endpoint direction which can be IN(1) or OUT(0) + \param[out] none + \retval none +*/ +uint32_t usbd_fifo_flush (usb_core_driver *udev, uint8_t ep_addr) +{ + if (EP_DIR(ep_addr)) { + usb_txfifo_flush (&udev->regs, EP_ID(ep_addr)); + } else { + usb_rxfifo_flush (&udev->regs); + } + + return (0); +} + +/*! + \brief set USB device address + \param[in] udev: pointer to USB core instance + \param[in] addr: device address to set + \param[out] none + \retval none +*/ +void usbd_addr_set (usb_core_driver *udev, uint8_t addr) +{ + usb_devaddr_set(udev, addr); +} + +/*! + \brief get the received data length + \param[in] udev: pointer to USB device instance + \param[in] ep_num: endpoint number + \param[out] none + \retval USB device operation cur_status +*/ +uint16_t usbd_rxcount_get (usb_core_driver *udev, uint8_t ep_num) +{ + return udev->dev.transc_out[ep_num].xfer_count; +} + +/*! + \brief device connect + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void usbd_connect (usb_core_driver *udev) +{ +#ifndef USE_OTG_MODE + /* connect device */ + usb_dev_connect (udev); + usb_mdelay(3); + +#endif /* USE_OTG_MODE */ +} + +/*! + \brief device disconnect + \param[in] udev: pointer to USB device instance + \param[out] none + \retval none +*/ +void usbd_disconnect (usb_core_driver *udev) +{ +#ifndef USE_OTG_MODE + /* disconnect device for 3ms */ + usb_dev_disconnect (udev); + usb_mdelay(3); +#endif /* USE_OTG_MODE */ +} diff --git a/firmware/midi2cv/src/drivers/usbfs/usbd_core.h b/firmware/midi2cv/src/drivers/usbfs/usbd_core.h new file mode 100644 index 0000000..c4ec47a --- /dev/null +++ b/firmware/midi2cv/src/drivers/usbfs/usbd_core.h @@ -0,0 +1,95 @@ +/*! + \file usbd_core.h + \brief USB device mode core functions protype + + \version 2019-06-05, V1.0.0, firmware for GD32 USBFS&USBHS +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef __USBD_CORE_H +#define __USBD_CORE_H + + +#include "drv_usb_core.h" +#include "drv_usb_dev.h" + +typedef enum +{ + USBD_OK = 0, /*!< status OK */ + USBD_BUSY, /*!< status busy */ + USBD_FAIL, /*!< status fail */ +} usbd_status; + +enum _usbd_status { + USBD_DEFAULT = 1, /*!< default status */ + USBD_ADDRESSED = 2, /*!< address send status */ + USBD_CONFIGURED = 3, /*!< configured status */ + USBD_SUSPENDED = 4 /*!< suspended status */ +}; + +/* function declarations */ + +/* device connect */ +void usbd_connect (usb_core_driver *udev); + +/* device disconnect */ +void usbd_disconnect (usb_core_driver *udev); + +/* set USB device address */ +void usbd_addr_set (usb_core_driver *udev, uint8_t addr); + +/* initailizes the USB device-mode stack and load the class driver */ +void usbd_init (usb_core_driver *udev, usb_core_enum core, usb_class_core *class_core); + +/* endpoint initialization */ +uint32_t usbd_ep_setup (usb_core_driver *udev, const usb_desc_ep *ep_desc); + +/* configure the endpoint when it is disabled */ +uint32_t usbd_ep_clear (usb_core_driver *udev, uint8_t ep_addr); + +/* endpoint prepare to receive data */ +uint32_t usbd_ep_recev (usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t len); + +/* endpoint prepare to transmit data */ +uint32_t usbd_ep_send (usb_core_driver *udev, uint8_t ep_addr, uint8_t *pbuf, uint16_t len); + +/* set an endpoint to STALL status */ +uint32_t usbd_ep_stall (usb_core_driver *udev, uint8_t ep_addr); + +/* clear endpoint STALLed status */ +uint32_t usbd_ep_stall_clear (usb_core_driver *udev, uint8_t ep_addr); + +/* flush the endpoint FIFOs */ +uint32_t usbd_fifo_flush (usb_core_driver *udev, uint8_t ep_addr); + +/* get the received data length */ +uint16_t usbd_rxcount_get (usb_core_driver *udev, uint8_t ep_num); + +#endif /* __USBD_CORE_H */ + diff --git a/firmware/midi2cv/src/gd32vf103.h b/firmware/midi2cv/src/gd32vf103.h new file mode 100644 index 0000000..3aba7a5 --- /dev/null +++ b/firmware/midi2cv/src/gd32vf103.h @@ -0,0 +1,241 @@ +/*! + \file gd32vf103.h + \brief general definitions for GD32VF103 + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +#ifndef GD32VF103_H +#define GD32VF103_H + +#ifdef cplusplus + extern "C" { +#endif + + /* IO definitions (access restrictions to peripheral registers) */ + /** + + IO Type Qualifiers are used + \li to specify the access to peripheral variables. + \li for automatic generation of peripheral register debug information. + */ + #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 */ + + /* define value of high speed crystal oscillator (HXTAL) in Hz */ + #if !defined HXTAL_VALUE + #ifdef GD32VF103R_START + #define HXTAL_VALUE ((uint32_t)25000000) /*!< value of the external oscillator in Hz */ + #define HXTAL_VALUE_8M HXTAL_VALUE +#elif defined(GD32VF103V_EVAL) || defined(GD32VF103C_START) || defined(GD32VF103T_START) + #define HXTAL_VALUE ((uint32_t)8000000) /*!< value of the external oscillator in Hz */ + #define HXTAL_VALUE_25M HXTAL_VALUE + #else + #error "Please select the target board type used in your application (in gd32vf103.h file)" + #endif + #endif /* high speed crystal oscillator value */ + +/* define startup timeout value of high speed crystal oscillator (HXTAL) */ +#if !defined (HXTAL_STARTUP_TIMEOUT) +#define HXTAL_STARTUP_TIMEOUT ((uint16_t)0xFFFF) +#endif /* high speed crystal oscillator startup timeout */ + +/* define value of internal 8MHz RC oscillator (IRC8M) in Hz */ +#if !defined (IRC8M_VALUE) +#define IRC8M_VALUE ((uint32_t)8000000) +#endif /* internal 8MHz RC oscillator value */ + +/* define startup timeout value of internal 8MHz RC oscillator (IRC8M) */ +#if !defined (IRC8M_STARTUP_TIMEOUT) +#define IRC8M_STARTUP_TIMEOUT ((uint16_t)0x0500) +#endif /* internal 8MHz RC oscillator startup timeout */ + +/* define value of internal 40KHz RC oscillator(IRC40K) in Hz */ +#if !defined (IRC40K_VALUE) +#define IRC40K_VALUE ((uint32_t)40000) +#endif /* internal 40KHz RC oscillator value */ + +/* define value of low speed crystal oscillator (LXTAL)in Hz */ +#if !defined (LXTAL_VALUE) +#define LXTAL_VALUE ((uint32_t)32768) +#endif /* low speed crystal oscillator value */ + +/* define interrupt number */ +typedef enum IRQn +{ + + CLIC_INT_RESERVED = 0, /*!< RISC-V reserved */ + CLIC_INT_SFT = 3, /*!< Software interrupt */ + CLIC_INT_TMR = 7, /*!< CPU Timer interrupt */ + CLIC_INT_BWEI = 17, /*!< Bus Error interrupt */ + CLIC_INT_PMOVI = 18, /*!< Performance Monitor */ + + /* interruput numbers */ + WWDGT_IRQn = 19, /*!< window watchDog timer interrupt */ + LVD_IRQn = 20, /*!< LVD through EXTI line detect interrupt */ + TAMPER_IRQn = 21, /*!< tamper through EXTI line detect */ + RTC_IRQn = 22, /*!< RTC alarm interrupt */ + FMC_IRQn = 23, /*!< FMC interrupt */ + RCU_CTC_IRQn = 24, /*!< RCU and CTC interrupt */ + EXTI0_IRQn = 25, /*!< EXTI line 0 interrupts */ + EXTI1_IRQn = 26, /*!< EXTI line 1 interrupts */ + EXTI2_IRQn = 27, /*!< EXTI line 2 interrupts */ + EXTI3_IRQn = 28, /*!< EXTI line 3 interrupts */ + EXTI4_IRQn = 29, /*!< EXTI line 4 interrupts */ + DMA0_Channel0_IRQn = 30, /*!< DMA0 channel0 interrupt */ + DMA0_Channel1_IRQn = 31, /*!< DMA0 channel1 interrupt */ + DMA0_Channel2_IRQn = 32, /*!< DMA0 channel2 interrupt */ + DMA0_Channel3_IRQn = 33, /*!< DMA0 channel3 interrupt */ + DMA0_Channel4_IRQn = 34, /*!< DMA0 channel4 interrupt */ + DMA0_Channel5_IRQn = 35, /*!< DMA0 channel5 interrupt */ + DMA0_Channel6_IRQn = 36, /*!< DMA0 channel6 interrupt */ + ADC0_1_IRQn = 37, /*!< ADC0 and ADC1 interrupt */ + CAN0_TX_IRQn = 38, /*!< CAN0 TX interrupts */ + CAN0_RX0_IRQn = 39, /*!< CAN0 RX0 interrupts */ + CAN0_RX1_IRQn = 40, /*!< CAN0 RX1 interrupts */ + CAN0_EWMC_IRQn = 41, /*!< CAN0 EWMC interrupts */ + EXTI5_9_IRQn = 42, /*!< EXTI[9:5] interrupts */ + TIMER0_BRK_IRQn = 43, /*!< TIMER0 break interrupts */ + TIMER0_UP_IRQn = 44, /*!< TIMER0 update interrupts */ + TIMER0_TRG_CMT_IRQn = 45, /*!< TIMER0 trigger and commutation interrupts */ + TIMER0_Channel_IRQn = 46, /*!< TIMER0 channel capture compare interrupts */ + TIMER1_IRQn = 47, /*!< TIMER1 interrupt */ + TIMER2_IRQn = 48, /*!< TIMER2 interrupt */ + TIMER3_IRQn = 49, /*!< TIMER3 interrupts */ + I2C0_EV_IRQn = 50, /*!< I2C0 event interrupt */ + I2C0_ER_IRQn = 51, /*!< I2C0 error interrupt */ + I2C1_EV_IRQn = 52, /*!< I2C1 event interrupt */ + I2C1_ER_IRQn = 53, /*!< I2C1 error interrupt */ + SPI0_IRQn = 54, /*!< SPI0 interrupt */ + SPI1_IRQn = 55, /*!< SPI1 interrupt */ + USART0_IRQn = 56, /*!< USART0 interrupt */ + USART1_IRQn = 57, /*!< USART1 interrupt */ + USART2_IRQn = 58, /*!< USART2 interrupt */ + EXTI10_15_IRQn = 59, /*!< EXTI[15:10] interrupts */ + RTC_ALARM_IRQn = 60, /*!< RTC alarm interrupt EXTI */ + USBFS_WKUP_IRQn = 61, /*!< USBFS wakeup interrupt */ + + EXMC_IRQn = 67, /*!< EXMC global interrupt */ + + TIMER4_IRQn = 69, /*!< TIMER4 global interrupt */ + SPI2_IRQn = 70, /*!< SPI2 global interrupt */ + UART3_IRQn = 71, /*!< UART3 global interrupt */ + UART4_IRQn = 72, /*!< UART4 global interrupt */ + TIMER5_IRQn = 73, /*!< TIMER5 global interrupt */ + TIMER6_IRQn = 74, /*!< TIMER6 global interrupt */ + DMA1_Channel0_IRQn = 75, /*!< DMA1 channel0 global interrupt */ + DMA1_Channel1_IRQn = 76, /*!< DMA1 channel1 global interrupt */ + DMA1_Channel2_IRQn = 77, /*!< DMA1 channel2 global interrupt */ + DMA1_Channel3_IRQn = 78, /*!< DMA1 channel3 global interrupt */ + DMA1_Channel4_IRQn = 79, /*!< DMA1 channel3 global interrupt */ + + CAN1_TX_IRQn = 82, /*!< CAN1 TX interrupt */ + CAN1_RX0_IRQn = 83, /*!< CAN1 RX0 interrupt */ + CAN1_RX1_IRQn = 84, /*!< CAN1 RX1 interrupt */ + CAN1_EWMC_IRQn = 85, /*!< CAN1 EWMC interrupt */ + USBFS_IRQn = 86, /*!< USBFS global interrupt */ + + ECLIC_NUM_INTERRUPTS +} IRQn_Type; + +/* includes */ +#include "system_gd32vf103.h" +#include + +/* enum definitions */ +typedef enum {DISABLE = 0, ENABLE = !DISABLE} EventStatus, ControlStatus; +typedef enum {FALSE = 0, TRUE = !FALSE} bool; +typedef enum {RESET = 0, SET = 1,MAX = 0X7FFFFFFF} FlagStatus; +typedef enum {ERROR = 0, SUCCESS = !ERROR} ErrStatus; + +/* bit operations */ +#define REG32(addr) (*(volatile uint32_t *)(uint32_t)(addr)) +#define REG16(addr) (*(volatile uint16_t *)(uint32_t)(addr)) +#define REG8(addr) (*(volatile uint8_t *)(uint32_t)(addr)) +#define BIT(x) ((uint32_t)((uint32_t)0x01U<<(x))) +#define BITS(start, end) ((0xFFFFFFFFUL << (start)) & (0xFFFFFFFFUL >> (31U - (uint32_t)(end)))) +#define GET_BITS(regval, start, end) (((regval) & BITS((start),(end))) >> (start)) + +/* main flash and SRAM memory map */ +#define FLASH_BASE ((uint32_t)0x08000000U) /*!< main FLASH base address */ +#define SRAM_BASE ((uint32_t)0x20000000U) /*!< SRAM0 base address */ +#define OB_BASE ((uint32_t)0x1FFFF800U) /*!< OB base address */ +#define DBG_BASE ((uint32_t)0xE0042000U) /*!< DBG base address */ +#define EXMC_BASE ((uint32_t)0xA0000000U) /*!< EXMC register base address */ + +/* peripheral memory map */ +#define APB1_BUS_BASE ((uint32_t)0x40000000U) /*!< apb1 base address */ +#define APB2_BUS_BASE ((uint32_t)0x40010000U) /*!< apb2 base address */ +#define AHB1_BUS_BASE ((uint32_t)0x40018000U) /*!< ahb1 base address */ +#define AHB3_BUS_BASE ((uint32_t)0x60000000U) /*!< ahb3 base address */ + +/* advanced peripheral bus 1 memory map */ +#define TIMER_BASE (APB1_BUS_BASE + 0x00000000U) /*!< TIMER base address */ +#define RTC_BASE (APB1_BUS_BASE + 0x00002800U) /*!< RTC base address */ +#define WWDGT_BASE (APB1_BUS_BASE + 0x00002C00U) /*!< WWDGT base address */ +#define FWDGT_BASE (APB1_BUS_BASE + 0x00003000U) /*!< FWDGT base address */ +#define SPI_BASE (APB1_BUS_BASE + 0x00003800U) /*!< SPI base address */ +#define USART_BASE (APB1_BUS_BASE + 0x00004400U) /*!< USART base address */ +#define I2C_BASE (APB1_BUS_BASE + 0x00005400U) /*!< I2C base address */ +#define CAN_BASE (APB1_BUS_BASE + 0x00006400U) /*!< CAN base address */ +#define BKP_BASE (APB1_BUS_BASE + 0x00006C00U) /*!< BKP base address */ +#define PMU_BASE (APB1_BUS_BASE + 0x00007000U) /*!< PMU base address */ +#define DAC_BASE (APB1_BUS_BASE + 0x00007400U) /*!< DAC base address */ + +/* advanced peripheral bus 2 memory map */ +#define AFIO_BASE (APB2_BUS_BASE + 0x00000000U) /*!< AFIO base address */ +#define EXTI_BASE (APB2_BUS_BASE + 0x00000400U) /*!< EXTI base address */ +#define GPIO_BASE (APB2_BUS_BASE + 0x00000800U) /*!< GPIO base address */ +#define ADC_BASE (APB2_BUS_BASE + 0x00002400U) /*!< ADC base address */ + +/* advanced high performance bus 1 memory map */ +#define DMA_BASE (AHB1_BUS_BASE + 0x00008000U) /*!< DMA base address */ +#define RCU_BASE (AHB1_BUS_BASE + 0x00009000U) /*!< RCU base address */ +#define FMC_BASE (AHB1_BUS_BASE + 0x0000A000U) /*!< FMC base address */ +#define CRC_BASE (AHB1_BUS_BASE + 0x0000B000U) /*!< CRC base address */ +#define USBFS_BASE (AHB1_BUS_BASE + 0x0FFE8000U) /*!< USBFS base address */ + +/* define marco USE_STDPERIPH_DRIVER */ +#if !defined USE_STDPERIPH_DRIVER +#define USE_STDPERIPH_DRIVER +#endif +#ifdef USE_STDPERIPH_DRIVER +#include "gd32vf103_libopt.h" +#endif /* USE_STDPERIPH_DRIVER */ + +#ifdef cplusplus +} +#endif +#endif diff --git a/firmware/midi2cv/src/main.c b/firmware/midi2cv/src/main.c new file mode 100644 index 0000000..af19bc9 --- /dev/null +++ b/firmware/midi2cv/src/main.c @@ -0,0 +1,159 @@ +/* + MIT License + + Copyright (c) 2020 nyannkov + + Permission is hereby granted, free of charge, to any person obtaining a copy + of this software and associated documentation files (the "Software"), to deal + in the Software without restriction, including without limitation the rights + to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + copies of the Software, and to permit persons to whom the Software is + furnished to do so, subject to the following conditions: + + The above copyright notice and this permission notice shall be included in all + copies or substantial portions of the Software. + + THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE + SOFTWARE. +*/ + +extern "C" +{ +#include + +//#include "gd32vf103.h" +#include +#include "drivers/usbfs/midi_cdc_core.h" +//#include "freerun_timer.h" +#include "drivers/usbfs/usb_midi_app.h" +//#include "usb_cdc_app.h" +} + +#define BLINK_CYCLE 1000000 + +static void config_eclic(void); +static void enable_periph_clock(void); +static void config_gpio(void); +static void led_blink(void); + +int main(void) +{ + + config_eclic(); + + enable_periph_clock(); + + config_gpio(); + +// init_freerun_timer(); + + // initialize an application of usb midi. +// init_usb_midi_app(); + + // initialize an application of usb cdc. +// init_usb_cdc_app(); + + // start the usb midi cdc device. + init_usbd_midi(usb_midi_proc); + + while(1) + { +// led_blink(); + } + + return 0; +} + +static void enable_periph_clock(void) +{ + // SPI1, LED + rcu_periph_clock_enable(RCU_GPIOA); + rcu_periph_clock_enable(RCU_GPIOB); + rcu_periph_clock_enable(RCU_SPI1); + + // free-running timer + rcu_periph_clock_enable(RCU_TIMER5); + + // USB device + rcu_periph_clock_enable(RCU_TIMER2); + rcu_periph_clock_enable(RCU_TIMER6); + usb_rcu_config(); + +#ifdef USE_SINGLE_YMZ294 + // SPI0 + rcu_periph_clock_enable(RCU_SPI0); + // TIMER1(YMZ294 phiM) + rcu_periph_clock_enable(RCU_TIMER1); // pwm Output +#endif +} + +static void config_gpio(void) +{ + /* SPI1 GPIO config: SCK/PB13, MOSI/PB15 */ + gpio_init(GPIOB, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_13 | GPIO_PIN_15); + + // used as SPI1 NSS but configured as GPIO output. + gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_12); + + /* SPI1 GPIO config: MISO/PB14 */ + gpio_init(GPIOB, GPIO_MODE_IN_FLOATING, GPIO_OSPEED_50MHZ, GPIO_PIN_14); + + // RST_N of ymf825 board + gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_11); + + // LED + gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_2); + gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); + +#ifdef USE_SINGLE_YMZ294 + // YMZ294 AO + gpio_init(GPIOB, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_9); + + // YMZ294 /WR and /CS + gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_0); + + // YMZ294 phiM (4 MHz clock in) + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_1); + + // SN74HC164N /CLR + gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_4); + + // SN74HC164N B + gpio_init(GPIOA, GPIO_MODE_OUT_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_6); + + /* SPI0 GPIO config:SCK/PA5, MOSI/PA7 */ + gpio_init(GPIOA, GPIO_MODE_AF_PP, GPIO_OSPEED_50MHZ, GPIO_PIN_5 | GPIO_PIN_7); +#endif +} + +static void config_eclic(void) +{ + eclic_global_interrupt_enable(); + eclic_priority_group_set(ECLIC_PRIGROUP_LEVEL2_PRIO2); +} + +static void led_blink(void) +{ + static uint32_t cycle_counter = 0; + static int32_t led_output = 0; + + if ( cycle_counter++ >= BLINK_CYCLE ) + { + cycle_counter = 0; + if ( led_output == 0 ) + { + gpio_bit_set(GPIOA, GPIO_PIN_2); + led_output = 1; + } + else + { + gpio_bit_reset(GPIOA, GPIO_PIN_2); + led_output = 0; + } + } +} diff --git a/firmware/midi2cv/src/system_gd32vf103.h b/firmware/midi2cv/src/system_gd32vf103.h new file mode 100644 index 0000000..9626310 --- /dev/null +++ b/firmware/midi2cv/src/system_gd32vf103.h @@ -0,0 +1,60 @@ +/*! + \file system_gd32vf103.h + \brief RISC-V Device Peripheral Access Layer Header File for + GD32VF103 Device Series + + \version 2019-06-05, V1.0.0, firmware for GD32VF103 +*/ + +/* + Copyright (c) 2019, GigaDevice Semiconductor Inc. + + Redistribution and use in source and binary forms, with or without modification, +are permitted provided that the following conditions are met: + + 1. Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + 2. Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + 3. Neither the name of the copyright holder nor the names of its contributors + may be used to endorse or promote products derived from this software without + specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED +WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. +IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, +INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT +NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR +PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, +WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) +ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY +OF SUCH DAMAGE. +*/ + +/* This file refers the RISC-V standard, some adjustments are made according to GigaDevice chips */ + +#ifndef SYSTEM_GD32VF103_H +#define SYSTEM_GD32VF103_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include + +/* system clock frequency (core clock) */ +extern uint32_t SystemCoreClock; + +/* function declarations */ +/* initialize the system and update the SystemCoreClock variable */ +extern void SystemInit(void); +/* update the SystemCoreClock with current core clock retrieved from cpu registers */ +extern void SystemCoreClockUpdate(void); + +#ifdef __cplusplus +} +#endif + +#endif /* SYSTEM_GD32VF103_H */ diff --git a/firmware/tools/generateLUT.py b/firmware/tools/generateLUT.py new file mode 100644 index 0000000..91b4f1e --- /dev/null +++ b/firmware/tools/generateLUT.py @@ -0,0 +1,70 @@ +# This program generates LUT (look-up-table) for ADC to frequency conversion +# v0.1 2021-07-30 Johan von Konow +# + +adStart = 1472 #(was 1433) # -3V (midi 0) +adEnd = 3584 #(was 3687) # +8V > midi 127 (7.58V) +samplingFrequency = 44400 +periodLength = 65536 + + +def ad_2_xStep(ad): + return (2*periodLength*(55 * pow(2, (ad-128)/192-39/4))/samplingFrequency) + + +def midi_2_freq(midi): + return (55*pow(2, ((midi-33)/12))) + + +def freq_2_xStep(freq): + return((2*periodLength*freq)/samplingFrequency) + + +def quantize(ad): + i = 0 + while (ad > midiStep[i]): + if(i < len(midiStep)-1): + i += 1 + else: + break + if(ad-midiStep[i-1] > midiStep[i]-ad): + return(midiStep[i]) +# return(i) + else: + return(midiStep[i-1]) +# return(i-1) + + +lut = [] +for x in range(adStart, adEnd + 1): + lut.append(ad_2_xStep(x)) + +midiFreq = [] +for x in range(0, 127+1): + midiFreq.append(midi_2_freq(x)) + +midiStep = [] +for x in range(0, 127+1): + midiStep.append(freq_2_xStep(midi_2_freq(x))) + +q_lut = [] +for x in range(adStart, adEnd + 1): + q_lut.append(quantize(ad_2_xStep(x))) + +# print(ad_2_xStep(2611.2)) + +#print("const uint16_t freq["+str(len(lut)) + "] = {" + ', '.join(str(int(x)) for x in lut) + "};") +#print() +#print("const uint16_t qfreq["+str(len(q_lut)) + "] = {" + ', '.join(str(int(x)) for x in q_lut) + "};") + +print("const float freq["+str(len(lut)) + "] = {" + ', '.join(str(x) for x in lut) + "};") +#print() +#print("const float qfreq["+str(len(q_lut)) + "] = {" + ', '.join(str(x) for x in q_lut) + "};") + +#print(midiStep) +#print(quantize(31137)) +#print(quantize(31139)) + +### test that formula below results in correct quantization (removing need for dedicated q_lut) +#for x in range(adStart, adStart + 20): +# print("x" + str(x) + ":" + str(lut[int((x-adStart+8)/16)*16])) \ No newline at end of file diff --git a/firmware/tools/generateMenu.py b/firmware/tools/generateMenu.py new file mode 100644 index 0000000..a28abdf --- /dev/null +++ b/firmware/tools/generateMenu.py @@ -0,0 +1,106 @@ +# This program generates C code for menu navigation from a human readable menu file +# input file need to use tabs for menu depth (not spaces) +# input files is assumed to have "back" element first at a new level +# input file can contain "|" and position for fixed adresses +# v0.8 2021-06-21 Johan von Konow +# +# example menu: +# settings +# back +# about|131 +# calibrate|132 +# +# ==> generates: +# const char *menuTxt[] = {"settings", "back", "about", "calibrate"}; +# uint8_t menuPre[] = {0, 1, 1, 2}; +# uint8_t menuNxt[] = {0, 2, 3, 3}; +# uint8_t menuSel[] = {2, 0, 131, 132}; + + +filepath = 'menu.txt' # <== file to parse +# open file and create lvl (menu depth / tabCount) txt and jmp array +id = 0 +txt = [] +jmp = [] +lvl = [] +define = [] +for line in open(filepath, "r"): + lvl.append(0) + # avoid removing last char at eof + if line[-1:] != "\n": + line += ("\n") + i = 0 + while line[i] == '\t': + lvl[id] += 1 + i += 1 + # create txt array (name of the menu items) + jmpPos = line.find('|') + txt.append(line[i: jmpPos]) + # create jmp array (fixed jump for functions) + if jmpPos > 0: + jmp.append(int(line[jmpPos + 1: -1])) + define.append(line[i: jmpPos].replace(" ","_") +" " + line[jmpPos + 1: -1]) + else: + jmp.append(0) + id += 1 + +# create id array (for print / debugging assistance) +ida = [] +for x in range(len(lvl)): + ida.append(x) + +# create prev array +pre = [] +for id in range(len(lvl)): + i = 1 + pre.append(id) + if(id - i >= 0): + while lvl[id] < lvl[id-i]: + i += 1 + if(id - i == 0): + break + if(id-i < len(lvl)): + if (lvl[id] == lvl[id-i]): + pre[id] = id-i + +# create next array +nxt = [] +for id in range(len(lvl)): + i = 1 + nxt.append(id) + if(id + i < len(lvl)): + while lvl[id] < lvl[id+i]: + i += 1 + if(id + i >= len(lvl)): + break + if(id+i < len(lvl)): + if (lvl[id] == lvl[id+i]): + nxt[id] = id+i + +# create select array +sel = [] +for id in range(len(lvl)): + sel.append(id) + # enter next lvl?(skips first element (back)) + if(id+2 < len(lvl)): + if (lvl[id] + 1 == lvl[id+1] & lvl[id] + 1 == lvl[id+2]): + sel[id] = id+2 + # back to previous lvl? + if(id > 0): + if (lvl[id] - 1 == lvl[id-1]): + sel[id] = id-1 + # jump to fixed position? + if jmp[id] > 0: + sel[id] = jmp[id] + +#print("row: " + str(ida)) +#print("lev: " + str(lvl)) +#print("jmp: " + str(jmp)) +#print("jmp: " + str(txt)) +#print("define: " + str(define)) +#print() +print("const char *menuTxt[] = {\"" + '\", \"'.join(str(x) for x in txt) + "\"};") +print("uint8_t menuPre[] = {" + ', '.join(str(x) for x in pre) + "};") +print("uint8_t menuNxt[] = {" + ', '.join(str(x) for x in nxt) + "};") +print("uint8_t menuSel[] = {" + ', '.join(str(x) for x in sel) + "};") +print("#define mode_" + "\n#define mode_".join(str(x) for x in define)) diff --git a/firmware/tools/img.py b/firmware/tools/img.py new file mode 100644 index 0000000..db25d95 --- /dev/null +++ b/firmware/tools/img.py @@ -0,0 +1,102 @@ + +import numpy as np +import cv2 # pip install opencv-python +import matplotlib.pyplot as plt # used to show image +import os # used for filesize + + +def show(img, figsize=(10, 10), title="Image"): + figure = plt.figure(figsize=figsize) + plt.imshow(img) + plt.show() + + +def monochrome(img): + encoded = [] + th = 127 + for pixel in img: + if pixel < th: + encoded.append(0) + else: + encoded.append(1) + return np.array(encoded) + + +def xorRowCompress(img, col): + for x in range(1, len(img)-col): + img[len(img)-x] ^= img[len(img)-x-col] + return np.array(img) + + +def RLE_encoding(img): + encoded = [] + count = -1 + prev = 0 + for pixel in img: + if prev != pixel: + encoded.append(count) + prev = pixel + count = -1 + if count == 254: + encoded.append(255) + count = -1 + count += 1 + encoded.append(count) + return np.array(encoded) + + +def combo_decode(encoded): + decoded = [] + preRow = [0] * 240 + pixel = 0 + invert = 0 + x = 0 + for pixelCount in encoded: + if pixelCount < 255: + pixelCount += 1 + invert = 1 + for z in range(pixelCount): + preRow[x] ^= pixel + decoded.append(preRow[x]) + x += 1 + if x == 240: + x = 0 + if invert == 1: + pixel ^= 1 + invert = 0 + return np.array(decoded) + + +fpath = "in.png" +img = cv2.imread(fpath, 0) +shape = img.shape +fimg = img.flatten() +fimg = monochrome(fimg) +ximg = fimg # copy for file size comparison +# show(fimg.reshape(shape)) +xorRowCompress(ximg, 240) +encoded = RLE_encoding(ximg) # <== encoded contains the compressed image + +# decode and show to verify result +oimg = combo_decode(encoded) +show(oimg.reshape(shape)) + +# save with different file formats for file size comparison +cv2.imwrite("out.tif", fimg.reshape(shape)) +cv2.imwrite("out.png", fimg.reshape(shape)) +cv2.imwrite("out.jpg", fimg.reshape(shape)) +f = open("out.jvk", "wb") +for x in encoded.astype(np.uint8): + f.write(x) +f.close() + +# print size of each file +print("16bit size:" + str(len(fimg)*2)) +print("mono size:" + str(len(fimg)/8)) +files = ["out.tif", "out.jpg", "out.png", "out.jvk"] +for f in files: + print(f"File: {f} => Size: {os.path.getsize(f)} Bytes") +print("encoded bytes: "+str(len(encoded))) + +print("\nconst uint8_t img["+str(len(encoded))+"] = {" + ','.join(str(x) + for x in encoded.astype(np.uint8)) + "};") diff --git a/firmware/tools/in.png b/firmware/tools/in.png new file mode 100644 index 0000000000000000000000000000000000000000..03b8c28f8b40a239e77c936ef0c790d022481c57 GIT binary patch literal 741 zcmVEX>4Tx04R}tkv&MmP!xqvQ>7x64t5Yx$xxjvh>AE$6^me@v=v%)FnQ@8G-*gu zTpR`0f`dPcRRqpci*4Yr{qlr_(bA4rW+RV2Jy_M zrE}gV4zrS^5T6r|8+1Y9N3P2*zi}=)Ebz>*kx9)Hhl#~v2g@DIN`^{2O&n2Fjq-)8 z%L?Z$&T6H`TKD8H4Cb|!G}mbjA&w;^kc0>sHIz|-g(&SBDJD{M9`o=II{qZNWO9|k z$gzMbR7j2={11N5)+|g-x=Fzp(EVcDAEQ8E7iiXP`}^3on+e)kfB*E-v9@P zz*v#8*FE0d(>b?)ds_4R0Z<8YnWgrR8vp_CX>@2HM@dakSAh-}0002INkl$L>(6j2UbRK_n^xn3^3{BeBao)$C;rEAf)qV#Zn0 zz?g%^bf*%}5rCc)agFJ58FpK5O*C-}A~Tl0&9w5%ayZ2c&z@(;^UU>JpJH`5_d6^P zH@3qsU#b|o_9?^gO7>WDY$I`h{2MEdrS{Y XB?h)B0`!!J00000NkvXXu0mjfzYaLL literal 0 HcmV?d00001 diff --git a/firmware/tools/menu.txt b/firmware/tools/menu.txt new file mode 100644 index 0000000..6727416 --- /dev/null +++ b/firmware/tools/menu.txt @@ -0,0 +1,63 @@ +OSC + < back + sine am|128 + sine add|129 + sine fm|130 + square am|131 + square add|132 + square fm|133 + square pw|134 + square 2x|135 + square 3x|136 + triangle am|137 + triangle add|138 + triangle fm|139 + triangle saw|140 + triangle 2x|141 + triangle 3x|142 + quantize|143 + cvout|144 +Noise|145 +LFO + < back + LFO sine|146 + LFO square|147 + LFO triangle|148 +VCF + < back + 2 pole v1|150 + 2 pole v2|151 + 4 pole|152 + test|153 +VCA|160 +SnH|161 +Envelope + F!l)YX!=*|VnK~v!N`Mm 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

    DiJ@}<;z*6-t})>^gXN+@xoQ* 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�B-5!s}mC})*iapKitSga%GH3ACr_tG?fo1^1 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�s~ZKLHgTZW6ejtn-cyDa(gyXxX=p?vjI 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 z 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

    V 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 eyJ`u#^+CLDwQCl;R=|K?MXA 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ν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

    b`z(L-n!TnY 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�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 z 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 C%;&)X literal 0 HcmV?d00001 diff --git a/hardware/pcb/3D-print/front-integrated2.stl b/hardware/pcb/3D-print/front-integrated2.stl new file mode 100644 index 0000000000000000000000000000000000000000..3e900caa2bf1ec0e20076351a93131cc4c2bf36c GIT binary patch literal 974684 zcma&P3$(3CRo}ab-XTI53?KMFZC;{5qL}1rKnw&}bhYE%X8Vpza16=z{}n zZD5%LX4AOEY|%~Y_UI0HY;pvTM5LjmcW?A2a?u;Pb_4~YMiL)rYvN;YBbr=~Cc^tQzP~vkK0}y1M^KA=89{bxebcQknD{{i zwIq-IV84bo+YK@Dg9vJoFZ;2n^@}xDKljF)iytP>5!90Wwwqwp+HmWmuldVud06{p zK9;diKW`jGSRc__qV03*sUg-eu8e&X0jmV7h%3M2hGvz?e{+RK$&cRt9QjdYDc8TX zIEbK@$s?=SLc|h<0S6J(8pf(x^#h-Bs`+8E+5QJtJbU5?5!5ny>MYqSYVo|unS%&wN%o#L z5#Fz%|Hdn|{K%DItvT3R;#%a(9Au|f$^XO;BB&*K>_@M)_xYb!<5p(#%H?bo5!90G z5!pm|UuKELM+lF?96>GeHAE5W>fG$LC>RI%8e%O(A5mJE{3zO18Tx)5!JZn2K-x2u znAloWYP)jaYe|zUVr{s(;nQUm&E&mpj`QcF{-`sO*k%Jay4)#T~<$Sc(5{d(<<6wwr~MbexuPZXE zcD9NLYB6pZQFcXbc1re$S{)nZoCs>MJ`Ok@^jmc$s~pQJTG5LltFKi?ER8&j-VE;%?Qm-@3)T1*m1PaD`IW9rNS** zL~G7_PZ_~}d&GEOqQ1OEGWIA<7w$rCMf?DLu2F~-cv?!9&mn;Z;qfAt!;=R ztdAb>zH3+dM0;x6=~;z)^Bb>QeaSD~|8jj^5$pPIL9m60Th2Xe^@ZyyrOs1Y6{}BYx$&Z(W`Lh)J@l_15D3!v_^7I7h`lMoS`6_+Ks=zXKAToO{yu9F z;%C3{`>K{WKIfWOPY~WB#O-f?V?(_8s`pF~-Xg@=&-t~6c;D;aJ3)90>y@nfllR*7 z=cXUtB7|2vA-1;c3V9RZE!+VpvtR#?5rQo>=gX?E(R1H-*f(L3)foB=1;#Dh;?Bq|63oirLJnru0|E( zV-K|*PP3{a*g}M=(nGH65TZF^3+ucp-;eH&5Nu&RS9N{pog)NWxXP%4|KWW=6d%lU zwh&>f#0O*S7J$!ltsmC%?$>=*ku9PRc;9ba>7Prv{;lOXTORz@cU}44&j+t=h!U$!L~*~a zwXNlkU-b>g|L&tUCm!+r&pH0)8!sD0yEN0YN5OJ`j%#VgB zmEm~j2i})6SP^Uy0=4A$)ldJ=6NI-2;rlD~w0G~X2VyOo%=2jJ5wH8EUk!u-YOG## z>@B5=9{TM12bKCEjAiSkVyyv^_m>|4Gh&NyLBaP$3 zJ0>qK)c+{wFFN*?9`WuceEWpMTZA}#`ePf%d%oon6NI-2@nfI;ZeItFzxRiKJyz!w zU2jo7usRj zYv-~O9Z&Z@t;MXeE9|lo9dGQf)*8EPA)>5A$J0GrYgwXO{U|HZ@pPZqTFM%w=vG8o ziH_4=w0X`JRR-*LkJEm)_+Yi9tWm9nh_VtLPxsWVrL0knqpU>78~gSeE4Gw1sv*is zbi8qGP!Vh?D^5d{mFPHKe-t;`8r52eu)1qkGE$bd{=Dv5i`DscjjpW{KvZ=@Xl1b$ z(=x=?XTJO~{<;1e9BldB-#;o^jpIrww*9XDpY_6VrT!na6pkVrqFA`{&-GvbTOYB- zWao%$xT?J_|Caw%&r4sMT0~dG@{eg#YaMh32!jWO}2*DPPtFL&pLkcbAEb&V2jN`JAXM4#UlN!kJz%z^Q!f@ zTTUO}eEi{zSPQ`xBD9v=_rU)nDs|EJaTP5>L~TEP{K2EAP7vN=9QNEu93S|hHwL0m z=ubJ1mb^xtK7RLA_e~JqqE*IMIIfA-xd@ztt0h-aUw1bV-XadJ)V>?oM0kr3+&}mp zWfS2oLU32(`=CvPw+O+V(_jC}e~LZBy5g4TdQ0Asoj(4a5C29+6qMz|Ta>}rC!Q`d zt-FFOG=}h&I!cy%q>uc{8;<|_Ln8!Rxc5D{{`%u*|JZ21%N8QIzpg$PAN03AVvEgr zyB^>k-c;+q1;G~X`gxs@5p1yFlgPb+ggYy)phlP8#;tQM{LpcxpS22y86fWVeA%d z{nfhLTFPi|ck4@aUHz}`7$Mj~M5$M+!}pD^)uKfR%)!enkcuT21E8hL``(>L5ZxMob*!-ScMXbxe<$uQEEkf`v z-Wy){z^GRh<_K@uMA)6eMY;aRINtC=-b3WQMY|h0LRgEQC}ABeBY%92bGo$%;nz5C z+&jH`!CU_@R_BGN+>Jtuao82hcfRe0)sz40uMZGx(b)B?qGvzxTUPh~tG5SYZ6xa> zwh(dM7d~tCeJ}l~KnPG!>m#;kM)?)Xjjwy=>gzxB+KdqBh%H3C>mApv-tw`X0fH@t zuxAs`yyqKM4|>$U3PiEUtYQlhR%1rHzJ6!ndyz6%%C(5?QA+RaFP~4;&Vsud&wo=d zf+4&`2;Wl~hh5_~#9D~WD{Q+ar?nMPw9WJW3j6r#xbhzRVI0QJt8MmFIrPt3RvEh? zOv^?hd#Z?{Z3teI_t)w^@+(6Bti{28c@@u|GGfV89SuuF>(d@yM>m9MmJ_Dt$L4PN zdj{ibiF<9Kg^Wn!Sc`+~yzXaD6;ZVHw>~O!TO+P=&?@fwO;_qdSc}aGUd3Ba_IX7V zZT-3Dn;hgeU8xJfzR1ByS47d)-}=a|`;CKFFJ(S9|4divLRgF0%liSmgHRDgTYru) zj?JsEk>`vet)jKoy9mTVcHY-u)GMNB>(AzgKUwE}SjEaeH&v-SBG&M@L#t7e5EUi_ z`%*38{@Q!mT+ZrX= zXF=w$7R#-kh4>w)lBa?g<=j>P8zo$?3}K&}18x=9jLp>t2m#j02if(!#qV;lr`mhb z)}Nmv^Q+%@=2_~BJRe-wvPC7x>6UyJhYjk=aGIFSco*E7MLS!9&E-6bFd-U7dbea7v;q&jXw8WPn7*W zKI7I9MOYtkyy~g7KPzBQ6|pwlGCu~-vujWN>9)#I*_Znl%9>Z_IzM_u;W4YI<@J$0 znLTb5+2w~nm#=;-+!>)L`q?2x*Pk^j>i&5{tYwv2M%S|H$v>}%qOCtecwgku=<&}@ zSL#Bj#ru-%Q6P6i2viZ?m&TPpmuF8EQTo?k<{(0I(78?5{}oZA$B7CT3rbLydeattAV#@{qVCU z>}eC>>_YIYiT6|yYs1wYSsM*n2mM5X)<@55=Fkf1QS9&NY#<7ct+kHe{TcRDIf}Oa z4B>rg&)_F3IB!f>>OycHkVAercSRI!{pqejJbmGH=EvOuY^=^a`(>Tie+x&g49mJ* z>&Nn)IPL~a*AZ&*b5_c;udfopyJ~iiOj;fvp*~Rs?ibv7*`c1L-t&Yjh`%E!3u9GeJg{p210`Z3;9 zaC~3oxc2zJU-P`u?|$WQEyc>^K-{)iGUj@`nc zC%N~%?G44M3oFTPN#Seq96>F~-cv^C&cC-vb`J6hvHnE)A*+a>7Of2qi*EEQw8u&a zm*)s-kuM|ILWDdYa}Yr-#w|FMbM`CQ^DKnRa|E@>ml2GQWbc=Ja|E?$?Hs}RLB2pJ zgPb|Ng+5~HX#Xr9?R~$V1NIagKe&vmKY!eV%4k2k`rRA8x6JKdeDuwipQ-03Tn>ct z(Q`OD`|*~qd+=xb*zNmu1bfOH>`SsE6kV6+2x>7m8Nn7JY$RGl<_KzWj0Hl`WxvMf z(bd>Bd5*At1F`9OpFxY8A;_0G`iQzEv^Eg0T1JU$Ex9S9mKHB?! zGoK@zW2x=1L{^y==S|gLk2t86XVg{qfAP_qzI*p>Vg1hkotK?o`EvuU?eY0xxfeu4 zXkCETdB_(sVjT$fOFkj~@K0ZM^pl@^*E@?*Yu~GBtqu7wS(p%8p>-i?1-Ce!{IKhf z{`P-wm2=HoYd>vx=VcdHAzxVeu20;7D9Cf6bunoL;$lJEdcPZwKKaw{Rdm-8#fvFE z(UUlUKt8fnfe^=I9(Bdh@pB(r{qScV@+0I6E8mNnA3$t{*2Sb12yy(&UwPWm&wS)F zDhE9b`9k7Lh^^4dR*^d))`4IS&V%E8whA1yga}0!p09&FBf@iW0D)LBqUTfG5&|5w z|Vf(IuDsMD$l`; zh_N6JpS5`o=1~%eIR`B{OmUlW{2m2+W^Bnou z!@S!?6vQ#kN46?rB@WCe%)x!k!9C2u4uP7;nM#E6;ngSCl8lIYB@RdAdX+~>Am$vj zWH-fa#*w2N9G&Ng)gEHCi&!Zih%RE4t%`ajj`5yackW(vT;g}7?y$uUS)K!dJvDdU zL}>lswL$E64^qGJxj2Xj_PnYEqT|5T1jiNmIz)<9@a?8Z&#WQ`bJO_&tJv>eib9Gm zu5omi)AO+lgmOO42XjD#tontrXTPfK-8Db_n@GAg2>HUQJYB5cH?nI3Ahts5V$uqP zt_^;^Tzh<3xdstO)V_Q*5j|-~=7@s2j0kFlERK(U+P!zL%e9m^{8W(q2>HUw&oG%E zKx~E9#iSJoaeS;?3tm;O3B^GVL%xvs5@IW~vQ^|x2yie5=fR zMug|$00OaMM9-(VB?LHV$srJ$gJTZ%OGM{6Vs#!P@er{R$2eBms>p{pd?eGa&&`(p66KQtJH{<^5N0V zvC38jLL9$e?)m&dx%VRu|1P5DbI4k+_~geC5B#godUR;%PElw{_9rP@TlbW^U0+@9 zdWnPcfav&K(Iq0Z@^}q|JO^Sc5P3$$=N$r89VE}E9EjCE=G_5gtp;PO=m+_P@aX1z z9KtHCSMkIw5Fh^GPenc~YyPBxxd}w(*aydM0ndDaF(IR^q9w1lHlu>t}dxqbvk=Q(1PGZ?WF2cnBuWvc=)=itcL zLv(eGGv?S&TEWqIj#y@ zB39z?8I|W?zLya*iiljV_EDqCcfFQ3B4qCFC;x^;R z(G3oIo@15o$%N-z4RWlqRe_ju@LtajqPv3(W{%yY6&$h((M3KoB0Lud5UA~p=*~R4 z;GpeifjB$mV82Ar^PGT2uzq ztBir_A?Ekb2$mo^1*(kQx>k zj+k@M62-?67ON455Y!5J7AqnAIzjzLtd#Rnta_^gAr4%z;Hqc`S4FH6S`CPZ>(>~& zcV3p~d_v%=i2agJqkVkMxeKe#E?4({{>l;GnyxwRsxeO1@br!&G!p5D%Zje9ApMk0 zSoQReJ_OgbW{GRrb*)>)SaGg7hsKhBZsUpw*ODc!rEG?*oCAUAM!!O^r-W!Zzxnd* zq&4MevC_G&(AtK4YGPIPgM31a@*zane#-9wEN8qN!TSu6wI@}roI#%-tUf}-jM~PG z+AdZ(g4IWem_emYf1w(H(PaC#~S1=Q&o}h}9`X zK^)^)WvdvswANz9$)3mhA*;qK4%emaZjHiPi=DMZLNhL&8pmQ@EHQpMLx6xuzU#Z+-4OJ$VcRW2;;z0eVhZ}Q{)|-1K25^ z1A%ATJS{+kqU$FhG(X~mKt{yr1aUYbpPAsPhn>j@h|EDt&H|xvHRfQyM0B1bRvdk2 z5i4EHUT{t(dmg7=It0!w@ifg&cd`a2gmB&`BYcmd{q^ijQNHgJ2<3dt zK}+H)%tj&*Tl6scC8F~jvC0{Yo|F$n7qQA#1!B$-BSTff5t3&dXOosAHatf@GQy)^ z93HFk-*fDXS}xByvhCcLs=_%(nNcktLU_NbB_Vg7w|ofUb6W_v*6P(LAH7w95C>)y z=3uV7KBLrAAPVxFS7*h9S}t3xyfWlkk`dvPIDpt?V&xp=zwNsK zeRKms&*g`EE=0&@5?{nhIS;LDRaiLZ;A*)Ij&0;4bI=kZG!or&`4Q|H5uS^~5jj?j z==LPKnS+*`0z$i`F$eo4qVpX2*hW51Ay(qRXh%M>RS^+!U`AmMX3t|rb%<6I^Gx0D zW-Tg1t5-cDDuXzHKrLbY;FVrieZWCWxW87c#vJUIh|Y7wDrYcaB@RRvvC38jV$Q*l zaT3whzJ1JbDrp5r=Q(1P5s?pZjAO<4oJ4K!Mk2=UDU98d7`x&ak6n&%BE;b{D$l`; zh9m`z^(G0J{}_c_;?)Vt^L-4mpW;^L;HR88`ip0O(TRfC^7m!jdG0N%CYKYf{sudp zZk;2j)#TFC*4A%)@V2{u{M%n#IduP1ZvqxalS{wkONin}AgI;k%7JlJqpM#yF%El| zo@`gF^lK&N$AXaKHC9BpRzp;dYaV;+(dk>i^a?@fVUrh*+Ea}c5bLH@Jt{8v5hK%K9bR5S>*Ueh}e4rTI}1%Z#ey%4gRd zF{8>@NQmNjAYv8)QAf#eo|hIPVxEg*hM-oH=N!e}#!=qx5D4XC$Wai~YI5&+#HzGJ z6wW8UNvt}nnuV1E>qo3O#Y0-65o+s)Vg*F3I0ZqiCf8Ukb5J9(juKzJnpX8`*~wI^ zFl$TBeP^*bYi%TsW|Z3-=u3?D;GiWXgF@Rl?mUlJ6-0~Gf-wJ-^I@zO4%ccHR?mS5 z4vwXBHiON-*Uva;2@&OUWuaE;wWP*AK==%nUaRd9s|Dd&Emm`mWC`j@x%QcGEC|ap z5asg}-H26biF_EsA}tO?H^%P3s)#Q3J|$LOeKaz>UcEl%V6_T}601POyaS@fYFHUc z3lYty$}vMwtI2bY(pTdsIS7PeHRLD=YBjm{JYrQ^A_|9zZ&t6eRn5Z6(T`pIevt1= zOtzfsw-0qqy*aLka4n5ple=0{N4u}|(jwYE2SQ}UbJsFUh#s!zKy2iiha^U^{@%yV(f5Y%e&oP)Msc7VEaFyknQ=og6I^N3Yxi6|U| zPlaz1tIjG$A*~;=;uH^?Rh7?oON!NS#VH7lV_Ripq3>`;qup1prnPX`x+{*QCRU+o zEgY_;&wUkbh_$4KpzS3-fl#c59JGXp@_F(+VpUpNtQLg%CyrsP23C385+XQCzm4PE z?GfD~Cq(Q3XbBPJ^XBcUMmRd{;)u5a68nNx#00^san|z}gMN7zMD<=?@EUenxml$GHMcJ>(Tz3^+_)%j; zg!M}VtXd1&qF6IHh+7?3;6SV}w->a};A9mL%!kcK_o*Q|t6p2{plda2>$d^NR@q*} zGH7VCYA?qMR?!dg0U@h45N4I}S)_pwU>!MU4v0Vo*MbDXw2Xthvu;NQ4)#j~tP)2> zSbScC=o<)nrx%jrJ0&+^_LnVzdXx z;;oHvAm*_uEiG0h2aUVtV;Cz&l!!S;(P|v$YzAB0UNg-HEFq#=wL~|^Dp_J2K7$q0 zwsJKDz3Ie8BeQJcC8Lt0lp)*zQ`5qkNu5VvOC=(qgr6SpLN^&c~)z5narv z;)hosMc3=qYhn&otAHqe1S0Ac5H%m;>cg1|pDM=;(L7I4m{%WKvYX;It5>k3M3;Q2 zQb(+cB@u<)h*doSF^p9~v{)6bCRfk4+j{lkogXQmkH!@duBCBhaesvopnIdBU-Hf=yA7jV95Y1B2_WViw7s0>Z|Himf5=e~)M|41Jb7O7;Wg^Eh*jyg&8W&Tj8$h< zLsSk_(Wtw{Lt3JoTNRa6Kw!^cvRY+`S5EU`w!2n~G(BG{ zyliRm!eNmX$1qkYK4z7z?K^>33)}Z=@v(Yk2z_H@$U#e%Gk#$eMq-TJf@rZ?5Y9Kt z2O>&D>1i?ttLHu+Um0_-N37edEr^(RK-7E;D?^89K2?qxf?7?UbCkZCRmJl_C?7+P zf}mEDd(TVGBR)+o9OO&UjaYS7HALlDM#);kMdQjwgVhheGHsu;GH8GmtNb2Gp4)-I z*zFKj;WqhzSZ5AHm{rDS_Zff?p!z}ET}xJ(jJ;3CVf`A~W|SdDGiuWkB4Cv`5M7%e zMBA(dq5v3O%7hVqGX;)w=de&&?_zWK@f;zK_!^IcI1g^m$eElbNuJ zegt1atc6v-v_!J=DIW<@$$Erq>GO>YCJyh{IL=g`41Fg1vEjLEIY+We92H?Pc}a_| z^IbYtzSASx{YHfo z$FL@{auPA;C|YinqTn2sk0A&8CF0KVdGb7BRa!g>LXa;ZB37MMjxdhlTHAT9ab-IW zSp@|4i8iBLt08Kv$^g_HY@^-R?WR?I@|rJ>1yO~jRr->w(I?xRJm*-n#HUy}!tycX zK)*y>B31>#JiE2VF^tu~Dvw)=Zrl5)ui&s5Wj?)Rk`K4twX#*Ce2fr2=g0YQgli3> zyB0RsX}eXpVJ#_R*GAmUmm9*hf}`^sv3dz&WgHd-Ri9BloWr%qon};`bZ1T9wiX)3EFro}y6x61&+c6~$`9}w%zVF=d}x8I+UUcOsP z+g&RV@T21}KZN#`dU&U(#;Ui32>VX;D7rq+iMA-fb2-#v<^4*_(I$`f41K?jaG%t3 zTR*BF*4K8e=dR^rLEH@?0aodKR5oJt_NU z=OyRv`Aw)k+lZAo#<9v)MfDK})(@;WteoQWwW~w4-IC|rRvaQQcH6kxT$c=CYoa*% zT0(?t$tqt(8=~W&B{td(p;(PMXbBOW=ZIC#V8lush%REaX_dz@Xl ztzRPGc^9iqgvCl6<5)31#<3CIj)Rt1EiuHXme6+Bikx?zBUYy|qm09P62~|nn^rk@ zno*d8^4#a+Y0N=cHJ*c@wEE_I?tmXgRT{0Va{=~B8WCwZ;cq|oPLlGh_$eh4?~z$#%CD>LVy}w z+U{DB^KO0=j+jLuUxyiW-E>BA-Vq^=aV^P+nCIe{A*dDdoP(B}MDEZ9 zN34`JkK0MaN*v?rldX#CBMz(|SaDc6ZIsyh(IKz{uuBD~|ElEuSyn`fXNig_hn~ z66hw^H#$gvu?h(EoA~T41r4!&%I{saSaNX{@`Yq!C1@O>bunqt+Jped1#p}P+P+`g ztlA0=T0(?&J9ys>8kr*88mx#rxwfoVcSWa_?ReOk4 z&kO?-2!UIVM@y1UfGZU=yIMGl_jo%?})%b8tTTN6IW`5xxrE)cy{ zkq_p8h{dXw4?Xcs6)IdFCDBu#k8!_>TU5Ks(X7fXu?vgOd(X=o{M*hewCdjH z9qx?Uker0>~ln~k{E`6OXT3=N6hIT*MKDXxv6|>aDF~?bW-tEW=c(Y%7J`~nw zt0L|@==Ur#C~NJnUq6`V9U%JX((^H2hd?dK95LE=I;)~zj@O;d(Z1fSCAUFKQMmTl za^7T5_^#D>$NGBK*ndXivRP{d%l6Ih@_zFS$gto&)jd z_MSUJeR;n+h2o#jt()cetHch9{#p8}uVTPm1Ka%=-J z^FzPw6n<ljyREGg_kZz; z-}~;}`u^SWuItr(-}PI?^YeOZ_Uh~3@%|zo>TTo8=ep)3BD5|*>pW!LH5enl{LLr^PZ-5vbu``virA3WsVF1i;}e4-~=1%%%C zzQjFS6$o*hc+?dq-uT?dRzJ!c>Q^_tQubcdo9h?(g5D~>`t*Csx% zy!RuYQ90;g$QKe{APVxb(8^YYg>w$(;5;~VkIb#g9JGXpIueJm%82k>9OGCqqUZl! z(WNDaK-3vEw2J)_LC-aIBf94?UJnr~ag1Y?t%`hz10zwtg0YOmJkMh!b_k5!3z$*o zA7G>;thsPTh?>!MaLZMmk4^E z^Rb6{SAUmo**}P5oR4f(#7Z2PQJ91Kn1g$mgB=1jku#MDHCG~d#mwlpQHRj0C4UW!p#A*+*s=wQ~>^Q}N=pt6xs;F1u81Jd|Jj!>=``A;< zb0Dy%=02K;T1$pk69=i^*h|zI1qAo%p~b4*a|D9pihMmH`rU(7^_Mr79ZsE5L#xQa z+|2!8zvSzpi)$R+`S*O(Uvyor!erGrAIt#};`o`eXD`2ORrl@XSD9BId*}!1wL!=i z^y|>8hg_%6wOay0zj)ga)CyVq_P@LFu_xYNcCe}?QTr~Us$J0U@Gd=x1Bf*d)CyS~ z-~Va%Uh%qeEhUcfOT()l-8DZ#zMx+RUOn_q_hW{jR>n{~62*&2D-d%I=HNWg+F6b{XbBOrYV3JNgy-UzA*dDdoP(AeA|INAV~+Dl zD>ypOk&p8juZM`0IL5KcRz*I#ocHvfTU89DMT| zuUq}$eKwy%uIDF;rtZ&)1Bi8K)l*1KEAFrg<)c^=sML)(ux_S=#DExMno+U2N0+XtOf`3T7v3B+xLM`bjKX*mx#`D#42BNhUelK z$0}PD2ytNjz>1SSkM*NNU7ZMq#_M24#5@{$k;=4b&WIT*iTx)G50(pA`0Rd$BOY`Wtel&cGeYDhA{{G zC8F~j`Pjp}+eH+_F^*NXDqK z5Oa zkmr0t;98CSl27v-S9iD`+=W&3>}b)nGdc;8IO3X<2>CJQINLZBT}N96fdEJJON5OQ z#)@-o95;DRglnl^qC-~Bfk;+`)~(5>glIX}dAKoO$IbbLK!=IfJ9>BSg%oZOo|c!UaUDK0?GSB0{mkJa5&fN5niA z2N13L2tloo=Nz=;6wr#*m}5I>1xM#Os?RoJbqY}s$2eBmD#k6X=U8#F=dpgss_}}$ zb!od>qsHrCMsOUDcQVQcwL(@t#vHVSb49V5A);R*I?oZSoWY2dIL5KcRs~|t!Lf7_ z(bdV!F~_N-6&!QVGa{lOj&ZCQpOeTLF2 z>f;lTMB#1UP8PSs*m7 z#vJUIh|Y7wilgr=JQv3}R@tf?T|f1r=TQ-p?0KAekyVb!=azVyW(Vhs>S!OH{>%v9 zqug2F-#$L?lkfWkV$MNJ;wo&JA49A1{gU9I=Q&n6gAps`V;rk&RUqaZF)}pI9U(b5 zvQ=l3mLo3Zc}BSB#xc%EL{wUim~&*?xi761ZjcZ5t6Jh5W|c>mo~y;ju@LULy|tAIegikV7;#R`=HwIn0LCs_pq>Qx>kj+k@M62-?67ON45 z5Y!5J7AqlqT~fahE9GMptKOc<=OD+@Hs&A^c@A=>5}{a)s*j=@ zGnLnE;+P?#eh@L|pe5X2D^_C;_Dcjk&-E&2Fnkh+M>oeRTNQ{o2S>(9#7+D5F~_N- z6&!QVGa@1_j&ZCQpOdKV-AKgPJ%zD*5@S~!wm!eEe$zR*9a2mPEhg6T-j0E5W_B zcWk|A^(XJWx14U`m7ex+K-B9G)5_;}qbHpM@bA`2Qp;w)cG}c?Y6uAx@xIr;x1O^S z+GMlJd%85jwSpT~bsW~OI6VJCOP+CrB}BB}2CQeu3Kr3|Yc=oJV>RZW?e^`%xYA1; zYuV=>x+O$-PtvpRa!L^5@%KG)wfx56BAZW-zi+R6KFWDUn3nY<8PQ#f%{<(?(#I9i zrMY|#gaEM0EHNz`B_?-P0pTOD=L2G0`hZmyQL~DCKnTz{BD&)6d~990k->(DSriEI zCB&K>j&LoHZbHba>IZFC*4)C#;63HLwO@Vz7as|sJ6m7)o(Er{@7L;n`XzF&Lo>dzmy zTVy-q=N1OSJP$-zNQ5{(R=!(%)x)l@p6f2)Gv4!@;<=rUHrY-*i<=i#Su=Q#4(<=d6aNe&JcF$-sYX1p!B%S5z#LZ zbI90$`3(h?#xO2*O6h=_tXW(aD9Jm;V#b~euP zq4RKK4m-=~TEQ{*+|HX@KI{ag#Y!CG(Vne}e28N_qc}3`EU(SMOCe(35y8rkYYFGJ zoiMgqB93t_Vf`Rt&OuA;1f_8(R$~tKOT^ssoWY2KIL6Vu@uy5^nzwx;^h~Qp5v{$5xSpxtaUHe#yt^ zUcKbQbD&6nPN`--k0zH<-^5~8A5lwTq|U8Jo#bQpZMGVy;c37haua0UyNIRIHLTw zzC+03WA8$8t*~&;!5r8dRt&9O-lUx~kl7f75sG)>^_57aV;pAtJOm!t*#z9P2=^UwfmR`6oZf z5mwooB3vsz?-9Xa?|`rwWpAc1S*rm!U={r!pAh5d+8Z{^D&Bj&6e99L#5{xc)(GS1 z@4b$#V!uRmp4aD57885ph5HfF?GX`OJL%-;Kxoe}jxO^-J|V{QBVVh<{LnSd3_-1s z72Rc) zhp!)b#bF(^_ifpVLqy&Ia9tuou^O*~84=@395V#9LY{Nb5{^p6YRr-AM{v;d9IKqc zSZl@M(ao{SRs~|t!I5F_6S92hI%>>e?^|-M;Fx=!5#hNw#<5~V?cF<3cgG0Y&bp$? zFhhhTM9}k`4|}JR%{x0mX;BczI9A!Jh?O|TGb-Q9h#7S$1hqm|KE{>7-e6|6gg%L5 zhKPDa#GJ$46=ocEg3{wQ<6yr;%stQdWWw|LYLKl8#GHfodUonL5c6qgnn63u=~}@d ztH#mIh={Z}W(aD9Jm;Y8b~euPp_7?oj-7hu%C&-H?zx>8wL58cg3_WOj`3*ERzoeRTNQ{oM~o#utEhZP4vuV3ct2QWi;ztReM=D9e076}pDXAmpqqqiy$;uy~;JBO?}D74Qg$$==y z%i`Wr%v2&QR^!T$5#f_KW(aDzJm;V#ij^ZQA0rMSs1-6jSI*sYAwsqjl&V+8F^X<) zRgNyMSa4Nj-*)jUFCQg#-iL^|Dq=OrbAEPJ#N7+|G^55>clIqIvno#3SUzTmxaK56 z6>f~MZ@!2_5p}dhcZQ&r%Vw3ws{HpdkD~H1j+;DpgmUg$VkbIe%|Re=MIZSfpZNhq z%ehV!kNG+dSY>B9t>V~eLz8tr5gg5`><9UT7)4izuu9*S)%Tcmn(9&rYK1I6#`D9z zm0;D!PUhN-+P(xLW)TtM7|(OgR68%MJ&K|}M?^IsV$MNJ>_n?^C{|;u*e?-t&+T-y z#mdeLTdc$}j&8P!aT~9-$~irc^+Q&Tb^t<9D`drLybfkW%qVfp5Y!5J&an-vI9C*_ zF-M+7!9mYe85p0C?cB5NQN%HhRkkW(HRs^SuoKwEq4U&Z4q8IQ-1CeG&&4s06(f2Q z^>IED?XV^8n2<^k;(hB=$k&`JlZI z!k!Om{cwav$@nQE5n2cNoHL$`+8Zyt-}qb{M8wlqKIgPIY<#?DsrF6|(<0x@Dy?MB zr#bIdNuF6196~$7R_Bo)x!>S3gh%)3?fJRoz#{#Nj~1F1Zsz09AD6R6gmH|Y>gVXj zQ~jOd`3ym=kQLqW2?(Aqu(ur9c?NOJ5OHRLh&hM73(3wf*!ydYL*r`9!G4LDd(P2k zZ#i76oZaekNQZ+MqN9FE9mQuBQu zzfQ1yyCX6OEs3iz8;Op{9JGXpx#u~95e4OZ9NlbHAm$t~GBnQ}A$i7O?^{yVh{&Gj zSY?Dq*Eq(piug#&5pxb&qRQY1$>W@}-;9`fE`-loAtF}d80Dk4DiGorSD##WeMYIL zIf7a)Tdc;FA?9}WNgOjocpg!hbEsdpM6n9AVm0E(mJl)XTnJy6#6iAsta_^gG3VfF zX>V9jO|?c0de_B2+E4-s>y6 z@7YMSw+`9ZwRa)eJQv4!>~e$?AwR}5DkGvMierYLR>dMSJAQ`l1z z;b$N}a-!dP6QQxooqp6>d&8Tqal{dyi-QR6=tGNDqUQ(%`z49Eit$=VKDo*43)J$9`ubWFg9(i6fk?U9_&&Q<7u9 ze-W|}+lM>vhU zXkD%QFvoTmxZaalWFg8O;Uk>6Yb`{Sd%eeY?_G#;NBC$t38;I>t)<-4JuV}r-USX> z2#s6)BZ(~`*L%pv$5%h4phpOA5#spjouXBr0xa?vA+4)*Z#p5q_lJKybI7Q*w7kU; z%lCPY-}5bxDBmUrM?-jv5Fg(85&!1>@w=b!?VE_|xwkmN{SbPCqawUTi1&Qg9rb(d zA$L|)glU=QKezpkg0SeCJVJPj`u(YA|58JkJVJPj5U=~DUo8mzMzYHzglU;od-wi& zLzp~5c#Had_0#`zL0nTgOdcV;MTngrcwa-9EW|aBz4hqytzTMyRX4P*UOnl9FFbzP z&;C|Lge=6ZpK{{pFP{BHCzN!yJmUMGbNtOWexM>k7UDNPc-!4S{_XZFF>JAls<)8J z4^>ym=0_b;m4huIUxQz{?hxzvW$U^|E&ZOvFSK_E{N8p(*!nTH%70N_8FX1I@|AZC z{aCZ5Ag(km&03c`tI8aVmg0Ho+uqn3vJk)a{4)?0SNs-^CUpWFhcA8N3~)u2J=O^n}op2K}D+;zzuPWzCk5 zPvV^{;^5n1^rTY1N3OogoG-1C{i&sW9`jF9Xl)|w9U$T;%Z6s`TK^NmTO{*sBqjq< z0LI}hJ>tz*y=U=!;Siv5c#9C9bIq&Eiu2a$lVpn(5Y-QF=@E~=?*W^L%Hb_S^lzrv z;8+ml+lEVY^V=`&_%W4VsyY-zDhTyexTq9e(!k)UmJHrsXf>b3lt*db#hF7Wb zgV(jHmbSaMy6aaHs;(vr!K*vAglx4vu0Q-L^?`r&S&xpZJI&hqO}%=pX6uJv6*)pv z%Cvs5Jg<9eyOz~^IJ_r)o~>ewTcvO9g)9U;XNyN6zsp1jMmMzH+V0i~;ZZlMm_fF9 zHiZaT92_NV@ew0L$U<-=vc*TG5Frb}(ashh`9g#&1ZName0B*DvJjlLZ1EW^M94z0 zGO#7&i|ss%MHkiQonB?sLWEZ(L!j=~3a6^3meA5K3;LUzWEBu)Bu0zL_Ex5lJH%2& zrDYuU-XQx%l`8nyDsQoVZ3U3*Ysscn-XbloK9V;$svq7WgjP7c5h&!&kBTrY^TXbG zWeAf;2yaop_QouWuE|1R2T)_>ExsGjJP%oj(YxE^p>nRhh>t6ig}_dx?MsBvsMOxa z$F9jjV7JuXb0>sGzV=r_ge(MiWNgvw(jHETkgFeq_q~ckGgx~=Awm`cJInTK1wyDw zZ2s=A5ZJx8cajU?dt7mZEChDQx+k;z;_X}8K3WLhQ>&-(``gu`ifX^sYjxLTA-K~I zt&H$%1LMHe#5>s%=!zhIMEVBHt zzq-3DVziWg?=eK>SmYiNT5oOFfQoLpGkNUR8iQ9Lw)oYg5Fz&*Y$={wzvtefSb+mq z!irUE@vGuH3!=$2=e*ixi(h#Q(d3HwKRzhn^iuT*_X zi&g4U4eGtDr7|qCJm)>K(5jW8-Y-+EN|jh-A$T8-Eu}KldvZdAEClcMv8BxUdPh)* zkcGhgL|u6;T5oN4AcZKEq27(Ok;r?NY$?^C-oF$gWO4AmC|gQpsCQ3=2w4c+d(~Cy zqE#zHy$>ryng5F{1n%$ZO1QO@YEbV83lXvqxQDE(?M183^Ln3Jh%$p0SqR>zW=qHy zwd}W-G6#=ttB7d%$vgh_ zWBeT;>sP<}F^Qu-HxLI~RB^yjo;r-J((?#w(Q^t%NcPXOA8aXpG=yX#>iu0owbmZ{ zT$8MOZ<@7|b$`xlVnft9=q*iaLFgXf2BLC!ix9fEsGNtaoGY^WSAT2?*$}#yIp**d zA#{&al_BI2hiTQFOhV|M?3lw_)UVw`u6v(F9&wnKaS)+<%Nrckb8iWb`Yr5wXL|!t zqpLgHY7s*B+x=d+?valX-VzA&!_b`{mBU*M@s!f9BP5Rz)*?hnYSFTMm~05$kBMh@ z{+!Fku|2!f*e!@HyRP-?L4Ws-&k5}Ybe(A&-Dv+rpS7H+T6cX;NcI^luC0pLUFNyB z<)5|Jk~Z%+A0@lB8Nn7+23XaqL?9NcT1)5Cm77-S$>{Ii@V%-_^=zea zcyudY{X97AS!z5Dm4#|m4$LP*S46FF%hOj?(S?IgEo-EMV;wn13!b0S+Pt2}>RjIe z(bn@==k;a^>>1iKuYUA#RLYNBeaZ)Iyy|I|k9PZ9J3#ILVm;6MgxDD@@7~#X+NU}g zKIJ{i_^G83+zo^*4(u}8Q%fPj!g}@6_9$rw(4M{u!QDW};@~cWE!=U0EChA{?J2T2 zxElyri17}f-s@S`_WJ(Jwtqhp7-o!m3TUP9w)WYu!&p<1GQ z;f~PfiKFdHdW7nVSH9#&+h3_)kB{bH$jgZoe@5T-S3HiZaT zh|xY#2#=@`Aq#<#*!H_Z_;?i}WFbcTT_M84{DgnJZx_Pnoj5`k2d@o$-YFkmKP1QJ zLU5k5FP~B32w4bJpSqr_W@L`56JKe!>a&*Qb;+MK+p}~%iL+HyJxQGcR}5qfhsp!3wIiERgvt*XykDz`pQh{Y;#*zTo&UT+9qLGl`qSCdUHyUg+P zTHCQ+d+gWCno(7*2su*zuRi@@OI#J#y9Ntdm7({%?svOgvEt^t<%TFcwx_lovh7%H z?`yL6w6*oZr+xR)8@}XmSN!yMee|8|OS13C8Ii^zp+=YcXzs6_uOZe&su?td?ZRxg zY_j*%5E3c}_tD&6JGvp(MXDTzu)U$}mQD7a8bU(l;I5eaYezT4x=5A75H_whcgtFx zi(ia0}BsFIL%n7Kc{@MK@&Q*qrC`(C4{DA$lt72TqHyukb0KHBqee=TDO3j-d9` zQGHytkr;^3(wy+Sk(z@p_XxLLJDIZcE|tOVUxsY;Dm-UP;k(BW7l77Iru?nl4{DYD zN4v`zpLbRj@E0xTNa_iZd&FVm*w32SXfKKut1a(KT5h585wfjnfru7n@amLJY3r}m z_Trf=kyRGa#i}d)^Q!I$S%ns!jS2tKlLkCDuy@e;lZLW?sHYZmm64ui)Mwi|&#+v7 zlvca5Sw{XMTR!~$ajkHzMOu8uVrb<9&nDVQ4vmtsM_Ha`5HuCe2(8^Cq%5JGWJxR|dwBKExG}zNndzz7-Y^3KO z?PQJo2n+Mmll*L=?1bC%h_a8aCxmqWB4o{|@v{kg)~vHi$|id%E7{ilPMmny_1a~$ zGexp0e9F&T#%H7Yesy2N`Nmdhgu5l0QI62(iK9I+=@FbO$q!u*w)0RPAJyHEwSMsY z6#LWG6+^j02;KH`M%Q7Jz{76;E?vBk%g5FraO zdZH)}pMye#Tsh)wRDElNotok=S=l$T?Q`(+@_RGmVSma2r#7kS+^S#_6ZaY8Gf*il_^zI;wbvs0(3#G(43(^TRJ zSsXlz!ZYx6l7t;jm}CJxmPoo*9H z$l@5Eld*FW_I@9}Cszob-eF(ilbvmF|HkL~lyh3BTH<_TtF+=cLbb~gwnmLk@AL?b zN+0>z54YXxuAKz5y6dL`b9CKvA;PMB@-S!6vnGUR)7K9_6_`g!Xyp@zv^I}KAARER zQ7Mj)wHl00g$WTB=97ncM)}MU!e^H_LKeqpo+}?dw|8o#`o1!hqV9j z`=7yab>frW)+@@YvwY7ho=v1@1$c(AfzZ>Q;j;;8DhgX$cYW~0-Oql>_Z#6qD8wRUIX&lP}Y?HTdayJNR4A$314ZlIR4)c zow(xKmwb==(X=#+{96!#7J{eSRHJ-9$bDPL=11O__+G6htMG} zPpXxR`WG#x`m!@8ed)KeDE};?TQWId*4k2_tbXXZx-6;vWla` zM}x1So2O#1mbfcSgE}_FR>atMHa$WgX6Lq_zK`0{;W_{$)DG6ZN2Bs z552v3zMK%s=ZO5dy!=au&vr!rB;PrBa;WCwNdJ~UjYK=8vpkzn-#ceV;)@~J_N0ra~8fSSO0?d!|KWZ z_170a98v!Jd7*VNX$3+YkNmP*j^6dP&#k8>>0!thR?(CEm?5YYGX1#X`v3X4(L&n~ zlZ7*m!(<69+}irTKk3Csca`7Cz2zHU{KW8ZhR~I8t3f zzqR!Pa+TsySg<>&j)>tD!&WSD%_-UO0R^{D&Emq3MIJ()YK#1d0%CF;nclnh(&5x&l=`&Wp z@HIbBYhuV3R_}Vpb*s00Y-g#7j`;5T{n6)z*2Sb12-U00w(fWI&mLyaif(+}Ggn{# zq1RT9kT0yFC(Uz5{IiFB=<`DBV$uqPIKrwMVHIsZOcs*k`X3LD!^9Dv%c>uF#YgV` zlBb5J?K&YYRTXXL9LJ#-B0?RH{AXB>(5k<@I2?7d~*b~LKepd zzU=Yu{JD3&ymCC`s;^(|zG7Yd2w7KQx+2r(@_dG%R>^SoXQWahN#bb9w#?<+tu$RetmCA^-dtPYe%d2#u?8 z&N(s;yHPUE`Qa+E#@QvSo>AVn^uAAe@rgfr=8K;g_RbKp>YyN=TAmTA`oy^6Ox=f7 zs#h~a@DU-7zbUc$gAyxogciM3MfGtd4o4Iea?Y#~G3THqy8GcAs?=i+_DjUv^L@A|m1#*Q>lQiRyDH1hqm|tUmLVAG!ODrHU#aYzdh@iDQO{5kthBV}BJK zyD4rn4)#mL-1EG@BHt{!*{VRyIk;~-3!lzTGq{_yf%K96ygWi|4h>p*Nz^Zmv^fg21I6^BU!VhtT=W$(|Z9mz0KEB#k z-926U)4lidF86kQu1Y;aP%C6rYTTK?eFk3lpT&I!aR7n)47|5M#GE5+*QoTnAChMr z(Jv8JsmGpc{jgXG;hr1E3_&fIjbnT_DtjJxqZF$df?6RfR=BISW=qJi<1nj$z`ee_ zhx0ja-?RV%9B13TH^s*h7AqjY5ta~fsaWLh=_;-i1utk2x^5a4n7(6XK6yPUWHseU!L%myEq44mo#>Xj?aa_ zleoL0uNgw4gwHwssimxnepyAu5l>(L=RxG)OnYisMah)pcl{O8tga;t0>>FL&z4Bb5gS$^ zy0(W?6dX}ZsIqKnCo>nTLW}v3JhLjiRlnL<$SRY&SPiTSv|HG$T1#>d-FCCY=DZ;= zqbhV0A)km)rQXarJr6`ttmuZQf^h`GwcK-y)%qdty8Dkl{2g_!f7ScHarN_mW^eTi z`NHbQfBPA$FStveYeqSupe_roi%BaGdYbXOUwps2pZ}LHtsHh8Ztv&|`NArC5(f|^ zy1Gwg2x^5aj>oi4&9SpDPs?0bcQc--6n(`BJ` zF=+)t9Jl<#%Z~o;hNo5zdKmJBRrDl3fY=JHi%BaGa}MUC<(-zgO(hoxXn0nbc3Vw9I-lIYOT-UL&Qq? z7{@AG6%i4~JHGtoM?ZhVPrg&JdfY9iSO4ofG@mc7Lbm3HlQjqTc3*h(XaDGD?-obQgIpP+Cq>s0<-g~MpjOD@C|%b&A|contJACdy+v=4 z>-|^|f|i=-TDFrh+YN2`2%p?o+Zdwv1=I1gE|@_dLR`pO7K zBoH}+j1N7ZbI=mTO`f||nS=cjLCpI4kfC?Af<9JGXUUa@jS=E#*gI6BV}tDM2`PaKFY zVwJ55#GHd8V-L~Qj2d(7C#~S1=Q&mx5uS@<94khYRbtLT+jmo4nQ^dRB0A5Jk3G!0 zT|`0kY8US&jFXlX;kJT<>rF@L*RkkYXl{kuBx?<5^;W)i|*SGmEU$|_m+S$+fwQ}_$ zj!Pk2OFfy4-O}1QxXU1)eGWt=3#-f$qD}6sDx<`0xBV3n#s@@amEA*hE%kJ14!=8S zT85UqanBM~(U0KUKp-E6kX6p7=ze^JYehb~QBpW!EQP#-akVoYR~&srh{I=;avmct zBVx3R!x4E7au)4OW>n^&C1-)qQ~faq`z50D9I@KL96XCyiDNtmvsDohaiEH#?q<)U zigpOBgRIUwU8VLFN3n{&G9uO}aX2Ec=Ug*(CM!>yg<+rxzN}h3?OsY;igJBn}|9TuXh0=MjZDN4EV8&}YEGnwTviqVv4PN(hgFa^TilJ`mj&tKOVM82-&)$dMsCG1z*%188-5n9#kUWPavk+08f<#eq;XpM42=Ab3E zIvZNE))ARQtASfW1U(mr&zw6i%M~vC6UR7K*{VQ@qjWvE>ugr}?jXtZK`LMA&wkrH^MC`~sx-u{F5vz<49$m?i z4|zlcwOqD&?xRE;Y;oDGGC#xt#FlHRuaW0-j%+*Qrdr}09J|>PB0A4otc36=C z<-?=PdEQ$Uh&cyWnQd@vBOjTAmJmVDnU8GyHX<#KajY00BIX>l#LfX&&UJEN%)x$% zpy%=;i+P7o(nmv!bsH__AUb)BJ?)JOBr`EWNzA_@lv^X4*cj37v215C8 zMCPC+oGXfzBQi&>CBe~oj#%XkhJWH1$0}PDh&cyG#z{n1b8yUYDrp4=Js&^ewWp8k8{X=BycW4|w4RDQM^LNDmE+p~=O>@^tiO19_2Z9U^$o}W?xV%t z($eJ8?>!&9x^UZxw5=^5)=jG*sMX}k@q$l%_Z3Iae_rLFhfOXVt*7b-5bLJZS=A78 zj?!14-xM6@-c({Wv^9c2Q4XD zjiY>?Jl|q`np_agr^+#mRcBR0RF2`;Egr@=ep8IyOCn;t0#Rc%oP(u>h~`t}03zmK zK~Ss7bB@wi<0$b7gwEm&ISPVWO`dyRT3W0M2l;06JX_Tel|wb8)VVqbf8z2lKKA(> z@`csQ&OLbfTz=S}U8#oF#iSJoJL4scAvofQZlBlaf@3SR@^}rzV%2)&N7E|avL|EM zwCawe)zEdckF7e7S#(FpgMe*G0!GXAWtegW@9Y#b8y7jcY>%P8Cw;Q|YH}T1jarLPu=*kG! zN_|Jns3Ol1F^hnxqXhGOt7&njmVRTNivtK$AJh*b<{Y%WM6_|#=ngqjzd)4FC!Uv< zs6OW-R+VEI-Oj2Ok;;MfV=L^Wr1FSklH-wF(HV&Uw~0 z#GIq_6_#LB)>sWWXi3p(9Mvj#9!9Qi5RvnOXqFVMCYR4sbditON305>#j0{3gE4kH zs~Vzm3};mFyv@O)6*Ed!%@EXTa?J-S1L_s#cHv-sW7{pAiy3w9+$9h(i-4%}1M?i!2Q#(w+bTol03s?w zss=#JIZ9v6s>=?7qsX)B!+wF7dtO?i`Wz&_Npw4_nuV1E>qo3Oo#(NBC?7z?ic=8O zYI2Pg*1=dgJ4CF5;s7F6&Vry;ljj`8!?5Ha&@~@Jj)I7Oftbgtw6w8Q`X%2aR-IK1 zG3Ve|I(K_;6nVlyONi(_M?PSCL9{4Tj$y1yU({;yoFiGXALz?eeTE#gq-ZscY86Ie zjNQ@_`Ph$GRSqCx>~>Z~J`~+?y{g}pIktLrd(6RV)eI5y4u~2nR3FqU%x(HqIevyY(Bjz5bKVGi2M`GKTV`r}uIP?A4wF`_!5v~9edT>gAo@K+AP&I6b+=p3!I5`J z!O>e4(Y+lUh+7@IW6$$UZ9UaFSP<*Y=%U|}=kTxhqxE&}wMnae?i`}&?&9pBe!Mp1 z%l0gT1FPr<`4+^0V;@#=x6~n!4`z*s&U1|2J#cV$*6$M|itLw&-l`VGbFTph;^wg$ zc)lAEE$G(Ma$0?qbM%||=KI9@U9zR_zBXz}84HtIQbt464h50Ro5ZTKs##b$uySrS_Tpiai&m_h z$_EhZrd1HsYI2Pgb^zFyWJDWR)hZycPt3EnA?6&kz2qYh%EyqSAgI;kY85<>Se2HD z!d^t7&L|)vR-IKXR&x%Hr81)e@tSEqUyEJ0nV zwPeVV`URqVo<<__@fze~H)2&e#`!=*i&l>Ac-OZVbFf$vGfGy?5Y%dN%?Bz2>J{d8 z;b>#5dJY8Y6)Fx9a}L^GJZ~H|Rzr@|FA&wLq35L~>eX(kIiX zS-1d}dt{+?A!+@6I1X2V-UqtdWvoMsmJqSTYP}iVgVb+Cq2~yD87qDRc%Bb_N0EGU ztM*`(PD*=j`rT4kMGnniN6h_TzvSx>TM^xT%5kY^g~0R}q+l%rg`YV|NFmy^n4nbRyp81o>uG>Fl|q z6(2`$#0ph3IP7%1^UeIo{RW?%(?@hM2V*P=O$%rFh#U|x=a81?TxXAiL+AQnRm(a1 z&4@FGSo^q&C~l{Ia*Y*s;jwS;5OHlF4j^!Cz`goyxTaDq0U|hx zhhfPM5Q-HL!BG&+k`mD-&tp|uVr1+jzDcY)tD1##j$%pUIQPonDDs4(AfjI&>L`Kd z5vvXno{IyBh*d#QtI2Z?+FrgZ6$n-8AxA+_tI56RF?LH!i&f!hQ7G~xR-IK1Q8|Wl zuz1+!V9|;hrC7}n)M|2#6)FSj73Ma5s#XDkYqdN|A_`sg2@cv`;u8qPYRExLh^ST# zJufXSRs|8Bi(`hMR+B3S*TEPKx2@v-C8|WNK0s`R7RPR$^HqQCD`z0kZ<(p_xuR=- zwug(B-J}(F&pX7L2x^7g?XQv_fj)~T?uss~0>@6$3Xa~Yi0&(sAMNuxcEJIwFtsBlpeJ4CCAl>-RWT~yAZ)ev(ISfYqJ!lFCm zK)*!XS*;pZ(RHi4Lb&I~F+)(xW#hoEZ_Dk~7;SQ~Bvwx41Bi9gDhO&dxyA}R0PIUL z!bgl*1qAjbdDb?>oCCHiK8~=d1hx!VRmw@9X zlYC@Lh)`vK=Pe&S!aY~TNQjmXA*dDdoP(CIuBbA=DsbeA6C9oAZS2b4h}9XyN*tqn z2;n(UwF_AsqZuX7eeWZ*&nS!43_-1s6)RMRR|6f$GC*aMQe&fPql(yz@!Al`x-VvdEp!%SeaBkBlaR9N7e)A}a3ODDVC8tu{{(r{a1l+cwI2+zLBdA|c zF%Dc5iK5~VCp2>JIm?0J{?1||4k!{0&N8UMs4PJf@+lf|R=^O^#Gr_nZNLlnoQ?Bm zG$zgiMigf>qG*hX`qx|4RrPkSUL^Z@xYV<%-hQj9=kB%lnd4wj7%?CDQIxAAC|9VD zes*iGGCpwdjFWBjSp)CM^EpNaLM+mX+iua#R&ZX1765cI%#+h~m{a%`Vpm^R;ngS%;HX z%-0~utHWr-Ihd15cfLHw)hv%ikn>mW+L7F*h1owiunX_)Yi9mhyIoK2K zE65cgXhl}{qU2~Ir(D%Fn7IN+KUcL^iJ0f$mhmvk?!#s|4y&w^qlujAqef)p;OOUy zGy1S*^y#-m{e`!c_49{O+XcrQBHJq?5C`=r>gU`i9!7l-9E6~LUS~IZ0XSqlT*JTe zk>95B-&=Z*_Q5~9{ImWys#ba~uD=IB2>pd7v#NjPCQ2&5c%mF5NT8XNTYmS&OM+b> z)T>{7{GY`W<1pEN*TPE*1O(+^gj*$d`RiPWe8hjyaJeSichL=PzxxrnA`bS15%y+g zAe6&y7ygd2OW$|bZuwO7+xV+47nWbld+SG?w9`n~pi-s3PU zs}Dw-OxYblg0iONT1;M&I#cyQE6cvyXIA!o6MO!~y4TKd7}^jNN8=Tj%X|%DgPoLISru+hg5&ZmYxUMa_PjA9Qd zyCbmRn3l_Ygix|XSiAb-ZU0e5YV*oVQp3tCv$7e0Jv6yDGEB>5K0-8J*_#7E;{?II zg*@jK`)=q-93!wOt1TCI9{xQ329HNRLSr>$?~z%#hOp-+cf4};7Cou+@M>Bv^PQR; zK#*75mJDHS_mo5kfZMJi+zK9cTf1`DXkc%#GQviN9*38Oav5!iCJwESNxAaI*8j#U zdsofSRv*UEtB)xMzv)JCjGn7Wx#itBF9~+NvBc`YTSmsw^NQOQ^Zid8+4^v=<{Xg2 zD+rq1))PkfZC{MLROj|a3OsQHvfJli->uH`eU^%2bg$ZS@t%aoQ6T^buW*a(Rz5PA zSG|#;<#6;Qj>an+ameb$>++lAtKDw=vNfFI zq^y6vW)-ysjHlyQo4z+HFQ_QzMfSUKbyN7DL6?4>;;j z<=_ZYJ_o;IU$~L0IRsm!JkP;(@J`~uc}bsxJz)gA>PKE9GIDUtA=oPAc@FkO|CVjZ zG}i5X4*fgsVU-;7k-rmv$D*`E{R_LLKETn>Rqa*Q2RQm|7iUY}D&I+Mw?R#dkSsBeF51w-BbJzB} z!+W=ZBU{{g_=^!SGGs}}E+O#OZi>};_zO3M?;MiBQRdnaQnK5rs0M39M&8sp)gae1M?TNN zo^aj}IeA4KTrMM;$SGI#c$M|vWS4SPdzFZJ4jwsAr~1I@V81@js;rWuiJa=AMr3_} zqn|6zkDYjCOC$twuQbF1+d^rr9+S*Pi`-L3LDApnqZ_o$Uw*(r|IfuT*N6P5$om|1Mr*J7 zxjKzz9Q`|*WiDy5OS!7O%C?KhX|9!4@~9Qs8Ga)=<I@unh+J7PVxEIN(Z2#;Rx)TMeGV>{5l!TjEA(^Eg8ps#vXTKuKUcL^oVU5P zD6hg!raSjTjmrq+s=ubL5xHIg#~gyKQl95vPq@z`SAC9pq)v|c$m<%+bvrov zxvITN#5@PLjMJz-(4+bsZ>+46V?Od4k&%O=pDWHNj}r47?7RNm-!cYcEa`J_xr~^P z{50y@`gh99&I=suI9%pjMR@>+1Pa&jaLnV#w+frj6kmXBSVeIkq8`f2)0Uj zo`XHnzZ+l1E99!rQD-+fn#gIq!i?j&I+bz-j{bO6dzIrAIA~oW97nCb`r3ENF2&X* zCfhvtiGzPE&%tqZ2)9B>CSxoqh!GMryn10idrk-dq|V(d^Muj9!cjv#!Ko1z2O~VD zK#Y*mE4wjqt9;%>9$xtwyKxvA^5hOO5PpBk2=Gl1>J@w9R`3eh{htwT8*NANG;OO@c?nS3mBheg!J<-1cU-}^K)%qMfiS+9LQClgUe;aeB^ZvX5`@LXSen$5%V0`GH^@g2)pO(bDUgRIl}JM`jOWN z&$MyOA=t|0d5+q5{adzLA2ycsIDqhSVU_ZWX0i)}_iZ3Na^vXbs`V-n;GiBweGp@< z^)8^jM?tO-)CaStGQx7z9~o*y#sm&W$UV!M&W^I!%H??u_5}HHgyqUPFh@BD5Nwrl z6M5tch|JZol&fQBa@Bgp+;e9DyqY|P&H&J(XeUhjTHgIK0%Hm7wrPJ}BQUGkjvgF@ zpfdp8#beZV#5@OkV)MCiU@Yl#aJh_VBB%3`dW6dzJvjQgs=Z1CINJ4<=LFH(Duc6t z$Y~8H{ll$l-!oV6s*m7uEepP?3B(A=%d(c({5l!TjtD`AbM^LW7(XWr%tE>-j^v057wwhPIugP2?@?Iarcl*++j%f}t z&93n^aZu#?m*30k%6y;u@TN!GDp+w zjQSu%tYm=58JQ8NkN%pWM&z0S9CHY^N_n1xJ<-2ruRAaM^@~2o(X^6bL=!o!WYCs8 zS4U75P=ozk)n0Ml`g;RpH={k8R?6Rd5y@(!O_nZXY{aY46a%t zwOx!1-gXb8whNAa+vOI{2*lCvQ8gmlF*xQBY?U%N>|<{)-{JB1l_&O&SIXxMhg`O$ zJh%55a(qv#^D3)E*gF$}zz7!{DW5ZBNi9cOomW{UqUA_-_8ljMpIx{3>;y8rS}=mG zQf|FU_L_rBLizaE+nE{1SydeQyx|zLtT{v*NBaB5;Tuo?_#HgjeBL0&pB(d%Vuh8y z=Le_tF57M*jP-_L=4?v%rWpjDNRZq4mjS|T`B)-v9Sa*M2W6LP7J z(st9TeuFMcYT7P(RFsug%-0~qtIuwlSKx42Ycoo!y-F+XgJG52^Bg)F6h6&cK{xfW zNDlUd5v7%k)9jv3+2#AMmLvV;I^bLDrX^B#xm@O(_v$qA3T@ZhLffv=E9N+j5c6?x zxy;ufsLsLRb*`W403a z>g3^<7p!y)wta#WmUI~Y{xKpZf^Lfj`Wu?_A)DqhoOa$`NpOxtnswsBTO5~*J>bNvv3M1A zj&p{z;?;7?kybc0@H*hVVcS0v!R0bvgMe4k$I!xcyehKhE#x-4i4eZ9O1Wu?w1(q3 zTx)aPxI3+#yz*5TBj!2M_fnh60lAJN{mpV2(Q73hIS?k7`d4qK9BzfOoR1L`4z#Pt z36D|vyp6mW;R5Z5iC67N9SAO|%GKyAeLL~W$UQzg{SeIPt(~J~bUrVw-4PObmfJ@( zH5l!RGin}M4#O)rrt?R#qerDx$}LBFr9G zA@9ESfvkD>-5xi5;K8p_#M9pN_~Fr)zOEp)J?%Cd=fD3Ttq;~5e)}g5fBxckC?aKe zwR+z{8(;sE+pHb?oZSv&&41tjNy8sM^1X_9(*2GcuJ`i`3&+1c_^6E!obGE%1|WkSIZIv=mUlfF%Y!?}b58nI4jemIZUtcW$-z%-Q<5Yh5)id#Za6NA?G7zVo`rM6w z-|xLU<^N}<)pneu4g3Gt5Gez3*9#xEas1nEx^dSF|9J~*<&Xd2a94P~F!tPr( ze)Hr*wQaFRPPvBL?Jz{jK#VuNWasxUf98h#w}mxwZan)$#A#0YSf|N55LPz50c> z{OvX%=-1xp_xiS1zdM(|E(Zkv1|4gpudM7lybnVUE;10(7Ih|o#F~^1Vc+^~5F@Ny z1KGaGZ1+(nHwfi$O^dMa?e`F_0fN8XZ@-<=L%0SA{)Lru4}L@Rk2-SKIKtncJnP|i znj$oE*8suqq`vj$pUBz3v#SW#IHHWA@EmsdC?fVB(4-Z9Mbh_hErK;EpCh^YWVwN85DV4_ zViVl>Zg9#if;Hlm)+P`sw+Plq777A!xC{ifMCs?L@%CE(@&XXt+S6(oeF6yY1(sdz zQLORa1w_i=;9kob@4-N%3!FkH9(kb-x;bn# zFc12yhS{!kJNGWdaehBGBHY{bFwrYta_rt6Hz~K#Z*M)iSc1vSl|A3)ZB3UaZ@v9KLRc##jAl zB`G%?^w;H=vHt+VcNtR-*7)uPh?H9n*4XUxmC~+khh!YI^ODw{8sCK>S1E&ocXzDu zogNS=13^2;1#4tP)jcN=DFeZ~RMyB?tNU6YQU-!|!mROKF%T&O!MknNNMF%CIS?rW z;jIu7Yf?4@cKTj}aV9gu$~7tLxI5r9p+YDbtXu=xPCs`de!^-TbXvQEHGWzPgrDLXf=+~Yu*Oe> zfv_uyq^1C=X2V!Vo4P>0} zdjGICjrTIPJ>l4mZ+-o2^(tFp-CnsJFBbdU>x7L<9`STVuqI<#QvZNghwlA^jsN`Z zLTfPFZr#GU zy`QjlkG(J5i#6OIQw9ge!J2+dsPk(+{OLOnyw?fpRrbNUr*aQoEUx=+XYahv6OPr$ zS(7m>X=H#`cY5S*JEg_1z3I$fpYHt*HJE%$k{N-v>sIKgDcAQ#wO8&55GijT+*>@a zB44nEIZ_6Kv+EhfIlgBa<)(}~FRwwwks7wzK6uTVSKdlqxXbsW&f7RLCV0gy(OVx7 zDQ_RVg&Idc4)*G>m_O{+l6w@Fm08$M2zW)kcJ!VK_LR2|-p|b|9vN7}aik0m9({bo zL0KtpAAD3Qk(UupM!LONQ+X9Pap2%_*GEy5mGbt%$7ADYSAA0TbeER*YW7@nRb~U} zAGhMNIF6KoXgPR1_w|mA^R^D^A$Wy^6`8NE@Z8>}vON^ARu)^?x-FmEdjNrm6`9|R z*)5{q58_7A?zRI#9Jw~cjO-k92$aR;I>It7nd;mwVf5j>NXi&}Xpb|phW9%u10kQ$ z>x4DAr@~s)cS{&|dB>9bk9uE|I~j1$u4rTp?~qakf_E&)B5n~8IqzOlwm9njhaqeo zZF>=uy`*{{#bsqoOWJw$IILW2eYSfs+4(fN87FXK#7h zRuE%}W5Jp}AHBJ(qnuk|EO9j2Zp!plm?Bcct$lmd^5H!`Hs5-7QEtkIMXvDN?7cqH zEB2)Q>)D2}8uU|6l$Gf1BsUzbD`PcMamy8RdGP zKtE4;{x9V5U&Y&Ad06*z@6X`y(EuDNgF`Yq>F0<8X!LWJ(a%v*HTuMPJ2c+!z>#u~ zgU1iPL-1RNsaLLnSA3gc&#krBaj=!$h3I@<&}FWzB4?}VeM^}+9f5UX^$r90(8k=u zn4KMg*?Dr?gIxLZ2|_uzTtw^jVY0Q|h+GkDWi@CVUYqqDq|7WU`z?6>jrb*IwfOD$ z>Yg)h+%ZzioVY>@!ns(=WlS7P+mguLN^gz}Lf4`p*SD53BbVO_s_!;s){b9-@4ssR zuQI0kUbVWl)Lh}6iLw?gzr|VKc}7c=Saj7_{lYZgL3&BmU242#0gjAG*P;>Ml*7uk z_G&knCOcn+knGlXn|$Z#=nA2cx9`SS4Q5G!PyrlZFDuLH9Tsr(+b%d9(Y|F9YfXnz}F?s*+lBQnSTQAn{Ot!JhyhZ=$-EE^6$tpA6jY%0}d+%=B`<-!Ek8-}cC3@=v z!rLq2NEsZxJ9;3zl>m`45WRN|fbgCQM9O838rwdIG0NX6 zec)pwkd!NBU^J-T5aAPOv!5a`8u%L`{LNWfUujE8tFval$x5pwAmZ&EJ8AZ}MKE5u zOsgeDu!g^>mCtFlq+ap21l-E9>+b>4YRTi+L>B7$&^LKj{=CYS^mBhVA8+}(d_?sv zu^Qp^Q8=`2P|u965DTvXmE2#|YoIR|xfr_s+ii1=^nX zykaZg%K~A~>E>qxY`o{>9c0P{F?zmu6`t!|UM;r>ULoh|l~>^{g4etK6|x~>U4rbc zd<6;F*CHwR5WJG%b&$zD1Y2P}=d+K=J%p|L^h_q+*nwC69;w#3_E@Wr)VNhWb2jTl zjhtsSpO=8P=RL33%4ZoM?71PrGvUZFoX7T*3j(cVGWzh?#cv^^e0&s9y`RX4$yhQv zf;Bmo@aWUTv2ZKQAC4}g_Bu+n+gJG1a=?m5YJNk|%nPD=caRanw`m;B`~k0|?Sh?G zth|yf?*Vu#(K<)1SseAdYN$bvqwXK3(UZ;2Z}Aexh=|Y{c*la4Zyx&d9)hjVyWB&2 z-b3(SP0xDdR0Z7j+z{}`cH2H0;7rCx32>y`B7DSwm5)S-Bjpz1qZ+Jyw1b?_TZE66 zmLEU=J}*utqCRxYE!mB8YKgYI0i$&jZ^J~?5KteL6=ndx%`n-#vOEa@t)#q#VkgaZ zV`3cs770pj5$&D1y}cubrCs&z)excIk|EPRYeNQyf5x>>{nLJ{)6V#z_`Vt-f8vHe zQu&HUJTzptwr@5vf~_EXNmIlxF8@K4``Gkb1=&j-JFJ<>O-rFAG+VfLC6U*}~ktI^`PX39PO- z^t<7e%Ygt$y9R*ELb^$vrvjRptjwY{K@4LPk``}0x^0Vj$kXu{=7zPz5brjs^OLQ56J!2 ze(u573@b+C`2-LFN9IPA-*`KSil#fq6QZoX46~X|e&OJiZ2XnYwj7uDCt+~~F99%AB_hb@> z27x#j!B!kocqM`%e6$4m58i3B0T3<+Vr&s?1=&jqL~wXn;PBZ12$us99FAZs=Bp8` zL9MwbcLTD97a*R;{M@iApE%+ zOZoUr<8TDLst^Vc1lIv%M}WiSVqD^21Y6C=!R11BPbP6_5Qu{jY{h)xl?aCLIUJ+* zHScBX2gv?B5F-$5g>rok$8(nzA=da<4Y~#%dbvQmY_>3Oy=pn!!$1I}GpBQKxv0TD z2barMkiDefP_KYE^GB8+MlfF>)GJtVYj-pd{#+4KK0ekG-QSk4LKr|0oKeWk;c_va z$*x6%^vQY}40Nu=2GbWPe^G_I~+}O}An+o=*^<(LOkb@aHwh zr~c_@o4qw0yz=KYf<0k0o=*_rmHXQw{CRLF0ug#y94&JPVnpPOV5@nrfbfwMvajdP zJ^0fhPdOaHR*?O9AVe^)yj*bjss;#`12MJ;wqm|O1c#Re4qy8K;c_5?!x3!7e1QlK zFAE&LS^~o5Km>;)*oyfA5ga}mfWy})K)4);;BW+6LH6f?2o5g`9KL1%!sS2&ha=dE z`2rCfUKTif)(67nKm>;)*oyfA5gc9?IK1@%;c_5?!x3!7e2Nfjd~Ce(ITcnp`&<^X z+1kGtebNeE`6vq6(SaDfwYwF1s`Eki=YbHR_KG=}dy4R~m;)n`^95pb4o9#RWPctA z5imQah7lM=`y7m5E69Bg&LU)=EfKlP;g!b02)3Hf6_*Rydl3*WPdS{Ot(Y$mBG{Pd zvn4ouK1bcS9Eh<+uoYx4DGbZ1?mK%}jP-w(D<6?juFtzDDP^h>hdP6<7kA||yeU-roc-7~Cm2<$#(UARl@kv~QS8chD;F1&}*7%rLz5;-iXA~SR zn=QYyz zvBt-;>+2FmAPapCSUCr*91Yo@Tj?MGM_aBVxFki0H9qE*uQFieZ3!GMn=QMR7N)Sz=9yN+fL z!(P2=>wpnnk|M+!AB#NayUa8^ta4=lL2!M5&({f%Cx{UoY=v^253-|6@%q2oD@HSS zjd=AXuix-_39`?~K)W1>5neHZtsr|zfe^tEKJK>Y2_iTg!R12s=gJ}0_|zjcINWN2 zP;>Xn`!=k2ocHHic!l6{9Ra=yF&eHOOV|p06{6zs)(0ydiTt^hF8_|bI2-}K3L)0` zm{;Da*$R9WLd~7S+bFCY4cVV-;T6KmVg&dm2=xjYZ`Evd^&F01E6Dylyi$&*KJ^W2 z-r^v83kRReffx}vBiIVEmlTNL@K(~ICy3y11eXihpHDfw{eZ)*x`^O#1Y1G&=Ti=^ zL2$TL7ZDteU@OS}e9Gai0UU1CMFfW<*b1^gpK^F>0Eb(35y9aIwu0=>YmRddK62gb z7P7Y`@VPvXU@OR8(iGwK%zRyh#sMowuoYx~9vp%2Q4LmJ=P1eLK!{-d!^?t|qnTR~ zQa(P0@Uj?j^!D@E69`99thu`|6;#4L_0=F-ri~sw&HRjPY?pN$ekVKIv;ymbFdY2 zF!vPUyI)v&>qAK{2SUAqmG>f8IU2G*SHx&Ixw~u1bp)4Wwmk$}A*PB0fDyT34z_~) zKgR*I*8vbNn?KCq>}8uZ{y8 z-ZFr2IS|3&>}$wg@k&=75#Y zuZ-w=6>&I%tswjJ;84Vee*Ux2Fb8wj2#%1^cs}6}Xr0{_(a+V{&;4|aGLU_CMjS5J zUNM5LAXnp6fsJciE@YmsT%K|`JIZw{<_m-f#^F}r@Oc*qmjf}j2)1IrKm>=E1rDE) zfp9qx!QlwDV!l8GhmRTH@R=G2mje+Tj$kXu{yY%D;bnotXE-2S4n%M`f~}Y@5W(SP zfy3uSAY2Yaa5#dkm@g2);bnotTOSZE2O>Be!B)%{2<1Ru^RW-I-+-fcxf}@PU<6x1 z_L2gj9IRmkMut8IBiIUZp9A^v8K*_~^YBXJU@PRu%bjqDH9qy4f%$;$bF@~>F^OC` z7y;R5YH+x$?x;)N&z+sEx?Tl`mjw>*ML@Vb;Vj5n_#x#o?-ZOPFS`RWWDE(c<45o`t7OHzbb<6|?YuON{hFBdb8 z%Vr95AlQn_Wj;mVA4RYg%5^@-l~)B;d&OwxF2?#lt3me{2w!Ca;c_5G#KHcu)zx!& zSwMTg1H$Dgha=dE`78j#nOBZLoqM^=S97#2!_gey6v5>>f=jBsLQVPV4&{2S&DS7X zpz9GvjJOOJ%_hlSUDQ9Kc9N#?2G_kg{Zvpv4pLzp2J%;tQ-y5pHIDVc1D12f)J>+ zUGE2Mb@d#MU@OS}y!PtlKRj+&j6c@jXL#|yJ|<*5_x3hLxCUN%{R81ypCVkt*#)8> zIcvWAUr!kh`o%ZZLp*m`IYwg|*Ixd^UB!3%o-oE*=lkBPcOB0Cp*;_;L>Sjt1B9>P zFMh@KhBrRUzAYb!5eU`*;cL;S-Q>E%ecs+6l!G-uc&iG5q)s31I+1u!a%uI{#Pew>+K@BM8938k`z9$MwJX zv-QQ;AOKop4I}ow)sNO+$sA&B9IU}(c)$b7^I9P-8 zE3c0~y~U;LhkUQ8j}dXOh7pGz`sMWt&*&jo1B8#FcR%_I>pwcAhhPm5-V&em`p>O@ z@JCJCRj*hBgtvD6g|5;I5VU_#AM)#jMFWJdMIZR8&#gc5COr<;0O9+Dx4hvC>rXq+ ze&fK)w;E&(5I)*H;N@Rl|M=s32-X1M>yncmdFlEAH)#+;HmEr#(Qxv89MS;ctJi1z*A?sEeno>2)VRhPw01{WFCav5&HIOG z81a+W{A&Gp<_H99&}*GzIC?Ss=Q%wN)&SwTI`rDt94`M#gU~ow!-!8GdhOwYoAv60 zH5jkF2A_KO>kbD$xrbm45Z+3z{G00yH~z;Sf;B*ROML7rcO4GegW9gdfX}$b8X&y2 z^DJSu_AlyV*Om7Ve8=4p&;GMrSN;CM8X(-O2fW~VtA77r4S$dR$G^SKs^33Y1B7Sy zp*O$ws^33YgKwO9oqztr*I4!Y2WuE{%$CKf>K~d~WS2EScuRc$U;b*d>K`S=;~H!5 z4L3*Jo0Hi`v+_IyOsy8ePOfTKUf2Vx5TGE^K+a1{=pg`ytUutT=~UC zo#OJ=tU+sc4(kQ9 zlA-!Q&oK=nes%P(Hv8)<)}Yrq$44KvSoPOetYO5be{zjge|^Ooj8|SCkGj{jSN-)B zYZ&pvy{^0Judi4Ggtw9xyy|+Z{`!hFKzK|1#tU{`_19Od0m555&l08bq~W6NUjK{7 z$^2paD9FA;y2j4O#PdLiFs`u%zisEI5x+Wn>kNW5_{|bW{PY$3%ph2U8g#@Dj=k;- zf;Eiz$osz}?akt=<6sTG;p804m;TKRf;ITgha>NA3_N5sFYp{lM#8dv_y2HdPiDg`44I`fQ*ZWKn2!4$vm035vU2g1)Uw(tI!=^20`Si^{S-)eh}C`98LYZ!6EJ0CbjC)M5ubg?t!o6l64bcH8b;jfh&^TytU(QWuHN+QYt;xT-#A#qh^u~m#rougMZIDT zc16x{!IpoSL9mA3lX&skvPOtg_>60;VZ{BP^yV1^Yxq6O-LLUyHDUw-I9S7oH$310 zH9`P}U=1Voe)(=Q2-fiTF&=*E->&tu%Nj=f zal-fCxltj&A)j%LHH^5&J$BoiAVwfq!{6uo`z!BXBgERgVhtm1bKVPUga8b|8b&<$ zfH%(|Si|4K{fj-9H6pxX4I@7E^Uus6Sc6rc_mAIv?ur=%YcSV3Vz0+uYcpr8P{0Dh-ZEGDKiMxU=8PI(~ztB7?nae*a{qemVxKKW>nh> z;Tj-(g$#tR8EXWre70=Yj1z?L*slmWg4c{(l5*f5ML^?au_x@|6v4i8OfF9muHpQE z!}B&pxCRKX45`qD%U(;<7 z-g>4SUgzz3nV)M+5w2;^6dtpo_y z@F^ZR{COZmka3qZEy7OsJ?OB%hv?;=S zPJ5Q+B~20Db6SL#6bKQlJ{-Z(auxzHdgR`t+Ox%~m54PyXuJ8#itX8=mt?jucZBz- z7U6w!itxO*r;%QgBBcD}@SelxuxJbZJP-isFR{6%JstMm9Ei~ouHh4CKC`Y7tl@KU z^a3wQ5%^~W2eRwEmgB&4_jZc#nrhFJy`(^ZMkDwB%qv-5`_>2^0eB_LYhOi-AOHuS z-0&F?j~I$5|5)2~uXqj5t9~_>@{NPfdiV^8xl8c|tbVPBcQ3r(F;nN@(;+@JV(yxQ z%i?_-@APU8J{{t7Cg!d=xGdg(@{YCU;PWItXJYO^h+yAi@v#K=wJxKi$tbD_X6L;+ z@9u+R1P7l$@mUsotBCTCdFAZv6;3Jqd5vHVzjwfID%1$p@Y@jZw&EBKXWzT?@v6PA zuV#Y^;hOfHfND0V5Uy$8JLt~_$d7AUgx97HMUm>*R+Vq z*e>o_c3soH+u&IjLmd@tWI#>%_{w+beEVJ_Si?8`{7yh1K&9W|b&mEef@-85VeSam z@VgDDCx0%s76<;P-x+mHi>Su-5im!%rhVhWYu0S-UyH-XT|W2YlfoLo{h81G_@qz~ zqx>uX+53sU9^~_6?*EFwKZ?Lxp5E7RtMBa<&s`1#KsuJpA^dqDlmq2@A8g+ctJ)P{ zf$%=qz9Hr%!B{^dyaI>!!4}~q6?@|F2-|ncyre0@`(XS2L{;bF5kBUX_rdo42`|ZP zVeSa;gDt{Knj$=l{4NH+qoD{XKRLX$^SdT!CH_1R0BN1OrhNm(`=%oB&**V@|6mSy zlL5kIAiN~AwSR3a@$B*q4G{jk zMzE&6X>vYAjPkGiCwCL{b}Z0d2b?!W;2%Y_zI(aMS0m8kJd0@IK1T67o{Et2je}P* zy!PQY9cvEW_wlZn-*X5AX!K;lJ;9lSd&sx_iWm)N=c3+zaFXUSpI@4-Bige!&lR8h zIRd}QxmX~(cAvQ%xNh?KD*le5A=oNsoaMm1tL9)0BT{ZSM%JXf9Qcm4=3q^(!j}WD zeQN}37?E=86>Cyn4tyV7ag3~C1n)&E#DX=sE5hIOp5C}?eaK(iOijwmf%k1S2WxT% zxg7ZYfEvLXMx@;4iZv-O2R_THIare?!pni*rKl0CVMNNUSFA~SIq>;@#WAvm5xqWW z{ev~=ciy{FZoNv)a$q#`)n2iN^TwI35v<|*=N3~VSi`N7+i{Ix4fjXx!8L+4Jg(&E z)BMF-`D?V2(Zx+x_$#g{F9+P7`E%tMWz5|WX=IJ&P0`B%=QDi-Ycy{Kfpd*Mf;F1A zg1`wvAHf>UTR~ve-$$@U^HvaeGonH)JaX1(MhhZkYKh2|%?6!vnGbgOXm%H@VGlVb zvv&k*I18M&8o?UQG}ldyU=7zM*ME&*4YwF>V~fQBC%t6jq>I0{Rj?zkyi?vW@EU%x zcmRgn)BEnD z^EqpB6}}u&MxB5E_O6f;A~G2Y!ovv3UN;zuNhV2Ru;`tVww}@IGO&IP3*y z?!3{nk5dF|^3-5Cqztbf^wuw3{EWYPi6U5&GUh>iSH|CUzT^X6+xpOx48fX|mjjhm_&fm!5IewwwR-N$M4AQkJz(^}UHN-e;e+$6o&+AV${Y zIm2>D862OMx_J2U`zi-(QeF;x=CD}o_P{5uz4xWR(pJKnl$QgaGc6XEJnOi%JDhOl zHu?WvtjUw2<&ZMGdMWDS^Z|f$LFLj zo_Mzh0x_~C<>gTC4Wxf;lm4L`tjTXzEr*mfju)J{ZMSD1w;})S#hN@xT@EP&A^l^k z^bh4=P0HRs{9R}19~Vpi&^WA5m?q`rz~``w#fNt}edpUhdz^BxCco{r98!i?(m!@e z|4PS!9YGXexX^SWhli>X@T$Qo{yDT9Mr`+_woW6kK_wFH8D6l+pmQ6B{28PsdJ-*FF483-O3 zSi_@4%0STQvtUiiD;lqW;1Q0;C?4%n);Mw$9a)p|ipE_ac%IX3mi{DX(a*1%hVhk>}TxS2Ujk@x@#L zEO-v*)j-NX&?Ra08<8nR+b}cQeM$o6bN3u^7=F76|HxH;1x2jae1|zG7!89XHCkhfmh_(KQ?3~ z)2!Qe(PiZ6H>Uc+tk&_uPNm-wm(6C^fw2sQDI)Up(>n zjkEspO;|0BJf5dq^DP!X{hJdv?tk~k>Zc@#DBc>1slKf@sl)HtVww}oO$sbhu1xI z|AN@>W6#;R|Ks1U2-bY#|J-5t?ZI~vtL2a~=GqT@^(hlk#%-;*t9fe|pDX1Lcr z`xV5+581l$=s(-P0GvRHQ(NI_`&Ay6~w1cxX#9DjVvAW6L+a7(ndBvKPm&56M z{oDFA|DPisDShL|FSW>7lk#%7#XCN?{+IiBu5R>%_ix+fW0qakq`VxCJMWY07oO?} z^bP4F8V74qUJn2Dz)RL&b{lUc*OR_+_KhAZ|9#~Q*4*!vA6);l3$2x;jL6?CedD4x zTT5h3%FAJ&lg?lN*$chxK2rL|#zU;NvnJ)`aL-H5S%3YS_m3M(-?-Onv_~yild_!k z-S!>p@4mhF!CxN#;I-%6@D^*oJpP}~V9h69@V50={x15q>_0+A95?vF;cMdwHZrj0 z+sD0S{pGj9_^}*P2I4&F8`rx3H+A%3&7QlzVg39+u<qbO@GKj2mC zPyPYM^W~5-5WhYB#I=9B;gOgPM%KLL&8M#0%pm6sAp`L<=^M}Z{m1GV0BcfS4oBYQ zRqL-l_xFVli2F<5c<-Kj@5Bhlnv|Er8#Z6PzV*jj#c_1CX|^Ktho2=oo6%FE$RFM7-RBmVN<1@T7d8++aA zIva?CHIF#(ZR<}P4-l*6kTN2Fzx0iFTzYdwuqNf@@H>Y{+kNSM3Wv-eYchW*f;A~G zhuc2uob|sy{JsSt^T(RZABtejrSCa^{ZH@w2kKSI@M=x^#;u-YTN`hR@W z5Gey8^T(RZABtejI}f{L{rHpbryMB*adYV#=e*-7ieSx+4*KN!v;WV5ibxp24UsYsGJkB7`9nEa^QsSh zZ~dz4Z&j~S2I8f=AGuZL4OdjRqGdT0U8LIKQ6`^3y50dR?Fe4%YU=J@9vI} z`D3TdABtd2%5p|_%(aHEe;F}>L*|d2GJhz7H7Uz%@Sa_V$Gp@LfBv}l@BIH{jRmh* zlk#%-*zIpP++j~gpl@J}1q5qSmNT+T_ZW^i3H1-JWd7KY`9l$`NqISZ>%u*UKluUL z7!c?i(nl1*nv|Erzwf-o@bCLM;#1N$9xiJvc*UBOm&13qY#AQ>$KF3~Eq&wmvc>{} zH7PHLEzg!U+>5*q%KWh*^T!6}57ylBf%^`Reuee(lo7|zrEmPLtg*nsnv|Er4L^Fj z;qiarW61}lZ+vz5rj9uHW=7yK=Kb&|W#&d}yWFTbz z*f{YZL-WLR+DPI*OR2@o{;EO`7#c}3$D5H!Lqc#KMUMPnimG>R^G986ix$YR_Df=22E zYf@g(*bW5E1`8g~Q%0Z2nW36-q!+Tr<<(HnK0K?jhG)2x;T6xEtl?QSWgvKVW)08O zDFeYP0M_toAY~wUmBAWbaik0cuVh%mtD2O7;MEdqc;%Eb5VRs2S(EaL)^I@3s&C|V zTgoe1Cj!AMOI{oDDl=suX!Sa>Cgl~acY&Z4^2lr4lvlK-27*`NypB$JMeBATXr({$ zT0P|z?G1pS-NeZIfs|LY{{Vt^EDPRq@a`pLAb3~A8r~tL3$}2j11%gg% zM?P;&c}3^DK+uUWo$uDCzlk#fd8-c~*AlU^!c+b7nE7qjEqPq!j@NGukP1L)I z+*tte(d(YL@%+}_9ZSmaif04Xy#1K(ZTcNc%0RrH zW*pYwcNu;5Ng0Tj&>ahFQkJvu*ZyWR?^r%VcPy+)c{v<-$hB7eI~LZYEZ>ND*{-X+ zWBIl8jcb)V7S^P^9RB4uH(2%WSXh(taya!L_E`1rSXlF;zuI%2CVt*XZBn99ZSkUyi)F1URCZ` zSaY3s+;Qc1EGYxQD}C17^xJn@`5jBjK*(v-nw*irtC2OoyJP>A-?5|&1npQx)@;50 zomYOxk}?pufBdGLBO|-4Nm<7Bjr~`7$09T5n#`O#fnZI_%VFaecUtxDSXh(ta`?N~ z-Eq~wV_{9o@@~l4EGZ*bwA)^= zCT027#XY3$cJEkNlk##n;nrJL{W})c+-khV%I{cGhF7w(T$4Nc4b%r~-g?oVE5Bn& z83;c8V9h_idykdhv7`)y%pcq2j$S!fbIp6+aOHO_DFeZ$IILNJ#I7s9V@VkZS?O<+ zJ9_0{&3oQ@t(D)gqznX~MzQA4fAE`4zhg-m2)<)sP0GswGeiH5g*7QJhg*N*dz<|` z7S^P^9M1dX*EjQyHXc`xH`=Wq7!SXh(tayaC<=WO=xSXh(t za`@7}$QrJD$HJPg|K8g+{f;GNw31!EaQMb+%N+}AQkHq}HgDPN-?6afP9J>zrr)uo z3=TQP*^oPW9YtBQWslP~{f;GNAU-91<8ZlSk^i5;n%}@h7_ubnir6dGu!kuF!I86uvyd_nl--dvoavN- z;5!!9aBZdx1htX{Yf@ef++ylG7S?d9Oc@+}$HJPFSJXd%;5!!X6DhB#4+25GcESBF z4QeM$`1q9!*@EDcyipE4BXcS%WIGFN^#$6!zj)lkC zlvgyi1HpGJJf5e#qWJ>|nsF99XQaFuc=oAhHP-M9mohkb=41`eqA3HxvomXWrcN0M zUIDO%R|6>n!K)0`@QNd4Ab2Ii8eY|;3gM;r_Sd;RK*1JIP9Sg5ACSi?Kkl!4%#Fl%^MoH7u!+a6hyvb=R4`*R@pj)gTT%jtQX0RTa# z1|w@yUJZPLP~WkzhEFL{1_$4P4&DX-{!7YM#% z;WOQoS9FF91f4oB_}n<<6`fN9!6(~%Hl6Z{&ccD9({nltuTRYRBz>{q6MEM0X?@Dz zpj&_iYf@efd?Qfbv9KoP72QpMgKsnPZlc~z=I=44*mjkl~KMl;Aed|FR|Mn;Q=n2b1zI)K{-iLom;|N(e zzW@CP4i7q0o@*R)2(}7YIX>}`BR78ku~%xYIKq&nT;^LW9Px>dT(%{wq%5`yd7eYc zP4tC{KJ!A!ZkK~S5v$;skGw%-7Rpinp7o4Av zrQD1h9NkvTo;mV!g|L~F8&kuO<{f8?rwSFG5M7zg@ zYs39-@afXe=MZcavi8AGK6RgscVGS><%rfNnvjKq`Q%-L83bE}tQ_As|Kk_GO2$RW z^Z33C4ji6xNAXuQAq&S_-h5vfD?JWEEW%0{c?=P9Y_$d!~EF)7C!f~`WH=a903M0S;94#8F-D@V6SHIZkJ zLVe63*eYbr6^#ruUQyo`Phyl%uLwco6^|c;nCFnP(vzLZp}FdEuqR?wd)19x5K(J_ zV7{4LHC_cmp3fkp+~7EKBRNE#M`XE#Xd|ckAm63jj2s-@TvhoYgmQFSqG+<8Z)Drm zIOY)9UJ0Qb-5w5YCfcrel`Rn*a|pHy zSvk5rN;F|59GthAJ}3yb3fVZy@0SX8Oy6zKx%lnJWe-SWm$pPP)EyCe6cA=r@93i> zU5oY+RIaS_xFnPu9O~6aKk*UWjl#-gL%W9+LcL;yTm5f1tXxA|Z5mofxb%uR*b_$R z89+C?Ho|$inX4WL`)=ocJU$W!Qb6^=Es^;egl6|ezw!6NFnK z4wLniv&q%xKXr!e&#j)BPoKA~ggDF-MjL|S7{xzASW9Gt$5h3!fWKyC`Ejdw-nMq) zujSweYtc23V5N7?7vCD^B`QlDU?ubE ztK_-X#~gyKLe{g4vg!keH@$_;MiAcWLMBG@Wq<#^=L`)oY(TMtqWtlPHi zd%DIEvXqOF`jbb=bLAk!BCMn=whCD}#>21N`OA+SsT>?($Wm^Uq#Ta;HfRiySZw-3WRb{OU$+_5oW8jb2#fa@QM)Gb_J2`l@OY% zZjWjZ5tDi~hhVFa=Q*UT@JjNNi20GhPStEQAjEvGL=(9Z4(6N5RpV74l%uTrwqd-& zdhp2iSw9b1qQy$)JG;ufqLDj7*6nA8mGm{X3R(MLS@r3dm@Tdz8KNZRm_x8t$jVVx zeOnO+)@?t18sY&%^3$X=Ny8qLROBlPSjj+gdqz@aBCcM2(}7&oiLNm3FC0!0dWVwWp=QELuCUPa^My`~jo2$mF zKqyDIB}#B@)Kyy zRhOeGmk{bzH*(QLuB2S%o5@wryJD*kIs>RjANGV1RpfPjkne(sT=8yu zTU{TVA41G?RG!#w(#Bn^Mf>%^eq*zOxQZX&KWdUx=WoyL>-7#$jZ^}Q4%5N zCwmm?V-CSqA#1L>BZFwdN<4{CLcN+puvN(O98y+rNaTq?eRMh46Go_4-N;1~xe^5P z&E%@_DiHG=Qf_dR^AejMabD8(ialY3JfDfYK}4p`5=E2!+|IA8pVQe= z)6coR5<)q=N7enjMsVI{`k<7>Rv{|~tzK!pis|B@LeP4bR(ev;v4+#O z+h4ubh**niE15&ERmk%kl_z#uZ!1}}k}iiJvRp!_R}^{XN;Hux$!JCn4nkzE8m|JO z9KK_bI?p|hL>OL)Rqj|&AC9Q@oPuDhkTqAd^P>G=jmUNk4noj=u%6WdG0(xiORf@u zTy;4F!B!#9=Snn@E8)n?AbWm3=f<#KE30qVX#0T>3$JLM^7PkC|NY_*gi`QiFt`ax1qU;({-Z31s^9P&uyoqB>s|zZtL^L&s{$U(a&y0@ex?`d2l2_VF0-cD) zD?(^X3`FuZk&{;!kypgmwszvs>=q8K50l#(Bm|W!^^snccI7o#A=oOj+qT5C;#%8T z)s5u#SI4i(`_y`tAuGrgotKzwyUA6a`^+I^y%Sa;`cyKOjfoY)Hjz+mU3mJUgbIU9D=PvRt{MwuF3n<$koUZ zhAbSxt#LS_+-+Naq%5`yd7eYc3J%*9m-ukb(B)uH7@=NuBX1BHc{$6NW>*kw74kes z<%zCpN`0UYcD)irmP-hEo{`t}q31rOCF)+i)IT`7xoW)1`T$3_B}#HycKhtXk!B!#9bFl9+swG0l#O}yIo-jg6n#q-DB3FWlm~<5FX1DPw z5XvE|zHNS2B3s&A{jPmS>k?|7}~e$ZqoH)l1>oP@xQVj$QmWaW@`;x>7oTE|3=Fl6C~ zk~EGv1Y3nX&mm<6htygk&`P=->b#4%c;L>RJIWlMxtgvhol2(}7YbLBk>ZI?A6 zb4==$BdR_qWkuwSnCD>MB|m}ITy;6BatWbcQRJB`(L}DK+=xjz2$8vJyb8oThm;i@ zvg%7jIRo&~Cpp*?MyOXFd0ijmyC5Q0B1^TEQM9fP&JQ8xIVw+dH(ADAtVO#V?1}9^ z4WV99cBww}WTLDSbgy2UQ%W| zoR@UHVo&UZrOcveB@{W;2l+0DjJ%x5`0Pye!TBMCa91rc+pcJ`pX>QmS+A6{rA|Mm z7A{^z+f@$lQFTAB5m7gSp6P>97F&g^9NiU}w76KqNv-9I3^h21V5^X|?e^EZv^Eru zSc_^anM1Hu$nzZRyF{A^)L@r`Jz<1;)s0*p`qeK%{!Vz_&HDY-slo-q#$Aa4YtbREP_ne*T=Dow91ViXt@s**diA=Wd@QnSvhiKL2-=m4;+(nWe1VZ384X{SC&zZ ze8K?)aaeZED?=NCTFF==I1c6`1OUWg2=mJLEW7^`!mSXW*G;VYHo$=uBz^zfsjqnoS7tME`c%BpWC#uBXb==Xh0mT0k($=@k*M0s~G5Ns8)_QA61 z)6pkdpJ+lBj^Nhp&LP+;WaTKUKK(5utlQ}KmQ0p%VI-w{pxO*ec|C4k;@*q}CFF{?X-NPZ*(Ibt7*O896xS5Ns9lJV)gT&D7dya(lnA5kidD8mcr}M$tB^HU-lHUVgeQeytTGYL&IM@@}*VJD1vuh_4 zwob6!z2-`HMRSO#1F;HOBk%SoiI6?X9)(=ZA=oNp%~f|~5KUN#CoxK>S91uq3VEJG z$_fsNJQ1jmE(d$U2=%HPxo9F+f?&RxTs2+=VxB|F4UTeNV)G-;OS)dMCybEiGm$rl z$d#U#baN#LwhCD}x-C&O+0X4X%KAB-Ej9g|+bbcI!+TWS&uawdZKe-OS!@-ua?py5 z*1MR=eBWkwA-3K{{~!ddcWI?3^&D$BZM)r-rD(!R5V^7h#~gyKLZ0WSJh9Vy+p(gR zbUD})$xm>|^D6Spm1rVYf{2*f>}IYSuL7YQ-5rZW$e!em1zyb|*eYbrRd?qlny?a2 zvK@nC4#8F-&vQt*!6Erc1nQ&9!JaT;K3AfNTnU2tW^&bd6^MBbDK|J|{73})dA~l$ z6Gli$Gm*3Jf{0w{c-767AlNEo<)B`hZC5nWcBR~GiHL&`*>(lNRv{}#w?{Py&f82M z6a-s^tQ;~HVmQPonsLa=OWydkb0%qh5tFt=1(aWPNUM5Bp9nj%)c2`%q)r5tTk$mr zyt!OF(f6stD=x`=DskWq>_D(p%JUrhK6OFs+tDGP_b4|?ns9`bl*Lvdw;Xs6xo}*FH;LE%_der!%Q2?aj*LTEVj|iaOa$de z5c#~#Zp0z%Aqyho(0#3@*Xlg11i@AzdmNEn)`ZM)h-~%ett70ZtcaEo^BnBEw7x)l zOB5oDBRHyZ3E^Hv91*!_LY8u)qzOk@HC_c`o`bChMPtq<}^ z_vw{Gc6a`(@;FrsO~`_fy;}JN{`NQfSrf7#WVda<<*yvFuZ>^eXHCe0kbSLW9l!Fg z9HoVzt*|EKg0SEB>LFYM1pii;{We(-;TjGR)MxFdFRf5n~J`XYdy-odtklRzHb1I($Cc^^ihVWq7- z5mGnh4O4hkc933!p$RMDkoqrgM*~6caxPdCvLLWO&z8vVILFYMguf33+1``tAzYJIcB=ZWfB*X#uUwM|9otuD{N9c! z0&`SoAWz?VA+JXC_q5V+w?f!kHiQ5`5v~E+-uJQW=FG`w$YEt;dmvCZda`ZxVc!hf z2@ckTTw00UvA`=j5zZT4DGRMctptHKW;Z54@HsVWLKXztvE8=-L1#<)2DWR$N)YHP zz9y=hh*QpB2&1%W&#r%|j4Sr8awY#$ATePX>Eny?Z?o(n`nnVx?pIX4k7x#`e%8TF3Ts9?*IvV|!?LKag^ZU`?#NCGwEV z$beWZSF8zH5V@XjIC8HhWrda1$Iy*jdX%s9mxSQ66Z{=4``A7z%H2{U!b5ppBUlr% zoWo>BS_ErSz5sJ=$$CMIC08SBxCXOk8xG9prOuaF0hCt4CxtB{t(MeY^_Le4x8~Yg&Y@I2wd{}w^c!360zoTe`j)Bn zDBF2iueJRZ5WEUUe|AmC!ht?-J1-#0Sb`NYeKTyCR@&Ojs$X+e#`b1!VB?kUIRqi2 zcG*pUgAuGrnSU>(MaXzw_Bcz-07cfZJ)SGWC?TjU4SvaKr z%Pt%U+R@W5f9cq6R)Ub0Sk3@|pi=`qRr59)R)Ub$UQQE$kp6*FHT8-$AqztKO*zW| zLi!+1)qLj_ny?at^xASN0)&k1_)D0+^9oH^2}1gOIe7s>#uA*W`OYgeVI>F|SEN3$ z^HPpHRl|4{nve^^PLLV|#>Dd5>N;K(Sx3=wO4T5g!%n#jVX`6YjI2Q@hikxR=Wuqa zW~XgEgliIE9ENTX>XmC+gq;*N2=&S}K-kX9vg`9>)Q7%X8&;C{kV_5P&PzFZfBjSt zs6l@-7xiyDFCa?0(!CmMLKY6RG23|oQQGbXMithCEC{q?+g|}er_Oq+=9;h)1p12Y zynx`7ZPtV=2=rRpc>z)Sxq8K#kOhH0Z#yp_%BdO<7~4Y=vLGrq6vM~NnU7eq#0-rkA3BG!Z~2==zB51h%^m?0b? z3nJ=9z2Z7&O~`@>4;4{noO*;4O|&sVM5|PUG{9*~)cZkiiFyuKMpW%ly)jYBigJY` zVqy;MjBN|&QQO9Rdxyo&7`%VD2I%QrVs9t(5azp~?e@g@>}Ir%+^l#eGlV_wA$Ydr zS=46dCJvpW%*r@;7WI;1WKaRodRdTZ$5K`X4Tp{;wwkcW4Po_fB~ctvAI5G7zZnCc zds}&>ad=tjq2;>4MH5zK^zj?ass?laA&6{=_3dKSN^<`ph^%uPceTZ+S7pXQ z4N4#MHmWDh)?US{Xvc~WOBidN2SUc(Y`f@>SyJ7jxU7(cBVw9xWV!V|Gk2CYmZVp# z>F-$SJu;0v5gf;=ib=zc$P>Z)<@(OELeL##y^H7Fy&}evT|)3}XuZ3yIOw-Ob^KWQ zh$Ho3vcE?ru&BYJ(ON4AJw1=-6$g2>v$~_rGlwR-1ut=$~Tm=Ut{ zbLo$9GF6{=u_k0eNUxPR>{mn)heka@Vhvib4~zjaLz$_>{j?m^Zvqmh_1@nUWrCCtk`yXJiZ3ge)BFZFPPnk^Akm z?rTat*JoMUYvVTorKj3in6QT|9O0pQ)jd^{{v1{|mXwk(igr)c1d$vVcimecDDpfV z6huTT9FYYbODMY-6H6BBJM-{R5mbYD$|;&`i8{8Ink})j4Q*Kl#mp4?^Cr=xVu!Kd;%I~Q~h!6*NGBj9%kDA~qC2w*oW@qbGylspLnjh zqFXZU=Xz2k2=pR9H9~Lpef!KEy&%G>j8`6?u6OY(&3;}|-Y>8j$Ir#kgY6q`h@;E~ z8aZo1F5|9y8*`NJYdbB&W;H*PlQi|-nUFZpYyEr=z1H4_(CiW-H8x&Z95$912gZ^z z`lwe?ZW$Sj!&-^A$~y9>13`o=V@YH|$C5INBD;A9DVne7}niQsS4=z2F|n&Z&*ZsDlk1E~=7 zCOLmArGB?T5o3uX5i$bE+OWKlz~6`{V@V*=ir*>G6>^|!uM(lF*J8CIz9v_rtj`BK z`K{mb=8`H7`UX$^PDzwh>bySp@xCS_b@f)Uo%`4uDK&!6efUhqPeR~TATZ;UGa2pM zMb^1wpf!Vr5_<#D;4j7UJEHXtDI#Bk#JeKCT}+wYtN{YqE$hz}-G*9^a&DAd&z$Zr zW;I)v*qmr`$(4EpEUau@GM&$T7OgmF=CpB;XHl;wAn<8tHGb!+?pIeP9cZ%6p z)T`208U!LQJ=JdFCifpDj=B%}*(A{3Q&TQ+h({K=)LOZ{=QDs6?YxUuh#DWQkLl{w z+Oe->&D85WTL!m8vVCjpGX9$m9QH`dTp8>>HlN`w;S;wtVfT_HnJ|HAFwb53TVXhP;WV>ffe=29g5 zDMRF%HIPWJ{}%_V3wyA32}Td*1cgYki-!o_W~& zoHO{!c?)?7tLCyD&YoEMtDiBev3@0^4=(q^EeEIXFxd&!d}I9!CU)5GASWsr#1=Qr z7#wxq>L3c$RPtDV!RD7u{BqWTWmM-azsBGnC(Ljks;T6${=crgYGRvX4q!e`pFFtm zD_c6Dn(Mb8n^@_Z{XMEmMpT=;xX|FP?LOs%YQA{I_{2&t?&m}$`{;AoedC|*?(KwX ziXYuRasTc?R5FNL=3hB}!?amWsAl~y+%++8!M^UJl0mHg&%?)$-}MM5R8z@zB7DUI z6HlK58pLMDOdg-U^5>mUO(l=@@7aC9#5#MBIOm$JZaV&|W1UbKH_E&G3?-+20~pR&LEE>O*}znDC{`5V!$DjCFj);B)+!)S@B*>Tp2!`ZXZUdQ^C z3}TM;jWuqH)~=dL9_yd}$+rzp*^~X_ChHq_FTaM@plT|4tbgLlD-XXj3;hv3F0sC` z?CF!c_J4|MHr{E~;fY_2eqPBSer|nZ>lb5WP)#M04eKLLR8}?Ow6%xdTEMZru)guO>$bvd&{%}o?BdV6k4gq{r1g!L zZvMUdP)#L|^*^`r>cbWPaZKss-_|#7J#V1_@}ZiWk6m^6=xYo2QOWSJh4qb1cbGh| z|8rC`Tx#Xv244@Nl0kH=Z~WrE)!m0`DtWAb@kwtRF1Gw}WmHdF-?;pQ8BVCClE?a! zw_R~~`9XySMvL&AbmUIb7%>SdH~789wG)-?(ntEGJa+++&LkzxY59l?>v=XAhrw z;;u(Hp_;3H|C-@*3(s~Rl?>vO);Fw=IH8(K9_w%Y+)ESpOa%>Mz00?namrQ4f+$o| z$uWOCw~|mQV}bRJm2Hh>L`O9rdCyNLmcBGfx02z*=8tik zKir3EDtWB`{jZKs+`0{Y{L%Wx<6n(dqMAw`>#sf-n^^KCwnUph1~z|qRH`}X$g3va z^}o>)D;ZJQ{4uck!=qA7C6D!A_npfoR-Z~AKefJbhpn+tR;sDwvHn}%c)`S*zlQz@ zA2x3cZ2lNv{!q=F3(uZd>kZLsD;b2%9|M~|+=pr^d8|L@wP#E`^fbqkJ*{uN$<|n? z57itvrcP_?x5TCcc@rCQR^4UN&x;LogI#FrRi?|n= zD?YGek*GSAk315MFwePav=k~CKBROD)o4jqG6<=`LN!{Ol?*~!iPU-CGPK3yEm1Yv zDk~X2q_uZcQ^`Z=A0VVhb+k`Z^02SH%U6A=*Q!Q)a3#Zsj0_#sRPs>95)d-_baecv z_H~BKXHM1VELzF%p|i7Ubf&Ik5V`_TjjjeN8HB7dI;yGUp{z?l=t@S{ zBD$)nWDvSqQcWcfWqk!gS7f@Ts^no`S7-UEPc^y%tYrAmm8EKQm08IkWc6C8rjmz! zUCHJvWYy?uxsu^SSK+Fu}TuB-k^h7UW9O1lZw=+2^&LCB7!P)#M( zg=#8!*w>SgPDf8zRHLUYl?)$pic_ejl5LKXGa#Qo(n*nO^wg-5;X_ZORD;=oXI7OA zLQcHwe3w@FDVLsp<)><@sbqV;B%Q;-hn(CMs;T5*Ur+J!(?QkfNns_!M@LQ|Rimeo zl?*~pIaQ-4o|Oz@c{xc{jh?DjG6*@XEmTv{-s5OR9nQB5Te<-8q)p3v(VdnFI$Odo{a1<-T+N*?z0jzFh#yzPSD zYp1DJ`*Po4Oss}-ZvsB#ZbqlNH<9lqs+|Rhf2?xs;IXe=I%D2i`~0ZV=sl0zU$)07 zs{O|>+ofnq7W?tXbl*Ss{_>1$v00P=D_Wir>?o?CBWBtcheC_au7m!$G@r}F7thbWy zwpH`d|5k}d^(z^BwLc#+t-IyBH*`WZl|0t}#Z#{yuCVfBWmJdFetzaD8|>^m zVbxUfSpU|Kc80J07>SP^K4<2V2OjJ`RP+2k&rf{$5Lk`%D;ZI3bpAav_WR#soKQ_A z$7t6n=wtr%_usVD@lN=dNDaovkZslfn{C$IYY_@#G6RI1rz>Z22X`9wrj z$sq38@9*QwKfR0RTs4(E)<5<)^C#|Kl~Fyh?n;Br7T?(Op_)@ydtlf+OfOmiQqsbu>M)(-bhta~Zz{B;}dJoxT$&-;#EHI;1lybk!?#5o@(@#6yy9;|lc zoN@cVqH4CmIcBLN%3)`nbzVnyvl)Ru{+LbpH$xs;T6$ z{=WOqo7nhGBu=xs*yPn;pK1RuP|XLrznfV42akGGm5iwNv%2`kzJJG9QmCeqt+l`P z-ib|i0}bK>Ru?a<8=v7-&GCP`f8vJa!bc^8m}hmd^Sd|fnvafZDtWAb>gVQ9JpB7d zN*~rg#;t!ip_)pzlkM+6GV!k~Nm&0FxBlUTYTotC6BCD=0;{opB_pam&cEj->mN?2 zrjpq|=;O!N-#^3phZE5!LQ~0O{p(JCe&SE=4?e7a%(VUiqEOAODV^b)z7zAbe=A)qbZvxROE0$WW-Jl7}*ufRNFr(D9>^hkYH1@)1roI@(n-e8?!; zQB5Te`#Pd_IyzFTMn~;Rh7XwyI;yGUq0Ap3WX7>GGR`ddETglJ)w#@Ss?iy)lHo&U z&W>s-*`Ab5b1ev&oja*frkY9~%H9AzbT?7$4f5Hb8nr?EZ0n=D z_bju<_-8+O`j0A&?m5OJD$F>~?tDo1;*-zCYN?~+c_rumV8>T6`1uMO4?ld>AABt` zfBTPT@|P}n*sr^F5loYy6;h(i^zpwK-0}6w#l)L6bQwrO7w>~K4u5>F=zz15xD$B-cgtn{8E?Om(o2PEpkq>BY zIW5ljK&Z@=5&>wSY1QeBaI8+~dIvK7jrO5d>aR>bKrbuSftC;Cd++^I)oY93qI8v@ z6-u3Q?nBen8ibq?$w!@_RU@j>QM3|9rL7M#X*W(jG!nIHM3sDKx@hh62f5uxouHNa zOHo;5wj%rc>r+cax@;K@AHbYY4P-{u7!%DJuY62|6@94hu#NX-RLn=iM~US=v`1-A zbK`QI^{BX{}-d^r0Ja@_GIou9oyift6Fojx=rC*Z>gO-uU+ zWTun|K)&lF{RpYU(X9^MR<`2dt>koI`HZAfR$=kNT+lV@hV2Ue?+_^4oNN zb;D^7XL9=qOP!zcI#4^1g-<2`DS zQE6@)MA1fQRHwh`))b-Jg0MducSUp5yz7${WY(q=<(suc(ZC0-T669`R8#jyy6J-@ zss!Y8N&&>u$19>zf>wx@a+vzN5r~TC7m#Un-nBnZav}=&P>n{S5k~6tp&IyLgz7u@ zp_;ls(oG+2v4iGLKlv~r>Rbt0AzI2!AJk~Nkh!~W`cQ&a@IiSrp;oBDj3`5kI%hsW zs7&7}9|ce&~$a&h1~9=PS8sIz; zriFB0mIxnKinLPVWumGP$)8=PoJWP$Kp&8KM&>=OJjF|dM}^$dN(oKLi6XctT_xyG z%Pnk4_=r<__dX~x&;8uC7)8(uDNznvdp9c9yVR%;jG~M-5rBLpLyeDDWmJ%vk`tCb zUQL2lC|$~78}H>PTBfU|(8xzIieS2ps7gm%>Bm_{%paAUwUXom<-@ZK5VXQ|%4PEY zkMm%pt8{}%K9EEDP%B(-_kkReP`W`RA9aH1;yUF#AE+t%P`W`RA9aH1;yPvbkqGo0 zo@PSk_<{aGIgd(vj`llEDG}zUIl{3Iwi1TM>XlYlf2z!A-G`-*SCgRC%ln`ee5jn| zyl@w#k2Wj#$cO-p@O5-~_KG^7mDZCRCm*WOT7!?Q27wtBIj2S=QQt6zHD1lA*v49Y zIH9dUeKd#y9^j)+FhX3X9JcYE=R5?zz5~9wRfW;Drz*6(fLq~ z`fK$8H-2is9O`HgqlDxGp?OrAE@aZ9`?;p2bc28od&RiRbafPsF}N)%^`ZID@i7wj zck`iXDcv9fFhZ@AhRk}(ebfnB;X36q`2c<91xikL~g6ZNqgvAbc3*nqLtk6i6>GdC?EQ0lobejDBuIF zfjbjzSDPMpZi>)TH|xj;G~6$NP?;$u0?GWh_# ztXKzHK9G4zk^9hEQ!8B0h|-aba8l=5gOD?#2&75SO8u3|`@d)<%!jr<$fU!RJ~R@w zYD85!%6k-AJN-d!_o0!fmHJCj6{z#mfB*B;5<#$KC|w3rwnWuHW>k$a(bC5&9}{6k zAL=`7R^?5{`k;Qq-t4+T2H-U?jLsxlBGl_d$)Ot9ferP=fh@56U^AX+h>$7TOr)JSrtn z2TT`oMijwCD`~S*f4L8g06Y;yPgS|yN1dP*u2Xg&DJmt@3L{)bl%d7Qz(`O&DrZFU zff1n13fD6t`Ow@d-5`>WI>B^topPDH|BF$SCoJxxJPCo!bB!DCnb3(5ewt=_pnJ%!k(|Pjsx#N#{|im6uydH1d(6suN5X*D2>d(5e{~`h?2d z-8+$d)CpSQI_2DlmZ;LB35)lo7xR zjJx%8nJ1Jq<>bQ&XqcAz(3BEkLb?AapNFf{jMjfa`-oL|_)xk* zBp-Ex>Eb%&G7J7Mb}Z~U*iESX$_QFv|3NwVu*jlEvAv?T(+3F35stk(p=oLVfXtK< z0mye=Osh_3gkvDI6tzC0Hrq~$qI5%}C8{aqQE6IAH;5FKw(4ddY>P^LXg)NhJgVq- zk(Sa8B1NTEN<(g(6dA?6TKG^aq?8fKhnA1}YY;^su>#=vm0BUCh7Y4SUR6=Cy^bEQ zR8wz>nGZzeK43+S=3L9oY||@`s_u^|C36$(smXO0>+>Y-iLbpXlN%>Rtpu%*66M^7 zri&7#KgbzT1ZSVZmPphJ*BgXUc9Qzlf7_TCPqe{GJQi4{9mU5W-yAgz8s6onMOCqaVBbX=9DJ3EWTM5&u(+$GN zXeBIn?RSvbdfbJjk5`kRmDX(7#=EV3WCYNW0WxW~Ek+TvYD5))MWyNLs0NvI?xRl7 zsu5N4q3PB8qfXGO5moYm9P+#bk*J)VWfXx#>9$!RrHn{EP*Wt-UxP?K>IBop zb;_PR2>XjUiW=lrW%_oae2W^S287C_-PqE{t4YubfZ%^zmvEv_eXh!_?o6(9r-gt>BMx z*pkplKyZ}MloC-ODov|Sr?Cr&S>qK^ac6>bxfTUYIc(!Sd~lBgLS?3uh=NfuEu{Oh zgrQNov{IrGm8FkYlb}D;2j#GZIS8~k`hd(cGVf{SnOq_Oc@5G^i7X``1>V{S`qOd? z+juW~RO#LOpvc)-UoncH75X6MH4@Uaz+%R2wF9wDjjj9Up}km>-I{{T1oPO^5J<2%7<3CPPt6p|8X9S zbd_!p$p>;vA8Li`?LLr05=u9Sp8U^oKhlUewrg3`(Wmqg#FJ)2CP3xK+b$v`gk>oWTp8FVO=FPBri<&8%jEr^&9z7G)8Fl% z_xX3o%=*qAnSAYg9%%WdsX9R`T&JA-IBJXiQ@Tnwh$1-a=QV=q;yUHrho*&m&Dn7-G9!${18EYpLQ0g&#3%zkwpH4C?dA9f0T8gR_ZTBWmJp|%!iLYB@LNnmSIXm}Pxns$hAhb41a3G@>woHwJ=%#Bm0I1t-Jbm` z9=pN`&6E28VSmLSvwHPD{i_!GlM{`cI|gEwSbgj8efw{Ic9|~n(Wnpjuvalqt0%AC zzyH6R&1fgw9E4hpU3g&st@HN&FN9h>u)$~gSMK+vcA`K?@S#=@o-?ce<)2*a#EFj| z+&|)odj`l80)llAYPHE$2lxN5@2~$0p;n9EeK6ANA>CFVaAWPNvVy$sUsmdq_{q(4 zoi@XWDiO2_;><+c^_x$)+(v{|5R3c122o9!a_dMUtU$cw!>1(Tq4`_1?26P1^3|K% zk%%LX`1S~bRv_-a^w){_$p*j5iGpQCD-ciodfsRvl@+Z(*sq)<;;!G^o%=`xtx%gE zzp)}7+BJTMA}?LFLW}v!5%(q^?SxvPRc`&emmxgoYK4}+?Yn>PKF|lbTS`$mp;qW! z2b}od2(>~Fo;2@e2y+(woK_emUU+ltqg$hLLai_oEwfz^7=7CFp;j2}&O5caSI={< zRv1y=d_xczcQYTr3gknrFlsOO%Lu}(gHS8X44uyXULU@GsGl0R54BqS?z?&MLHyBYnew+Ms_*Nw^zkAQRzbx4 zVPnjYvrpK@yFIyVV|b_dOB!+h_Eh{r9`-wpJEH}BfS?s*j!{@MaG#ibB!X5TIC5Hq z*79R~Y!b8r!SNgf$KxhJD-dJfzuof$g0qAZ77<>N4_bk^V&!2w5kN`M3dA{Q|L_$M zv;uL`Yroe{6yYSIq7?|veT{r%QPB#-r~iCO^1*r6jWZv#0f_|S)5HJY%T1VJkh+i(A{uO?AeS(=2(CXHL;xj0D-aLO|AzR8 zRc&c(4(NkcAg;Ll z=R>WYK4qmL39Oddqf#rYgG98h8Hy;Y#cV#0UyoRD`eJ?lF0$VfE`L=5*+3rfDh6tG z({oQ=1)lb)4xX<5^9!;p#NA7)f zKYp8ftdIMg4Ic≈k|<)9LfKuyMDqolvW9eed~R{KocJA9pP?0@-jMYPI;?&-C~U z-K_*5TlG~|(^h!0$KMUd=RX=goKUN;Jn%>_evf>t-ykd^yo!NZ&AxPgFMjjf&YA3! z7VSRN>WDW#(Bp5c?Y85GXhcBANxmGJ$1(OJ^pSu zdQ>~1R{ecC{rEj{I~TQn-cG31W(zOWkKa6xv80_)t6yxkaG$@ij?pJ0QqI+CuXSGA zkKb;OF)^#blykNE+a-(k`CIWA6Egxnj4B3dwf&bD>&I`<$4H&EUHGt9F;J@$AFpPH z#%vIP*9T4wZufZ`E&q`lf8jEE6rX@{<06n^pjK%4hyQC{BC>ff0P~?%X!$3-=l4#a zwevZ`(%AnM1GPfSKl4Wq{ue^6(DHwL>O)STwYU3FE42K35B!r87)9F&wL;6kvj3

    m8slOYcR#-V5 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 HoheN8= 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ℑ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 W6CZc(CLnwyf-2>Y%O;Ko@&5sZr;qRe literal 0 HcmV?d00001 diff --git a/hardware/pcb/3D-print/front-lfo2.stl b/hardware/pcb/3D-print/front-lfo2.stl new file mode 100644 index 0000000000000000000000000000000000000000..52aa303b5d9e893668676fd8d7d9665554024624 GIT binary patch literal 1317584 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

    &oQ&p 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 z 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

    Y4rS$Peqf5W?ld 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

    =2czVAEf94w@QAl$P#~3H@kp%Mv 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

    8%{1uj@X#K38O6Pji2|+3L`1EPmW~?%%zlj+ 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%0AN_=Jr`E8=!AVRu#@eWfzF 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